GEODE-96: fix race condition in unit test 
testDistributedRegionClientPutRejection

The race condition was caused by WaitCriterion on the server not waiting for
the region to be marked as sick. Instead it was just waiting for 
OffHeapMemoryMonitor
state to be critical.
Reviewed by Kirk Lund


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/4f8c8cd8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/4f8c8cd8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/4f8c8cd8

Branch: refs/heads/feature/GEODE-77
Commit: 4f8c8cd850640e98ceec1913bc3ed5338e581944
Parents: abb7755
Author: Darrel Schneider <dschnei...@pivotal.io>
Authored: Tue Jul 14 16:53:00 2015 -0700
Committer: Darrel Schneider <dschnei...@pivotal.io>
Committed: Wed Jul 15 10:36:57 2015 -0700

----------------------------------------------------------------------
 .../MemoryThresholdsOffHeapDUnitTest.java       | 48 +++++++++++++++-----
 1 file changed, 37 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/4f8c8cd8/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java
----------------------------------------------------------------------
diff --git 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java
 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java
index aae64c4..0b704a6 100644
--- 
a/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java
+++ 
b/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java
@@ -1401,18 +1401,44 @@ public class MemoryThresholdsOffHeapDUnitTest extends 
BridgeTestCase {
         final OffHeapMemoryMonitor ohm = irm.getOffHeapMonitor();
         assertTrue(ohm.getState().isNormal());
         getCache().getLoggerI18n().fine(addExpectedExString);
-        getRootRegion().getSubregion(regionName).put(1, new byte[943720]);
-        WaitCriterion wc = new WaitCriterion() {
-          @Override
-          public String description() {
-            return "Expected to go critical";
-          }
+        final LocalRegion r = (LocalRegion) 
getRootRegion().getSubregion(regionName);
+        final Object key = 1;
+        r.put(key, new byte[943720]);
+        WaitCriterion wc;
+        if (r instanceof PartitionedRegion) {
+          final PartitionedRegion pr = (PartitionedRegion) r;
+          final int bucketId = PartitionedRegionHelper.getHashKey(pr, null, 
key, null, null);
+          wc = new WaitCriterion() {
+            @Override
+            public String description() {
+              return "Expected to go critical: isCritical=" + 
ohm.getState().isCritical();
+            }
 
-          @Override
-          public boolean done() {
-            return ohm.getState().isCritical();
-          }
-        };
+            @Override
+            public boolean done() {
+              if (!ohm.getState().isCritical()) return false;
+              // Only done once the bucket has been marked sick
+              try {
+                pr.getRegionAdvisor().checkIfBucketSick(bucketId, key);
+                return false;
+              } catch (LowMemoryException ignore) {
+                return true;
+              }
+            }
+          };
+        } else {
+          wc = new WaitCriterion() {
+            @Override
+            public String description() {
+              return "Expected to go critical: isCritical=" + 
ohm.getState().isCritical() + " memoryThresholdReached=" + 
r.memoryThresholdReached.get();
+            }
+
+            @Override
+            public boolean done() {
+              return ohm.getState().isCritical() && 
r.memoryThresholdReached.get();
+            }
+          };
+        }
         waitForCriterion(wc, 5000, 100, true);
         getCache().getLoggerI18n().fine(removeExpectedExString);
         return;

Reply via email to