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 2017/04/05 23:53:40 UTC

geode git commit: The CCPTimer is now purged for every 1000 cancels done. Now uses internalSuspend in two places the previously used suspend. Since internalSuspend does not schedule a timer task these places will have no more issues with leaking memory.

Repository: geode
Updated Branches:
  refs/heads/feature/GEODE-2485 [created] 9f5e394f5


The CCPTimer is now purged for every 1000 cancels done.
Now uses internalSuspend in two places the previously used
suspend. Since internalSuspend does not schedule a timer task
these places will have no more issues with leaking memory.


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

Branch: refs/heads/feature/GEODE-2485
Commit: 9f5e394f57038d03e93c4507414535c244f4597f
Parents: 39c72b2
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Wed Apr 5 16:51:29 2017 -0700
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Wed Apr 5 16:51:29 2017 -0700

----------------------------------------------------------------------
 .../geode/internal/cache/DistributedRegion.java  |  6 +++---
 .../geode/internal/cache/GemFireCacheImpl.java   | 19 +++++++++++++++++++
 .../geode/internal/cache/TXManagerImpl.java      |  5 ++++-
 .../org/apache/geode/internal/cache/TXState.java |  4 ++--
 .../cache/tier/sockets/CacheClientProxy.java     |  8 ++++++--
 5 files changed, 34 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/9f5e394f/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java
index fa02574..08c0b10 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/DistributedRegion.java
@@ -3949,7 +3949,7 @@ public class DistributedRegion extends LocalRegion implements CacheDistributionA
   protected VersionTag fetchRemoteVersionTag(Object key) {
     VersionTag tag = null;
     assert this.dataPolicy != DataPolicy.REPLICATE;
-    TransactionId txId = cache.getCacheTransactionManager().suspend();
+    final TXStateProxy tx = cache.getTXMgr().internalSuspend();
     try {
       boolean retry = true;
       InternalDistributedMember member = getRandomReplicate();
@@ -3971,8 +3971,8 @@ public class DistributedRegion extends LocalRegion implements CacheDistributionA
         }
       }
     } finally {
-      if (txId != null) {
-        cache.getCacheTransactionManager().resume(txId);
+      if (tx != null) {
+        cache.getTXMgr().resume(tx);
       }
     }
     return tag;

http://git-wip-us.apache.org/repos/asf/geode/blob/9f5e394f/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
index 1575517..8c1e30b 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
@@ -3936,6 +3936,25 @@ public class GemFireCacheImpl
     }
   }
 
+  private static final int PURGE_INTERVAL = 1000;
+  private int cancelCount = 0;
+
+  /**
+   * Does a periodic purge of the CCPTimer to prevent a large number of cancelled tasks from
+   * building up in it. See GEODE-2485.
+   */
+  public void purgeCCPTimer() {
+    synchronized (ccpTimerMutex) {
+      if (ccpTimer != null) {
+        cancelCount++;
+        if (cancelCount == PURGE_INTERVAL) {
+          cancelCount = 0;
+          ccpTimer.timerPurge();
+        }
+      }
+    }
+  }
+
   /**
    * @see LocalRegion
    */

http://git-wip-us.apache.org/repos/asf/geode/blob/9f5e394f/geode-core/src/main/java/org/apache/geode/internal/cache/TXManagerImpl.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/TXManagerImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/TXManagerImpl.java
index 14fdf99..e8edfda 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/TXManagerImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/TXManagerImpl.java
@@ -690,7 +690,10 @@ public class TXManagerImpl implements CacheTransactionManager, MembershipListene
       tx.resume();
       SystemTimerTask task = this.expiryTasks.remove(tx.getTransactionId());
       if (task != null) {
-        task.cancel();
+        if (task.cancel()) {
+          GemFireCacheImpl cache = (GemFireCacheImpl) this.cache;
+          cache.purgeCCPTimer();
+        }
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/geode/blob/9f5e394f/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java b/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java
index d577f39..11786b0 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java
@@ -1679,11 +1679,11 @@ public class TXState implements TXStateInterface {
       if (!pr.getBucketPrimary(curr.getBucketId()).equals(pr.cache.getMyId())) {
         // to fix bug 47893 suspend the tx before calling nonTXGetEntry
         final TXManagerImpl txmgr = pr.getGemFireCache().getTXMgr();
-        TransactionId tid = txmgr.suspend();
+        final TXStateProxy tx = txmgr.internalSuspend();
         try {
           return pr.nonTXGetEntry(curr, false, allowTombstones);
         } finally {
-          txmgr.resume(tid);
+          txmgr.resume(tx);
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/geode/blob/9f5e394f/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientProxy.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientProxy.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientProxy.java
index d7b923c..3b0c2ff 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientProxy.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientProxy.java
@@ -1970,7 +1970,9 @@ public class CacheClientProxy implements ClientSession {
          */
         Object task = _durableExpirationTask.getAndSet(null);
         if (task != null) {
-          ((SystemTimerTask) task).cancel();
+          if (((SystemTimerTask) task).cancel()) {
+            _cache.purgeCCPTimer();
+          }
         }
       }
 
@@ -1988,7 +1990,9 @@ public class CacheClientProxy implements ClientSession {
             LocalizedStrings.CacheClientProxy_0_CANCELLING_EXPIRATION_TASK_SINCE_THE_CLIENT_HAS_RECONNECTED,
             this));
       }
-      task.cancel();
+      if (task.cancel()) {
+        _cache.purgeCCPTimer();
+      }
     }
   }