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
