You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by es...@apache.org on 2017/10/17 17:22:37 UTC
[geode] branch feature/GEODE-3521 updated: Add a test case for
testing pause unpause.
This is an automated email from the ASF dual-hosted git repository.
eshu11 pushed a commit to branch feature/GEODE-3521
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/feature/GEODE-3521 by this push:
new 982e30e Add a test case for testing pause unpause.
982e30e is described below
commit 982e30eafb136c61433af32e41dd3b142e0dda64
Author: eshu <es...@pivotal.io>
AuthorDate: Tue Oct 17 10:20:09 2017 -0700
Add a test case for testing pause unpause.
Do not allow a thread to start a new transaction when it paused another transaction.
Use public supsend resume when same thread need to start a new transaction.
---
.../apache/geode/internal/cache/TXManagerImpl.java | 7 ++++
.../test/java/org/apache/geode/TXJUnitTest.java | 49 +++++++++++++++++-----
.../cache/execute/MyTransactionFunction.java | 6 ++-
3 files changed, 49 insertions(+), 13 deletions(-)
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/TXManagerImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/TXManagerImpl.java
index 9d35938..06aac77 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/TXManagerImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/TXManagerImpl.java
@@ -316,6 +316,13 @@ public class TXManagerImpl implements CacheTransactionManager, MembershipListene
.toLocalizedString(tid));
}
}
+ {
+ TXStateProxy curProxy = txContext.get();
+ if (curProxy == PAUSED) {
+ throw new java.lang.IllegalStateException(
+ "Currend thread is in a paused state, it can not start a new transaction");
+ }
+ }
TXId id = new TXId(this.distributionMgrId, this.uniqId.incrementAndGet());
TXStateProxyImpl proxy = null;
if (isDistributed()) {
diff --git a/geode-core/src/test/java/org/apache/geode/TXJUnitTest.java b/geode-core/src/test/java/org/apache/geode/TXJUnitTest.java
index 1c060a7..8f36a9a 100644
--- a/geode-core/src/test/java/org/apache/geode/TXJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/TXJUnitTest.java
@@ -15,6 +15,7 @@
package org.apache.geode;
import static org.apache.geode.distributed.ConfigurationProperties.*;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.Assert.*;
import java.util.ArrayList;
@@ -92,6 +93,7 @@ import org.apache.geode.internal.cache.PartitionedRegion;
import org.apache.geode.internal.cache.TXManagerImpl;
import org.apache.geode.internal.cache.TXStateProxy;
import org.apache.geode.internal.i18n.LocalizedStrings;
+import org.apache.geode.internal.logging.LogService;
import org.apache.geode.internal.util.StopWatch;
import org.apache.geode.test.junit.categories.IntegrationTest;
@@ -4397,10 +4399,10 @@ public class TXJUnitTest {
// TX load conflict: no-inital state, tx load->update, committed update
{
final TXManagerImpl txMgrImpl = (TXManagerImpl) this.txMgr;
- TXStateProxy tx;
+ TransactionId txId = null;
this.txMgr.begin();
reg1.create("key1", "txValue");
- tx = txMgrImpl.pauseTransaction();
+ txId = txMgrImpl.suspend();
assertTrue(!reg1.containsKey("key1"));
// new transaction, load(create) + put
this.txMgr.begin();
@@ -4413,7 +4415,7 @@ public class TXJUnitTest {
assertTrue(reg1.containsKey("key1"));
assertEquals("txValue2", reg1.get("key1"));
assertEquals("txValue2", reg1.getEntry("key1").getValue());
- txMgrImpl.unpauseTransaction(tx);
+ txMgrImpl.resume(txId);
assertEquals("txValue", reg1.getEntry("key1").getValue());
assertEquals("txValue", reg1.get("key1"));
try {
@@ -4905,7 +4907,7 @@ public class TXJUnitTest {
}
@Test
- public void testSuspendResume() {
+ public void testPauseUnpause() {
TXManagerImpl txMgrImpl = (TXManagerImpl) this.txMgr;
assertTrue(!this.txMgr.exists());
assertEquals(null, txMgrImpl.pauseTransaction());
@@ -4919,15 +4921,40 @@ public class TXJUnitTest {
{
TXStateProxy tx = txMgrImpl.pauseTransaction();
assertTrue(!this.txMgr.exists());
+ assertThatThrownBy(() -> this.txMgr.begin()).isInstanceOf(IllegalStateException.class);
+ assertTrue(!this.txMgr.exists());
+ txMgrImpl.unpauseTransaction(tx);
+ }
+ assertTrue(this.txMgr.exists());
+ assertEquals(origId, this.txMgr.getTransactionId());
+ this.txMgr.rollback();
+ }
+
+ @Test
+ public void testSuspendResume() {
+ TXManagerImpl txMgrImpl = (TXManagerImpl) this.txMgr;
+ assertTrue(!this.txMgr.exists());
+ assertEquals(null, txMgrImpl.pauseTransaction());
+ TXStateProxy txProxy = null;
+ txMgrImpl.unpauseTransaction(txProxy);
+ assertTrue(!this.txMgr.exists());
+
+ this.txMgr.begin();
+ TransactionId origId = this.txMgr.getTransactionId();
+ assertTrue(this.txMgr.exists());
+ {
+ TXStateProxy tx = txMgrImpl.internalSuspend();
+ assertTrue(!this.txMgr.exists());
this.txMgr.begin();
try {
- txMgrImpl.unpauseTransaction(tx);
+ txMgrImpl.internalResume(tx);
fail("expected IllegalStateException");
} catch (IllegalStateException expected) {
+ LogService.getLogger().info("expected ", expected);
}
this.txMgr.rollback();
assertTrue(!this.txMgr.exists());
- txMgrImpl.unpauseTransaction(tx);
+ txMgrImpl.internalResume(tx);
}
assertTrue(this.txMgr.exists());
assertEquals(origId, this.txMgr.getTransactionId());
@@ -5868,7 +5895,7 @@ public class TXJUnitTest {
// eviction, force TX eviction
{
final TXManagerImpl txMgrImpl = (TXManagerImpl) this.txMgr;
- TXStateProxy tx1, tx2;
+ TransactionId txId1, txId2;
numToPut = lruSize + 4;
assertEquals(0, lruRegion.entrySet(false).size());
// Create entries
@@ -5884,7 +5911,7 @@ public class TXJUnitTest {
lruRegion.put("key" + i, new Long(i));
}
assertLRUEntries(lruRegion.entrySet(false), numToPut, "key", LRUENTRY_LONG);
- tx1 = txMgrImpl.pauseTransaction();
+ txId1 = txMgrImpl.suspend();
this.txMgr.begin();
assertLRUEntries(lruRegion.entrySet(false), lruSize, "key", LRUENTRY_INTEGER);
@@ -5893,7 +5920,7 @@ public class TXJUnitTest {
lruRegion.put("key" + i, new Double(i));
}
assertLRUEntries(lruRegion.entrySet(false), numToPut, "key", LRUENTRY_DOUBLE);
- tx2 = txMgrImpl.pauseTransaction();
+ txId2 = txMgrImpl.suspend();
assertLRUEntries(lruRegion.entrySet(false), lruSize, "key", LRUENTRY_INTEGER);
@@ -5906,13 +5933,13 @@ public class TXJUnitTest {
assertNull(lruRegion.get("non-tx key0"));
assertLRUEntries(lruRegion.entrySet(false), lruSize, "key", LRUENTRY_INTEGER);
- txMgrImpl.unpauseTransaction(tx1);
+ txMgrImpl.resume(txId1);
assertLRUEntries(lruRegion.entrySet(false), numToPut, "key", LRUENTRY_LONG);
// Check to make sure no conflict was caused by non-TX put evictions
// This should remove all references for each committed entry
this.txMgr.commit();
assertLRUEntries(lruRegion.entrySet(false), lruSize, "key", LRUENTRY_LONG);
- txMgrImpl.unpauseTransaction(tx2);
+ txMgrImpl.resume(txId2);
assertLRUEntries(lruRegion.entrySet(false), numToPut, "key", LRUENTRY_DOUBLE);
this.txMgr.rollback();
assertLRUEntries(lruRegion.entrySet(false), lruSize, "key", LRUENTRY_LONG);
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/execute/MyTransactionFunction.java b/geode-core/src/test/java/org/apache/geode/internal/cache/execute/MyTransactionFunction.java
index d11c82b..bd023eb 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/execute/MyTransactionFunction.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/execute/MyTransactionFunction.java
@@ -25,6 +25,7 @@ import org.apache.geode.cache.EntryNotFoundException;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.TransactionDataNotColocatedException;
import org.apache.geode.cache.TransactionDataRebalancedException;
+import org.apache.geode.cache.TransactionId;
import org.apache.geode.cache.execute.Execution;
import org.apache.geode.cache.execute.Function;
import org.apache.geode.cache.execute.FunctionContext;
@@ -425,7 +426,8 @@ public class MyTransactionFunction implements Function {
TXEntryState txEntry = txRegion.readEntry(txRegion.getEntryKeys().iterator().next());
mImp.unpauseTransaction(txState);
orderPR.put(vOrderId, new Order("foo"));
- txState = mImp.pauseTransaction();
+ TransactionId txId = null;
+ txId = mImp.suspend();
// since both puts were on same key, verify that
// TxRegionState and TXEntryState are same
LocalRegion lr1 = (LocalRegion) txState.getRegions().iterator().next();
@@ -439,7 +441,7 @@ public class MyTransactionFunction implements Function {
orderPR.put(vOrderId, new Order("foobar"));
mImp.commit();
// now begin the first
- mImp.unpauseTransaction(txState);
+ mImp.resume(txId);
boolean caughtException = false;
try {
mImp.commit();
--
To stop receiving notification emails like this one, please contact
['"commits@geode.apache.org" <co...@geode.apache.org>'].