Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion narayana/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
<module>ArjunaJTS/jts</module>
<module>ArjunaJTA/jta</module>
<module>ArjunaCore/arjuna</module>
<module>stm</module>
<module>tools</module>
</modules>

Expand Down Expand Up @@ -175,4 +176,4 @@
</dependency>
</dependencies>
</dependencyManagement>
</project>
</project>
20 changes: 20 additions & 0 deletions narayana/stm/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

mvn clean package
java -jar target/benchmarks.jar


I created 3 benchmarks (see https://github.com/jbosstm/performance/pull/185):
LocalJTABenchmark.benchmark: starts a JTA txn and enlists a single XAResource and commits
STMBenchmark.baseLineBenchmark: adds two integers together
STMBenchmark.benchmark: starts an AtomicAction and increments and decrements two integers backed by transaction memory

I ran the benchmarks three times taking the best result from each.

Comparing the the % difference between the pr/2414 and main branches I found that

LocalJTABenchmark.benchmark: pr/2414 is 10% better
STMBenchmark.baseLineBenchmark pr/2414 is 0.2% worse
STMBenchmark.benchmark: pr/2414 is 0.25% worse

So if the LocalJTABenchmark result is repeatable then I think 10% gain is significant.

155 changes: 155 additions & 0 deletions narayana/stm/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.jboss.narayana.stm</groupId>
<artifactId>stm-benchmark</artifactId>
<version>7.3.1.Final-SNAPSHOT</version>
<packaging>jar</packaging>

<name>JMH benchmarks: stm vs local jta</name>

<dependencies>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.narayana.arjunacore</groupId>
<artifactId>arjunacore</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.narayana.jta</groupId>
<artifactId>jta</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.narayana.stm</groupId>
<artifactId>stm</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>jakarta.transaction</groupId>
<artifactId>jakarta.transaction-api</artifactId>
<version>2.0.1</version>
</dependency>

<dependency>
<groupId>org.jboss</groupId>
<artifactId>jboss-transaction-spi</artifactId>
<version>7.6.1.Final</version>
<exclusions>
<exclusion>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging-spi</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jmh.version>1.37</jmh.version>
<javac.target>1.8</javac.target>
<uberjar.name>benchmarks</uberjar.name>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<compilerVersion>${javac.target}</compilerVersion>
<source>${javac.target}</source>
<target>${javac.target}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>${uberjar.name}</finalName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.openjdk.jmh.Main</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
<filters>
<filter>
<!--
Shading signed JARs will fail without this.
http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar
-->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.1</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.3</version>
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package org.jboss.narayana.stm;

import com.arjuna.ats.arjuna.common.CoreEnvironmentBean;
import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
import com.arjuna.common.internal.util.propertyservice.BeanPopulator;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;

import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.TimeUnit;

public class LocalJTABenchmark {
@State(Scope.Benchmark)
static
public class LocalJTABenchmarkState {
XAResource xaResource;
String connectionString;
jakarta.transaction.TransactionManager tm;

@Setup(Level.Invocation)
public void doSetup() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, CoreEnvironmentBeanException {
tm = com.arjuna.ats.jta.TransactionManager.transactionManager();
if (tm == null) {
throw new RuntimeException("Error - could not get transaction manager!");
}
// xaResource = new DummyXA(false);//state.creator.create(state.connectionString, false);
xaResource = new XAResource() {
@Override
public void commit(Xid xid, boolean onePhase) throws XAException {
}

@Override
public void end(Xid xid, int flags) throws XAException {
}

@Override
public void forget(Xid xid) throws XAException {
}

@Override
public int getTransactionTimeout() throws XAException {
return 0;
}

@Override
public boolean isSameRM(XAResource xares) throws XAException {
return false;
}

@Override
public int prepare(Xid xid) throws XAException {
return 0;
}

@Override
public Xid[] recover(int flag) throws XAException {
return new Xid[0];
}

@Override
public void rollback(Xid xid) throws XAException {
}

@Override
public boolean setTransactionTimeout(int seconds) throws XAException {
return false;
}

@Override
public void start(Xid xid, int flags) throws XAException {
}
};

BeanPopulator.getDefaultInstance(CoreEnvironmentBean.class).setNodeIdentifier("1");
}
}

@Benchmark
@OutputTimeUnit(TimeUnit.SECONDS)
@Fork(2)
@Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
public void benchmark(LocalJTABenchmarkState state) throws Exception {
state.tm.begin();

jakarta.transaction.Transaction theTransaction = state.tm.getTransaction();

if (theTransaction != null) {
if (!theTransaction.enlistResource(state.xaResource)) {
System.err.println("Error - could not enlist resource in transaction!");
state.tm.rollback();

System.exit(0);
}

state.tm.commit();
} else {
System.err.println("Error - could not get transaction!");
try {
state.tm.rollback();
} catch (Exception e) {
System.exit(0);
}
}
}
}
Loading