package org.multiverse.stms.gamma.benchmarks;
import org.junit.Before;
import org.junit.Test;
import org.multiverse.api.Txn;
import org.multiverse.api.callables.TxnVoidCallable;
import org.multiverse.stms.gamma.GammaConstants;
import org.multiverse.stms.gamma.GammaStm;
import org.multiverse.stms.gamma.LeanGammaTxnExecutor;
import org.multiverse.stms.gamma.transactionalobjects.GammaTxnRef;
import org.multiverse.stms.gamma.transactions.lean.LeanMonoGammaTxn;
import org.multiverse.stms.gamma.transactions.lean.LeanMonoGammaTxnFactory;
import static org.benchy.BenchyUtils.operationsPerSecondPerThreadAsString;
import static org.junit.Assert.assertEquals;
import static org.multiverse.stms.gamma.GammaTestUtils.assertGlobalConflictCount;
public class LeanMonoUpdateWithTransactionDriver implements GammaConstants {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
}
public static void main(String[] args) {
LeanMonoUpdateWithTransactionDriver driver = new LeanMonoUpdateWithTransactionDriver();
driver.setUp();
driver.test();
}
@Test
public void test() {
final long txCount = 1000 * 1000 * 1000;
final GammaTxnRef<String> ref = new GammaTxnRef<String>(stm, null);
long initialVersion = ref.getVersion();
final LeanGammaTxnExecutor executor = new LeanGammaTxnExecutor(new LeanMonoGammaTxnFactory(stm));
final TxnVoidCallable callable = new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
ref.openForWrite((LeanMonoGammaTxn) tx, LOCKMODE_NONE).ref_value = "foo";
}
};
System.out.println("Starting");
long startMs = System.currentTimeMillis();
long globalConflictCount = stm.getGlobalConflictCounter().count();
for (long k = 0; k < txCount; k++) {
executor.execute(callable);
}
long durationMs = System.currentTimeMillis() - startMs;
System.out.println("finished");
String s = operationsPerSecondPerThreadAsString(txCount, durationMs, 1);
System.out.printf("Duration %s ms\n", durationMs);
System.out.printf("Performance is %s transactions/second/thread\n", s);
//assertEquals(txCount, ref.long_value);
assertEquals(txCount + initialVersion, ref.version);
assertGlobalConflictCount(stm, globalConflictCount);
}
}