You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by di...@apache.org on 2015/11/11 00:42:48 UTC

[26/50] [abbrv] incubator-geode git commit: GEODE-500: fix race in OffHeapMemoryUsageListener

GEODE-500: fix race in OffHeapMemoryUsageListener

A race in the run loop existed that caused the usage
listener to quit delivering off-heap events.
This should fix a number of intermittent off-heap
resource manager bugs.


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

Branch: refs/heads/feature/GEODE-12
Commit: e1f653056e70e71116d2ec681b262bb4480721f1
Parents: c67a08f
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Wed Nov 4 17:20:42 2015 -0800
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Thu Nov 5 16:26:35 2015 -0800

----------------------------------------------------------------------
 .../cache/control/OffHeapMemoryMonitor.java        | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e1f65305/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/control/OffHeapMemoryMonitor.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/control/OffHeapMemoryMonitor.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/control/OffHeapMemoryMonitor.java
index bbdb27a..0a6674c 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/control/OffHeapMemoryMonitor.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/control/OffHeapMemoryMonitor.java
@@ -511,11 +511,20 @@ public class OffHeapMemoryMonitor implements ResourceMonitor, MemoryUsageListene
         updateStateAndSendEvent(lastOffHeapMemoryUsed);
 
         synchronized (this) {
-          if (lastOffHeapMemoryUsed == this.offHeapMemoryUsed && !this.stopRequested) {
-            try {
+          long newOffHeapMemoryUsed = this.offHeapMemoryUsed;
+          if (this.stopRequested) {
+            // no need to wait since we are stopping
+          } else if (lastOffHeapMemoryUsed != newOffHeapMemoryUsed) {
+            // no need to wait since memory used has changed
+            // This fixes a race like bug GEODE-500
+            lastOffHeapMemoryUsed = newOffHeapMemoryUsed;
+          } else {
+            // wait for memory used to change
+            try {  
               do {
                 this.wait(1000);
-                if (this.offHeapMemoryUsed == lastOffHeapMemoryUsed) {
+                newOffHeapMemoryUsed = this.offHeapMemoryUsed;
+                if (newOffHeapMemoryUsed == lastOffHeapMemoryUsed) {
                   // The wait timed out. So tell the OffHeapMemoryMonitor
                   // that we need an event if the state is not normal.
                   deliverNextAbnormalEvent();
@@ -536,7 +545,7 @@ public class OffHeapMemoryMonitor implements ResourceMonitor, MemoryUsageListene
                 } else {
                   // we have been notified so exit the inner while loop
                   // and call updateStateAndSendEvent.
-                  lastOffHeapMemoryUsed = this.offHeapMemoryUsed;
+                  lastOffHeapMemoryUsed = newOffHeapMemoryUsed;
                   break;
                 }
               } while (!this.stopRequested);