in geode-core/src/integrationTest/java/org/apache/geode/TXJUnitTest.java [4348:4625]
public void testLoader() throws CacheException {
AttributesMutator<String, String> mutator = region.getAttributesMutator();
mutator.setCacheLoader(new CacheLoader<String, String>() {
int count = 0;
@Override
public String load(LoaderHelper helper) throws CacheLoaderException {
count++;
return "LV " + count;
}
@Override
public void close() {}
});
LocalRegion reg1 = (LocalRegion) region;
if (isPR()) {
((PartitionedRegion) reg1).setHaveCacheLoader();
}
assertTrue(!reg1.containsKey("key1"));
assertEquals("LV 1", reg1.get("key1"));
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 1", reg1.getEntry("key1").getValue());
reg1.localDestroy("key1");
// TX load: only TX
txMgr.begin();
assertTrue(!reg1.containsKey("key1"));
assertEquals("LV 2", reg1.get("key1"));
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 2", reg1.getEntry("key1").getValue());
txMgr.rollback();
assertTrue(!reg1.containsKey("key1"));
// assertIndexDetailsEquals("LV 2", reg1.getEntry("key1").getValue());
// reg1.localDestroy("key1");
// TX load: commit check
txMgr.begin();
assertTrue(!reg1.containsKey("key1"));
assertEquals("LV 3", reg1.get("key1"));
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 3", reg1.getEntry("key1").getValue());
txMgr.commit();
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 3", reg1.getEntry("key1").getValue());
reg1.localDestroy("key1");
// TX load YES conflict: no-initial state, tx create, committed load
{
final TXManagerImpl txMgrImpl = (TXManagerImpl) txMgr;
TXStateProxy tx;
txMgr.begin();
reg1.create("key1", "txValue");
assertEquals("txValue", reg1.getEntry("key1").getValue());
tx = txMgrImpl.pauseTransaction();
assertTrue(!reg1.containsKey("key1"));
assertEquals("LV 4", reg1.get("key1"));
assertTrue(reg1.containsKey("key1"));
txMgrImpl.unpauseTransaction(tx);
assertEquals("txValue", reg1.getEntry("key1").getValue());
assertEquals("txValue", reg1.get("key1"));
try {
txMgr.commit();
fail("Should have thrown a commit conflict");
} catch (CommitConflictException cce) {
// this is what we want
}
assertEquals("LV 4", reg1.getEntry("key1").getValue());
assertEquals("LV 4", reg1.get("key1"));
reg1.localDestroy("key1");
}
// TX load no conflict: load initial state, tx update
assertEquals("LV 5", reg1.get("key1"));
txMgr.begin();
reg1.put("key1", "txValue");
assertEquals("txValue", reg1.get("key1"));
assertEquals("txValue", reg1.getEntry("key1").getValue());
txMgr.commit(); // no conflict! Make sure committed value overrode initial state
assertEquals("txValue", reg1.getEntry("key1").getValue());
assertEquals("txValue", reg1.get("key1"));
reg1.localDestroy("key1");
// TX load no conflict: load initial state, tx load
assertEquals("LV 6", reg1.get("key1"));
txMgr.begin();
reg1.localInvalidate("key1");
assertEquals("LV 7", reg1.get("key1"));
assertEquals("LV 7", reg1.getEntry("key1").getValue());
txMgr.commit(); // no conflict! Make sure committed value overrode initial state
assertEquals("LV 7", reg1.getEntry("key1").getValue());
assertEquals("LV 7", reg1.get("key1"));
reg1.localDestroy("key1");
// TX load no conflict: no initial state, tx load, committed create
{
final TXManagerImpl txMgrImpl = (TXManagerImpl) txMgr;
TXStateProxy tx;
txMgr.begin();
assertEquals("LV 8", reg1.get("key1"));
assertEquals("LV 8", reg1.getEntry("key1").getValue());
tx = txMgrImpl.pauseTransaction();
assertTrue(!reg1.containsKey("key1"));
reg1.create("key1", "txValue");
assertTrue(reg1.containsKey("key1"));
assertEquals("txValue", reg1.get("key1"));
txMgrImpl.unpauseTransaction(tx);
assertEquals("LV 8", reg1.getEntry("key1").getValue());
try {
txMgr.commit(); // should conflict
fail("Should have thrown cce");
} catch (CommitConflictException cce) {
// this is what we want
}
assertEquals("txValue", reg1.getEntry("key1").getValue());
assertEquals("txValue", reg1.get("key1"));
reg1.localDestroy("key1");
}
// TX load conflict: no-inital state, tx load->update, committed update
{
final TXManagerImpl txMgrImpl = (TXManagerImpl) txMgr;
TransactionId txId = null;
txMgr.begin();
reg1.create("key1", "txValue");
txId = txMgrImpl.suspend();
assertTrue(!reg1.containsKey("key1"));
// new transaction, load(create) + put
txMgr.begin();
assertEquals("LV 9", reg1.get("key1"));
assertEquals("LV 9", reg1.getEntry("key1").getValue());
reg1.put("key1", "txValue2");
assertEquals("txValue2", reg1.get("key1"));
assertEquals("txValue2", reg1.getEntry("key1").getValue());
txMgr.commit();
assertTrue(reg1.containsKey("key1"));
assertEquals("txValue2", reg1.get("key1"));
assertEquals("txValue2", reg1.getEntry("key1").getValue());
txMgrImpl.resume(txId);
assertEquals("txValue", reg1.getEntry("key1").getValue());
assertEquals("txValue", reg1.get("key1"));
try {
txMgr.commit();
fail("expected CommitConflictException!");
} catch (CommitConflictException ignored) {
}
assertTrue(reg1.containsKey("key1"));
assertEquals("txValue2", reg1.get("key1"));
assertEquals("txValue2", reg1.getEntry("key1").getValue());
reg1.localDestroy("key1");
}
// TX load repeat: no-initial state, tx load->get
txMgr.begin();
assertTrue(!reg1.containsKey("key1"));
assertEquals("LV 10", reg1.get("key1")); // first invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 10", reg1.getEntry("key1").getValue());
assertEquals("LV 10", reg1.get("key1")); // second invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 10", reg1.getEntry("key1").getValue());
txMgr.rollback();
// TX load repeat: no-initial state, tx load->localDestory->load
txMgr.begin();
assertTrue(!reg1.containsKey("key1"));
assertEquals("LV 11", reg1.get("key1")); // first invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 11", reg1.getEntry("key1").getValue());
reg1.localDestroy("key1");
assertEquals("LV 12", reg1.get("key1")); // second invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 12", reg1.getEntry("key1").getValue());
txMgr.rollback();
// TX load repeat: no-initial state: tx load->destroy->load
txMgr.begin();
assertTrue(!reg1.containsKey("key1"));
assertEquals("LV 13", reg1.get("key1")); // first invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 13", reg1.getEntry("key1").getValue());
reg1.destroy("key1");
assertEquals("LV 14", reg1.get("key1")); // second invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 14", reg1.getEntry("key1").getValue());
txMgr.rollback();
// TX load repeat: no-initial state, tx load->localInvalidate->load
txMgr.begin();
assertTrue(!reg1.containsKey("key1"));
assertEquals("LV 15", reg1.get("key1")); // first invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 15", reg1.getEntry("key1").getValue());
reg1.localInvalidate("key1");
assertEquals("LV 16", reg1.get("key1")); // second invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 16", reg1.getEntry("key1").getValue());
txMgr.rollback();
// TX load repeat: no-initial, tx load->invalidate->load
txMgr.begin();
assertTrue(!reg1.containsKey("key1"));
assertEquals("LV 17", reg1.get("key1")); // first invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 17", reg1.getEntry("key1").getValue());
reg1.invalidate("key1");
assertEquals("LV 18", reg1.get("key1")); // second invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 18", reg1.getEntry("key1").getValue());
txMgr.rollback();
// TX load repeat: invalid entry initial state, tx load->get
reg1.create("key1", null);
txMgr.begin();
assertTrue(reg1.containsKey("key1"));
assertNull(reg1.getEntry("key1").getValue());
assertEquals("LV 19", reg1.get("key1")); // first invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 19", reg1.getEntry("key1").getValue());
assertEquals("LV 19", reg1.get("key1")); // second invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 19", reg1.getEntry("key1").getValue());
txMgr.rollback();
// TX load repeat: invalid entry initial state, tx load->localDestory->load
txMgr.begin();
assertTrue(reg1.containsKey("key1"));
assertNull(reg1.getEntry("key1").getValue());
assertEquals("LV 20", reg1.get("key1")); // first invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 20", reg1.getEntry("key1").getValue());
reg1.localDestroy("key1");
assertEquals("LV 21", reg1.get("key1")); // second invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 21", reg1.getEntry("key1").getValue());
txMgr.rollback();
// TX load repeat: invalid entry initial state: tx load->destroy->load
txMgr.begin();
assertTrue(reg1.containsKey("key1"));
assertNull(reg1.getEntry("key1").getValue());
assertEquals("LV 22", reg1.get("key1")); // first invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 22", reg1.getEntry("key1").getValue());
reg1.destroy("key1");
assertEquals("LV 23", reg1.get("key1")); // second invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 23", reg1.getEntry("key1").getValue());
txMgr.rollback();
// TX load repeat: invalid entry initial state, tx load->localInvalidate->load
txMgr.begin();
assertTrue(reg1.containsKey("key1"));
assertNull(reg1.getEntry("key1").getValue());
assertEquals("LV 24", reg1.get("key1")); // first invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 24", reg1.getEntry("key1").getValue());
reg1.localInvalidate("key1");
assertEquals("LV 25", reg1.get("key1")); // second invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 25", reg1.getEntry("key1").getValue());
txMgr.rollback();
// TX load repeat: invalid entry initial state, tx load->invalidate->load
txMgr.begin();
assertTrue(reg1.containsKey("key1"));
assertNull(reg1.getEntry("key1").getValue());
assertEquals("LV 26", reg1.get("key1")); // first invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 26", reg1.getEntry("key1").getValue());
reg1.invalidate("key1");
assertEquals("LV 27", reg1.get("key1")); // second invocation
assertTrue(reg1.containsKey("key1"));
assertEquals("LV 27", reg1.getEntry("key1").getValue());
txMgr.rollback();
// Make sure a load does not conflict with the region being destroyed
txMgr.begin();
assertEquals("LV 28", reg1.get("key2"));
txMgr.commit();
reg1.localDestroyRegion(); // non-tx region op
// reg1 is now destroyed
}