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);