Skip to content

Commit

Permalink
Moved mod-stm here
Browse files Browse the repository at this point in the history
  • Loading branch information
nmcl committed Dec 25, 2015
1 parent c2ca21a commit 7d88eb4
Show file tree
Hide file tree
Showing 14 changed files with 975 additions and 0 deletions.
36 changes: 36 additions & 0 deletions vertx/module/README.md
@@ -0,0 +1,36 @@
# Vert.x STM Module

A module that exposes the Narayana STM implementation for Vert.x applications.

Documentation is a bit light at the moment, but the following links provide some background.

http://jbossts.blogspot.co.uk/2011/06/stm-arjuna.html

http://jbossts.blogspot.co.uk/2012/02/optimistic-stm.html

http://jbossts.blogspot.co.uk/2012/03/update-to-stm-api.html

http://jbossts.blogspot.co.uk/2013/03/stm-vertx-and-pi-part-1.html

In a nutshell:

(i) create an interface that defines the type(s) of your STM implementations. Annotate this using
@Transactional You can also use the @Optimistic annotation to choose to have optimistic concurrency
control for instances of the classes derived from the interface. (Default value is @Pessimistic).

(ii) instrument the interface methods with @WriteLock or @ReadLock. (Default value is @WriteLock).

(iii) define class(es) derives from the interface. Use the @NotState to select variables which are not
to be serialised as part of the transactional updates. (Default is to serialise everything). You can use
the @State annotation to make it explicit.

(iv) create a Container that can manage instances of the interface defined in step (i). This is your
"transactional memory pool". Create instances of the classes from step (iii) and pass them to the Container.

(v) manipulate the objects returned from the Container in step (iv) within the scope of AtomicActions.

Note, this is NOT distributed transactions. No transaction context will flow between address spaces.
No interposition will occur if you manage to serialise and distribute a transaction context. Distributed
transactions could be added, but since 2PC is a blocking protocol it doesn't necessarily fit naturally
with Vert.x. Perhaps something based on forward compensations, which are not blocking. However, that then
introduces a trade-off between consistency and performance. Definitely a TODO.
340 changes: 340 additions & 0 deletions vertx/module/pom.xml
@@ -0,0 +1,340 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.jboss</groupId>
<artifactId>mod-stm</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Project - mod-stm</name>
<url>http://maven.apache.org</url>

<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>7</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<!-- Set pullInDeps to true if you want any modules specified in the 'includes' and 'deploys' fields
in your mod.json to be automatically pulled in during packaging and added inside your module. Doing this means your
module won't download and install those dependencies at run-time when they're first requested. -->
<vertx.pullInDeps>false</vertx.pullInDeps>

<!-- Set createFatJar to true if you want to create a fat executable jar which contains the Vert.x binaries
along with the module so it can be run with java -jar <jarname> -->
<vertx.createFatJar>false</vertx.createFatJar>

<!--Vertx module name-->
<module.name>${project.groupId}~${project.artifactId}~${project.version}</module.name>

<!-- The directory where the module will be assembled - you can override this on the command line
with -Dmods.directory=mydir -->
<mods.directory>target/mods</mods.directory>

<!--Dependency versions-->
<vertx.version>2.1M3</vertx.version>
<vertx.testtools.version>2.0.3-final</vertx.testtools.version>
<junit.version>4.11</junit.version>

<!--Plugin versions-->
<maven.compiler.plugin.version>3.0</maven.compiler.plugin.version>
<maven.resources.plugin.version>2.6</maven.resources.plugin.version>
<maven.clean.plugin.version>2.5</maven.clean.plugin.version>
<maven.vertx.plugin.version>2.0.3-final</maven.vertx.plugin.version>
<maven.surefire.plugin.version>2.14</maven.surefire.plugin.version>
<maven.failsafe.plugin.version>2.14</maven.failsafe.plugin.version>
<maven.surefire.report.plugin.version>2.14</maven.surefire.report.plugin.version>
<maven.javadoc.plugin.version>2.9</maven.javadoc.plugin.version>
<maven.dependency.plugin.version>2.7</maven.dependency.plugin.version>
</properties>

<repositories>
<repository>
<id>sonatype-nexus-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
</repositories>

