You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2016/06/28 01:05:21 UTC

incubator-geode git commit: run now uses foreachTombstone to do scan

Repository: incubator-geode
Updated Branches:
  refs/heads/feature/GEODE-1420 b57d9244c -> 91fe4f83f


run now uses foreachTombstone to do scan


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

Branch: refs/heads/feature/GEODE-1420
Commit: 91fe4f83ffa5f5bf4013c97d1df6633a0ce544bb
Parents: b57d924
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Mon Jun 27 18:04:42 2016 -0700
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Mon Jun 27 18:04:42 2016 -0700

----------------------------------------------------------------------
 .../internal/cache/TombstoneService.java        | 43 +++++++++-----------
 1 file changed, 19 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/91fe4f83/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/TombstoneService.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/TombstoneService.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/TombstoneService.java
index 0c28b84..b417c78 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/TombstoneService.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/TombstoneService.java
@@ -465,23 +465,30 @@ public class TombstoneService {
       this.sweeperThread.setName(threadName);
     }
 
-  public void foreachTombstone(Predicate<Tombstone> predicate) {
+    /**
+     * @return true if predicate ever returned true
+     */
+  public boolean foreachTombstone(Predicate<Tombstone> predicate) {
+    boolean result = false;
     Tombstone currentTombstone = lockAndGetCurrentTombstone();
     try {
       if (currentTombstone != null) {
         if (predicate.test(currentTombstone)) {
           clearCurrentTombstone();
+          result = true;
         }
       }
       for (Iterator<Tombstone> it=getQueue().iterator(); it.hasNext(); ) {
         Tombstone t = it.next();
         if (predicate.test(t)) {
           it.remove();
+          result = true;
         }
       }
     } finally {
       unlock();
     }
+    return result;
   }
 
   synchronized void start() {
@@ -749,13 +756,11 @@ public class TombstoneService {
                   incQueueSize(-myTombstone.getSize());
                   myTombstone.region.getRegionMap().removeTombstone(myTombstone.entry, myTombstone, false, true);
                 }
-                myTombstone = null;
                 clearCurrentTombstone();
               } catch (CancelException e) {
                 return;
               } catch (Exception e) {
                 logger.warn(LocalizedMessage.create(LocalizedStrings.GemFireCacheImpl_TOMBSTONE_ERROR), e);
-                myTombstone = null;
                 clearCurrentTombstone();
               }
             }
@@ -767,33 +772,27 @@ public class TombstoneService {
                 lastScanTime = now;
                 long start = now;
                 // see if any have been superseded
-                for (Iterator<Tombstone> it = getQueue().iterator(); it.hasNext(); ) {
-                  Tombstone test = it.next();
+                boolean scanHit = foreachTombstone(test -> {
                   if (test.region.getRegionMap().isTombstoneNotNeeded(test.entry, test.getEntryVersion())) {
                     if (logger.isTraceEnabled(LogMarker.TOMBSTONE)) {
                       logger.trace(LogMarker.TOMBSTONE, "removing obsolete tombstone: {}", test);
                     }
-                    it.remove();
                     incQueueSize(-test.getSize());
-                    if (test == myTombstone) {
-                      myTombstone = null;
-                      clearCurrentTombstone();
-                      sleepTime = 0;
-                    }
-                  } else if (batchMode && (test.getVersionTimeStamp()+expiryTime) <= now) {
-                    it.remove();
+                    return true;
+                  }
+                  if (batchMode && (test.getVersionTimeStamp()+expiryTime) <= now) {
                     if (logger.isTraceEnabled(LogMarker.TOMBSTONE)) {
                       logger.trace(LogMarker.TOMBSTONE, "expiring tombstone {}", test);
                     }
                     expiredTombstones.add(test);
-                    sleepTime = 0;
-                    if (test == myTombstone) {
-                      myTombstone = null;
-                      clearCurrentTombstone();
-                    }
+                    return true;
                   }
+                  return false;
+                });
+                if (scanHit) {
+                  sleepTime = 0;
                 }
-                // now check the batch of timed-out tombstones, if there is one
+                // now scan the batch of timed-out tombstones
                 if (batchMode) {
                   for (Iterator<Tombstone> it = expiredTombstones.iterator(); it.hasNext(); ) {
                     Tombstone test = it.next();
@@ -803,11 +802,7 @@ public class TombstoneService {
                       }
                       it.remove();
                       incQueueSize(-test.getSize());
-                      if (test == myTombstone) {
-                        myTombstone = null;
-                        clearCurrentTombstone();
-                        sleepTime = 0;
-                      }
+                      sleepTime = 0;
                     }
                   }
                 }