Repository: incubator-geode Updated Branches: refs/heads/develop c67a08fcd -> e1f653056
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/develop Commit: e1f653056e70e71116d2ec681b262bb4480721f1 Parents: c67a08f Author: Darrel Schneider <[email protected]> Authored: Wed Nov 4 17:20:42 2015 -0800 Committer: Darrel Schneider <[email protected]> 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);
