use of org.apache.geode.cache.TransactionEvent in project geode by apache.
the class TXJUnitTest method testTwoRegionTxs.
@Test
public void testTwoRegionTxs() throws CacheException {
final CachePerfStats stats = this.cache.getCachePerfStats();
int txCommitChanges;
TransactionId myTxId;
AttributesFactory<String, String> attributesFactory = new AttributesFactory<>();
attributesFactory.setScope(Scope.DISTRIBUTED_NO_ACK);
Region<String, String> reg1 = this.region;
Region<String, String> reg2 = this.cache.createRegion(getUniqueName(), attributesFactory.create());
this.txMgr.setListener(new TransactionListener() {
@Override
public void afterCommit(TransactionEvent event) {
listenerAfterCommit = 1;
te = event;
}
@Override
public void afterFailedCommit(TransactionEvent event) {
listenerAfterFailedCommit = 1;
te = event;
}
@Override
public void afterRollback(TransactionEvent event) {
listenerAfterRollback = 1;
te = event;
}
@Override
public void close() {
listenerClose = 1;
}
});
// see if commits work
txCommitChanges = stats.getTxCommitChanges();
assertTrue(!reg1.containsKey("key1"));
assertTrue(!reg2.containsKey("key2"));
this.txMgr.begin();
myTxId = this.txMgr.getTransactionId();
reg1.create("key1", "value1");
reg2.create("key2", "value2");
this.txMgr.commit();
assertTrue(reg1.containsKey("key1"));
assertTrue(reg1.containsValueForKey("key1"));
assertEquals("key1", reg1.getEntry("key1").getKey());
assertEquals("value1", reg1.getEntry("key1").getValue());
assertEquals("value1", reg1.get("key1"));
assertTrue(reg2.containsKey("key2"));
assertTrue(reg2.containsValueForKey("key2"));
assertEquals("key2", reg2.getEntry("key2").getKey());
assertEquals("value2", reg2.getEntry("key2").getValue());
assertEquals("value2", reg2.get("key2"));
assertEquals(txCommitChanges + 2, stats.getTxCommitChanges());
{
List<EntryEvent<?, ?>> creates = this.te.getCreateEvents();
assertEquals(myTxId, this.te.getTransactionId());
assertEquals(2, creates.size());
for (EntryEvent ev : creates) {
assertEquals(myTxId, ev.getTransactionId());
assertTrue(ev.getRegion() == reg1 || ev.getRegion() == reg2);
if (ev.getRegion() == reg1) {
assertEquals("key1", ev.getKey());
assertEquals("value1", ev.getNewValue());
} else {
assertEquals("key2", ev.getKey());
assertEquals("value2", ev.getNewValue());
}
assertEquals(null, ev.getOldValue());
verifyEventProps(ev);
assertEquals(null, ev.getCallbackArgument());
assertEquals(true, ev.isCallbackArgumentAvailable());
assertTrue(!ev.isOriginRemote());
assertTrue(!ev.getOperation().isExpiration());
assertTrue(ev.getOperation().isDistributed());
}
}
reg1.localDestroy("key1");
reg2.localDestroy("key2");
reg2.localDestroyRegion();
}
use of org.apache.geode.cache.TransactionEvent in project geode by apache.
the class TXJUnitTest method testTxEvent.
@Test
public void testTxEvent() throws CacheException {
TransactionId myTxId;
Region<String, String> reg1 = this.region;
this.txMgr.setListener(new TransactionListener() {
@Override
public void afterCommit(TransactionEvent event) {
listenerAfterCommit = 1;
te = event;
}
@Override
public void afterFailedCommit(TransactionEvent event) {
listenerAfterFailedCommit = 1;
te = event;
}
@Override
public void afterRollback(TransactionEvent event) {
listenerAfterRollback = 1;
te = event;
}
@Override
public void close() {
listenerClose = 1;
}
});
// make sure each operation has the correct transaction event
// check create
this.txMgr.begin();
myTxId = this.txMgr.getTransactionId();
reg1.create("key1", "value1");
this.txMgr.rollback();
assertEquals(1, this.te.getEvents().size());
assertEquals(0, this.te.getPutEvents().size());
assertEquals(0, this.te.getInvalidateEvents().size());
assertEquals(0, this.te.getDestroyEvents().size());
{
Cache teCache = this.te.getCache();
assertEquals(teCache, this.cache);
List<EntryEvent<?, ?>> creates = this.te.getCreateEvents();
assertEquals(myTxId, this.te.getTransactionId());
assertEquals(1, creates.size());
for (EntryEvent ev : creates) {
assertEquals(myTxId, ev.getTransactionId());
assertTrue(ev.getRegion() == reg1);
assertEquals("key1", ev.getKey());
assertEquals("value1", ev.getNewValue());
assertEquals(null, ev.getOldValue());
verifyEventProps(ev);
assertEquals(null, ev.getCallbackArgument());
assertEquals(true, ev.isCallbackArgumentAvailable());
assertTrue(!ev.isOriginRemote());
assertTrue(!ev.getOperation().isExpiration());
assertTrue(ev.getOperation().isDistributed());
}
}
// check put of existing entry
reg1.create("key1", "value0");
this.txMgr.begin();
myTxId = this.txMgr.getTransactionId();
reg1.put("key1", "value1");
this.txMgr.rollback();
assertEquals(1, this.te.getEvents().size());
assertEquals(0, this.te.getCreateEvents().size());
assertEquals(0, this.te.getInvalidateEvents().size());
assertEquals(0, this.te.getDestroyEvents().size());
{
Cache teCache = this.te.getCache();
assertEquals(teCache, this.cache);
List<EntryEvent<?, ?>> creates = this.te.getPutEvents();
assertEquals(myTxId, this.te.getTransactionId());
assertEquals(1, creates.size());
for (EntryEvent ev : creates) {
assertEquals(myTxId, ev.getTransactionId());
assertTrue(ev.getRegion() == reg1);
assertEquals("key1", ev.getKey());
assertEquals("value1", ev.getNewValue());
assertEquals("value0", ev.getOldValue());
verifyEventProps(ev);
assertEquals(null, ev.getCallbackArgument());
assertEquals(true, ev.isCallbackArgumentAvailable());
assertTrue(!ev.isOriginRemote());
assertTrue(!ev.getOperation().isExpiration());
assertTrue(ev.getOperation().isDistributed());
}
}
reg1.localDestroy("key1");
// check put of non-existent entry
this.txMgr.begin();
myTxId = this.txMgr.getTransactionId();
reg1.put("key1", "value0");
this.txMgr.rollback();
assertEquals(1, this.te.getEvents().size());
assertEquals(0, this.te.getPutEvents().size());
assertEquals(0, this.te.getInvalidateEvents().size());
assertEquals(0, this.te.getDestroyEvents().size());
{
Cache teCache = this.te.getCache();
assertEquals(teCache, this.cache);
List<EntryEvent<?, ?>> creates = this.te.getCreateEvents();
assertEquals(myTxId, this.te.getTransactionId());
assertEquals(1, creates.size());
for (EntryEvent ev : creates) {
assertEquals(myTxId, ev.getTransactionId());
assertTrue(ev.getRegion() == reg1);
assertEquals("key1", ev.getKey());
assertEquals("value0", ev.getNewValue());
assertEquals(null, ev.getOldValue());
verifyEventProps(ev);
assertEquals(null, ev.getCallbackArgument());
assertEquals(true, ev.isCallbackArgumentAvailable());
assertTrue(!ev.isOriginRemote());
assertTrue(!ev.getOperation().isExpiration());
assertTrue(ev.getOperation().isDistributed());
}
}
// check d invalidate of existing entry
reg1.create("key1", "value0");
this.txMgr.begin();
myTxId = this.txMgr.getTransactionId();
reg1.invalidate("key1");
this.txMgr.rollback();
assertEquals(1, this.te.getEvents().size());
assertEquals(0, this.te.getCreateEvents().size());
assertEquals(0, this.te.getPutEvents().size());
assertEquals(0, this.te.getDestroyEvents().size());
{
Cache teCache = this.te.getCache();
assertEquals(teCache, this.cache);
List<EntryEvent<?, ?>> creates = this.te.getInvalidateEvents();
assertEquals(myTxId, this.te.getTransactionId());
assertEquals(1, creates.size());
for (EntryEvent ev : creates) {
assertEquals(myTxId, ev.getTransactionId());
assertTrue(ev.getRegion() == reg1);
assertEquals("key1", ev.getKey());
assertEquals(null, ev.getNewValue());
assertEquals("value0", ev.getOldValue());
verifyEventProps(ev);
assertEquals(null, ev.getCallbackArgument());
assertEquals(true, ev.isCallbackArgumentAvailable());
assertTrue(!ev.isOriginRemote());
assertTrue(!ev.getOperation().isExpiration());
assertTrue(ev.getOperation().isDistributed());
}
}
reg1.localDestroy("key1");
// check l invalidate of existing entry
reg1.create("key1", "value0");
this.txMgr.begin();
myTxId = this.txMgr.getTransactionId();
reg1.localInvalidate("key1");
this.txMgr.rollback();
assertEquals(1, this.te.getEvents().size());
assertEquals(0, this.te.getCreateEvents().size());
assertEquals(0, this.te.getPutEvents().size());
assertEquals(0, this.te.getDestroyEvents().size());
{
Cache teCache = this.te.getCache();
assertEquals(teCache, this.cache);
List<EntryEvent<?, ?>> creates = this.te.getInvalidateEvents();
assertEquals(myTxId, this.te.getTransactionId());
assertEquals(1, creates.size());
for (EntryEvent ev : creates) {
assertEquals(myTxId, ev.getTransactionId());
assertTrue(ev.getRegion() == reg1);
assertEquals("key1", ev.getKey());
assertEquals(null, ev.getNewValue());
assertEquals("value0", ev.getOldValue());
verifyEventProps(ev);
assertEquals(null, ev.getCallbackArgument());
assertEquals(true, ev.isCallbackArgumentAvailable());
assertTrue(!ev.isOriginRemote());
assertTrue(!ev.getOperation().isExpiration());
if (!isPR())
assertTrue(!ev.getOperation().isDistributed());
}
}
reg1.localDestroy("key1");
// check d destroy of existing entry
reg1.create("key1", "value0");
this.txMgr.begin();
myTxId = this.txMgr.getTransactionId();
reg1.destroy("key1");
this.txMgr.rollback();
assertEquals(1, this.te.getEvents().size());
assertEquals(0, this.te.getCreateEvents().size());
assertEquals(0, this.te.getPutEvents().size());
assertEquals(0, this.te.getInvalidateEvents().size());
{
Cache teCache = this.te.getCache();
assertEquals(teCache, this.cache);
List<EntryEvent<?, ?>> creates = this.te.getDestroyEvents();
assertEquals(myTxId, this.te.getTransactionId());
assertEquals(1, creates.size());
for (EntryEvent ev : creates) {
assertEquals(myTxId, ev.getTransactionId());
assertTrue(ev.getRegion() == reg1);
assertEquals("key1", ev.getKey());
assertEquals(null, ev.getNewValue());
assertEquals("value0", ev.getOldValue());
verifyEventProps(ev);
assertEquals(null, ev.getCallbackArgument());
assertEquals(true, ev.isCallbackArgumentAvailable());
assertTrue(!ev.isOriginRemote());
assertTrue(!ev.getOperation().isExpiration());
assertTrue(ev.getOperation().isDistributed());
}
}
reg1.localDestroy("key1");
// check l destroy of existing entry
reg1.create("key1", "value0");
this.txMgr.begin();
myTxId = this.txMgr.getTransactionId();
reg1.localDestroy("key1");
this.txMgr.rollback();
assertEquals(1, this.te.getEvents().size());
assertEquals(0, this.te.getCreateEvents().size());
assertEquals(0, this.te.getPutEvents().size());
assertEquals(0, this.te.getInvalidateEvents().size());
{
Cache teCache = this.te.getCache();
assertEquals(teCache, this.cache);
List<EntryEvent<?, ?>> creates = this.te.getDestroyEvents();
assertEquals(myTxId, this.te.getTransactionId());
assertEquals(1, creates.size());
for (EntryEvent ev : creates) {
assertEquals(myTxId, ev.getTransactionId());
assertTrue(ev.getRegion() == reg1);
assertEquals("key1", ev.getKey());
assertEquals(null, ev.getNewValue());
assertEquals("value0", ev.getOldValue());
verifyEventProps(ev);
assertEquals(null, ev.getCallbackArgument());
assertEquals(true, ev.isCallbackArgumentAvailable());
assertTrue(!ev.isOriginRemote());
assertTrue(!ev.getOperation().isExpiration());
if (!isPR())
assertTrue(!ev.getOperation().isDistributed());
}
}
reg1.localDestroy("key1");
}
use of org.apache.geode.cache.TransactionEvent in project geode by apache.
the class TXWriterJUnitTest method testAfterCommitFailedOnTransactionWriterThrow.
/**
* make sure standard Cache(Listener,Writer) are not called during rollback due to transaction
* writer throw
*/
@Test
public void testAfterCommitFailedOnTransactionWriterThrow() throws Exception {
installCacheListenerAndWriter();
((CacheTransactionManager) this.txMgr).setWriter(new TransactionWriter() {
public void beforeCommit(TransactionEvent event) throws TransactionWriterException {
throw new TransactionWriterException("Rollback now!");
}
public void close() {
}
});
installTransactionListener();
this.txMgr.begin();
this.region.create("key1", "value1");
this.cbCount = 0;
try {
this.txMgr.commit();
fail("Commit should have thrown CommitConflictException");
} catch (CommitConflictException expected) {
assertNotNull(expected.getCause());
assertTrue(expected.getCause() instanceof TransactionWriterException);
}
assertEquals(0, this.cbCount);
assertEquals(1, this.failedCommits);
assertEquals(0, this.afterCommits);
assertEquals(0, this.afterRollbacks);
}
use of org.apache.geode.cache.TransactionEvent in project geode by apache.
the class TXWriterOOMEJUnitTest method testAfterCommitFailedOnThrowOOM.
@Test
public void testAfterCommitFailedOnThrowOOM() throws Exception {
installCacheListenerAndWriter();
// install TransactionWriter
((CacheTransactionManager) this.txMgr).setWriter(new TransactionWriter() {
public void beforeCommit(TransactionEvent event) throws TransactionWriterException {
throw new OutOfMemoryError("this is expected!");
}
public void close() {
}
});
installTransactionListener();
try {
SystemFailureTestHook.setExpectedFailureClass(OutOfMemoryError.class);
this.txMgr.begin();
this.region.create("key1", "value1");
this.cbCount = 0;
try {
this.txMgr.commit();
fail("Commit should have thrown OOME");
} catch (OutOfMemoryError expected) {
// this is what we expect
}
// no callbacks were invoked
assertEquals(0, this.cbCount);
assertEquals(0, this.failedCommits);
assertEquals(0, this.afterCommits);
assertEquals(0, this.afterRollbacks);
} finally {
SystemFailureTestHook.setExpectedFailureClass(null);
}
}
use of org.apache.geode.cache.TransactionEvent in project geode by apache.
the class CallbackArgDUnitTest method doTest.
private void doTest() throws CacheException {
initOtherId();
AttributesFactory af = new AttributesFactory();
af.setDataPolicy(DataPolicy.REPLICATE);
af.setScope(Scope.DISTRIBUTED_ACK);
CacheListener cl1 = new CacheListenerAdapter() {
public void afterCreate(EntryEvent e) {
assertEquals(getCurrentExpectedKey(), e.getKey());
assertEquals(callbackArg, e.getCallbackArgument());
assertEquals(true, e.isCallbackArgumentAvailable());
}
};
af.addCacheListener(cl1);
Region r1 = createRootRegion("r1", af.create());
Region r2 = r1.createSubregion("r2", af.create());
r2.createSubregion("r3", af.create());
TransactionListener tl1 = new TransactionListenerAdapter() {
public void afterCommit(TransactionEvent e) {
assertEquals(6, e.getEvents().size());
ArrayList keys = new ArrayList();
Iterator it = e.getEvents().iterator();
while (it.hasNext()) {
EntryEvent ee = (EntryEvent) it.next();
keys.add(ee.getKey());
assertEquals(callbackArg, ee.getCallbackArgument());
assertEquals(true, ee.isCallbackArgumentAvailable());
}
assertEquals(CallbackArgDUnitTest.this.expectedKeys, keys);
CallbackArgDUnitTest.this.invokeCount = 1;
}
};
CacheTransactionManager ctm = getCache().getCacheTransactionManager();
ctm.addListener(tl1);
this.invokeCount = 0;
this.clCount = 0;
this.expectedKeys = Arrays.asList(new String[] { "b", "c", "a", "a2", "c2", "b2" });
doCommitOtherVm();
assertEquals(1, this.invokeCount);
assertEquals(6, this.clCount);
}
Aggregations