Repository: incubator-geode
Updated Branches:
  refs/heads/feature/GEODE-1885 7f1f4b258 -> 46fe59291


putEntryIfAbsent now only releases the current entry if it has an off-heap 
reference


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

Branch: refs/heads/feature/GEODE-1885
Commit: 46fe59291dab6a211bb5fa448522f477f2a00c2e
Parents: 7f1f4b2
Author: Darrel Schneider <[email protected]>
Authored: Fri Sep 23 15:35:54 2016 -0700
Committer: Darrel Schneider <[email protected]>
Committed: Fri Sep 23 15:35:54 2016 -0700

----------------------------------------------------------------------
 .../geode/internal/cache/AbstractRegionMap.java      | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/46fe5929/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
index 65aebd1..5861e9a 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
@@ -48,6 +48,7 @@ import org.apache.geode.internal.logging.log4j.LogMarker;
 import org.apache.geode.internal.offheap.OffHeapHelper;
 import org.apache.geode.internal.offheap.OffHeapRegionEntryHelper;
 import org.apache.geode.internal.offheap.ReferenceCountHelper;
+import org.apache.geode.internal.offheap.StoredObject;
 import org.apache.geode.internal.offheap.annotations.Released;
 import org.apache.geode.internal.offheap.annotations.Retained;
 import org.apache.geode.internal.offheap.annotations.Unretained;
@@ -246,15 +247,19 @@ public abstract class AbstractRegionMap implements 
RegionMap {
 
 
   public final RegionEntry putEntryIfAbsent(Object key, RegionEntry re) {
-    RegionEntry value = (RegionEntry)_getMap().putIfAbsent(key, re);
-    if (value == null && (re instanceof OffHeapRegionEntry) 
+    RegionEntry oldRe = (RegionEntry)_getMap().putIfAbsent(key, re);
+    if (oldRe == null && (re instanceof OffHeapRegionEntry) 
         && _isOwnerALocalRegion() && 
_getOwner().isThisRegionBeingClosedOrDestroyed()) {
       // prevent orphan during concurrent destroy (#48068)
-      if (_getMap().remove(key, re)) {
-        ((OffHeapRegionEntry)re).release();
+      Object v = re._getValue();
+      if (v != Token.REMOVED_PHASE1 && v != Token.REMOVED_PHASE2
+          && v instanceof StoredObject && ((StoredObject)v).hasRefCount()) {
+        if (_getMap().remove(key, re)) {
+          ((OffHeapRegionEntry)re).release();
+        }
       }
     }
-    return value;
+    return oldRe;
   }
 
   @Override

Reply via email to