<dependencies>
<!--Vertx provided dependencies-->
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>${vertx.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-platform</artifactId>
<version>${vertx.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-hazelcast</artifactId>
<version>${vertx.version}</version>
<scope>provided</scope>
</dependency>
<!--Test dependencies-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>testtools</artifactId>
<version>${vertx.testtools.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.jboss.narayana.arjunacore</groupId>
<artifactId>arjunacore</artifactId>
<version>5.0.1.Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jboss.narayana.arjunacore</groupId>
<artifactId>txoj</artifactId>
<version>5.0.1.Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.1.4.GA</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jboss.narayana.stm</groupId>
<artifactId>stm</artifactId>
<version>5.0.1.Final</version>
<scope>compile</scope>
</dependency>

<!-- Add any other dependencies that you want packaged into your module (in the lib dir) here
as 'compile' dependencies. Here is an example
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>compile</scope>
</dependency>
-->

</dependencies>

<build>
<plugins>

<!-- The vert.x Maven plugin -->
<plugin>
<groupId>io.vertx</groupId>
<artifactId>vertx-maven-plugin</artifactId>
<version>${maven.vertx.plugin.version}</version>
<!--
You can specify extra config to the plugin as required here
<configuration>
<configFile>/path/to/MyVerticle.conf</configFile>
<instances>1</instances>
<classpath>src/main/resources/:src/test/resources/:target/classes/:target/test-classes/</classpath>
</configuration>
-->
<!-- Make sure that the plugin uses the vert.x versions from this pom.xml not from its own pom.xml -->
<dependencies>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-platform</artifactId>
<version>${vertx.version}</version>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>${vertx.version}</version>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-hazelcast</artifactId>
<version>${vertx.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>PullInDeps</id>
<phase>prepare-package</phase>
<goals>
<goal>pullInDeps</goal>
</goals>
</execution>
</executions>
</plugin>

<!-- Other plugins required by the build -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<configuration>
<filesets>
<fileset>
<directory>ObjectStore</directory>
</fileset>
</filesets>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven.resources.plugin.version}</version>
<executions>
<execution>
<id>copy-mod-to-target</id>
<phase>process-classes</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<overwrite>true</overwrite>
<outputDirectory>${mods.directory}/${module.name}</outputDirectory>
<resources>
<resource>
<directory>target/classes</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>${maven.dependency.plugin.version}</version>
<executions>
<execution>
<id>copy-mod-dependencies-to-target</id>
<phase>process-classes</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${mods.directory}/${module.name}/lib</outputDirectory>
<includeScope>runtime</includeScope>
</configuration>
</execution>
<execution>
<id>copy-mod-dependencies-to-target-dependencies</id>
<phase>process-classes</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>target/dependencies</outputDirectory>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven.surefire.plugin.version}</version>
<configuration>
<includes>
<include>**/unit/*Test*.java</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven.failsafe.plugin.version}</version>
<configuration>
<systemProperties>
<property>
<name>vertx.mods</name>
<value>${mods.directory}</value>
</property>
</systemProperties>
<includes>
<include>**/integration/**</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>${maven.surefire.report.plugin.version}</version>
<executions>
<execution>
<id>generate-test-report</id>
<phase>test</phase>
<goals>
<goal>report-only</goal>
</goals>
</execution>
<execution>
<id>generate-integration-test-report</id>
<phase>integration-test</phase>
<goals>
<goal>failsafe-report-only</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/mod.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>assemble</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>${maven.surefire.report.plugin.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>${maven.javadoc.plugin.version}</version>
<configuration>
<aggregate>true</aggregate>
</configuration>
</plugin>
</plugins>
</reporting>
</project>
6 changes: 6 additions & 0 deletions vertx/module/src/main/README.txt
@@ -0,0 +1,6 @@
Put any Java or Groovy classes used in your module in the java or groovy directories.

Put any other resources that you want included in your module in the resources directory, this includes any
JavaScript, Ruby, Python, Groovy or CoffeeScript scripts or any other stuff you want in your module.

The mod.json file also goes in the resources directory so it's copied over too.

0 comments on commit 7d88eb4

Please sign in to comment.