package org.multiverse.stms.gamma.benchmarks;
import org.benchy.BenchyUtils;
import org.junit.Before;
import org.junit.Test;
import org.multiverse.api.LockMode;
import org.multiverse.stms.gamma.GammaConstants;
import org.multiverse.stms.gamma.GammaObjectPool;
import org.multiverse.stms.gamma.GammaStm;
import org.multiverse.stms.gamma.transactionalobjects.GammaTxnLong;
import org.multiverse.stms.gamma.transactionalobjects.Tranlocal;
import org.multiverse.stms.gamma.transactions.GammaTxnConfig;
import org.multiverse.stms.gamma.transactions.fat.FatMonoGammaTxn;
public class RawUpdateDriver implements GammaConstants {
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
}
public static void main(String[] srgs) {
RawUpdateDriver driver = new RawUpdateDriver();
driver.setUp();
driver.testNoLocking();
}
@Test
public void testNoLocking() {
test(LockMode.None);
}
@Test
public void testReadLock() {
test(LockMode.Read);
}
@Test
public void testWriteLock() {
test(LockMode.Write);
}
@Test
public void testWriteCommit() {
test(LockMode.Exclusive);
}
public void test(LockMode writeLockMode) {
final long txCount = 1000 * 1000 * 1000;
final FatMonoGammaTxn tx = new FatMonoGammaTxn(
new GammaTxnConfig(stm).setWriteLockMode(writeLockMode));
final GammaObjectPool pool = tx.pool;
final GammaTxnLong ref = new GammaTxnLong(stm, 0);
final int lockMode = writeLockMode.asInt();
final Tranlocal tranlocal = new Tranlocal();
final long initialVersion = ref.getVersion();
final long startMs = System.currentTimeMillis();
if (lockMode == LOCKMODE_EXCLUSIVE) {
for (long k = 0; k < txCount; k++) {
ref.load(tx,tranlocal, LOCKMODE_EXCLUSIVE, 1, false);
ref.orec = 0;
//ref.releaseAfterUpdate(tranlocal, pool);
}
} else {
for (long k = 0; k < txCount; k++) {
ref.load(tx,tranlocal, lockMode, 1, false);
ref.tryLockAndCheckConflict(tx, tranlocal, 1, LOCKMODE_EXCLUSIVE);
//ref.releaseAfterUpdate(tranlocal, pool);
ref.orec = 0;
}
}
long durationMs = System.currentTimeMillis() - startMs;
String s = BenchyUtils.operationsPerSecondPerThreadAsString(txCount, durationMs, 1);
System.out.printf("Performance is %s transactions/second/thread\n", s);
//assertEquals(txCount, ref.long_value);
//assertEquals(txCount + initialVersion, ref.version);
}
}