Files
Chronicle-Map/src/test/java/net/openhft/chronicle/map/locks/DirtyReadOffender.java
T

111 lines
4.3 KiB
Java

package net.openhft.chronicle.map.locks;
import net.openhft.chronicle.map.ChronicleMap;
import java.util.Scanner;
import java.util.concurrent.locks.StampedLock;
import static net.openhft.chronicle.values.Values.newNativeReference;
//import net.openhft.chronicle.map.fromdocs.BondVOInterface;
public class DirtyReadOffender {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
String isoLevel = args[0];
long sleepT = Long.parseLong(args[1]);
long holdTime = Long.parseLong(args[2]);
ChronicleMap<String, BondVOInterface> chm =
DirtyReadTolerance.offHeap(
args[3]
+ "OPERAND_CHRONICLE_MAP"
);
System.out.println(
" @t=" + System.currentTimeMillis() +
" DirtyReadOffender established chm "
);
StampedLock offHeapLock = new ChronicleStampedLock(
args[3]
+ "OPERAND_ChronicleStampedLock"
);
BondVOInterface bond = newNativeReference(BondVOInterface.class);
//BondVOInterface cslMock = newNativeReference(BondVOInterface.class);
chm.acquireUsing("369604101", bond);
//chm.acquireUsing("Offender ", cslMock); // mock ChronicleStampLock
System.out.println(
" @t=" + System.currentTimeMillis() +
" DirtyReadOffender sleeping " + sleepT + " seconds "
);
Thread.sleep(sleepT * 1_000);
System.out.println(
" @t=" + System.currentTimeMillis() +
" DirtyReadOffender awakening "
);
/**
* ben.cotton@rutgers.edu ... anticipate Chronicle (www.OpenHFT.net)
* providing a j.u.c.l.StampedLock API for off-heap enthusiasts
*
* START
*
*/
long stamp = 0;
System.out.println(
" @t=" + System.currentTimeMillis() +
" DirtyReadOffender ACQUIRING offHeapLock.writeLock();"
);
while ((stamp = offHeapLock.writeLock()) == 0) {
}
System.out.println(
" @t=" + System.currentTimeMillis() +
" DirtyReadOffender ACQUIRED offHeapLock.writeLock();"
);
try {
double newCoupon = 3.5 + Math.random();
System.out.println(
" @t=" + System.currentTimeMillis() +
" DirtyReadOffender " +
" calling chm.put('369604101'," + newCoupon + ") "
);
bond.setCoupon(newCoupon);
chm.put("369604101", bond);
//cslMock.setEntryLockState(System.currentTimeMillis()); //mock'd
// chm.put("Offender ",cslMock); //mock'd
System.out.println(
" @t=" + System.currentTimeMillis() +
" DirtyReadOffender coupon=[" +
bond.getCoupon() +
"] written. "
);
} finally {
System.out.println(
" @t=" + System.currentTimeMillis() +
" DirtyReadOffender sleeping " + holdTime + " seconds "
);
Thread.sleep(holdTime * 1_000);
offHeapLock.unlockWrite(stamp);
System.out.println(
" @t=" + System.currentTimeMillis() +
" DirtyReadOffender called " +
"offHeapLock.unlockWrite(" + stamp + ");"
);
}
/**
* ben.cotton@rutgers.edu
*
* END
*
*/
} catch (Exception throwables) {
throwables.printStackTrace();
} finally {
System.out.println(
" ,,@t=" + System.currentTimeMillis() +
" DirtyReadOffender COMMITTED"
);
}
}
}