You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2016/01/08 19:42:15 UTC

[14/47] incubator-geode git commit: merge of hot-fix from closed-source 8.2x maintenance branch

merge of hot-fix from closed-source 8.2x maintenance branch

The tombstone GC service ran into an NPE removing a tombstone and then
the thread went hot because exception-handling was not advancing to the
next GC candidate.  This revision attempts to avoid the NPE (which was
not reported with line numbers) and alters the exception-handling to
advance to the next tombstone if there is an unexpected problem removing
the current tombstone.


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

Branch: refs/heads/feature/GEODE-714
Commit: 4bc1b28a13b952f6f043ee9f7f28a8d3a9220f1f
Parents: d19bb41
Author: Bruce Schuchardt <bs...@pivotal.io>
Authored: Mon Jan 4 15:26:05 2016 -0800
Committer: Bruce Schuchardt <bs...@pivotal.io>
Committed: Mon Jan 4 15:28:43 2016 -0800

----------------------------------------------------------------------
 .../gemfire/internal/cache/AbstractRegionMap.java         |  6 ++++--
 .../gemstone/gemfire/internal/cache/TombstoneService.java | 10 ++++++++++
 2 files changed, 14 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/4bc1b28a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/AbstractRegionMap.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/AbstractRegionMap.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/AbstractRegionMap.java
index 6d49d74..f4fb044 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/AbstractRegionMap.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/AbstractRegionMap.java
@@ -4269,7 +4269,6 @@ RETRY_LOOP:
   public final boolean removeTombstone(RegionEntry re, VersionHolder version, boolean isEviction, boolean isScheduledTombstone)  {
     boolean result = false;
     int destroyedVersion = version.getEntryVersion();
-    DiskRegion dr = this._getOwner().getDiskRegion();
 
     synchronized(this._getOwner().getSizeGuard()) { // do this sync first; see bug 51985
         synchronized (re) {
@@ -4303,7 +4302,10 @@ RETRY_LOOP:
                 if (isScheduledTombstone) {
                   _getOwner().incTombstoneCount(-1);
                 }
-                _getOwner().getVersionVector().recordGCVersion(version.getMemberID(), version.getRegionVersion());
+                RegionVersionVector vector = _getOwner().getVersionVector();
+                if (vector != null) {
+                  vector.recordGCVersion(version.getMemberID(), version.getRegionVersion());
+                }
               }
             } catch (RegionClearedException e) {
               // if the region has been cleared we don't need to remove the tombstone

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/4bc1b28a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/TombstoneService.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/TombstoneService.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/TombstoneService.java
index 9fc5032..0814b34 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/TombstoneService.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/TombstoneService.java
@@ -204,6 +204,10 @@ public class TombstoneService  implements ResourceListener<MemoryEvent> {
    * @param destroyedVersion the version that was destroyed
    */
   public void scheduleTombstone(LocalRegion r, RegionEntry entry, VersionTag destroyedVersion) {
+    if (entry.getVersionStamp() == null) {
+      logger.warn("Detected an attempt to schedule a tombstone for an entry that is not versioned in region " + r.getFullPath(), new Exception("stack trace"));
+      return;
+    }
     boolean useReplicated = useReplicatedQueue(r);
     Tombstone ts = new Tombstone(entry, r, destroyedVersion);
     if (useReplicated) {
@@ -871,6 +875,12 @@ public class TombstoneService  implements ResourceListener<MemoryEvent> {
               return;
             } catch (Exception e) {
               logger.warn(LocalizedMessage.create(LocalizedStrings.GemFireCacheImpl_TOMBSTONE_ERROR), e);
+              currentTombstoneLock.lock();
+              try {
+                currentTombstone = null;
+              } finally {
+                currentTombstoneLock.unlock();
+              }
             }
           }
           if (sleepTime > 0) {