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/22 00:13:30 UTC

geode git commit: close OffHeapEvictor when cache is closed

Repository: geode
Updated Branches:
  refs/heads/feature/GEODE-2811 [created] 24d69907d


close OffHeapEvictor when cache is closed


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

Branch: refs/heads/feature/GEODE-2811
Commit: 24d69907d5d33a56f6e3eb3bec47579b881c094a
Parents: 45dc674
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Fri Apr 21 17:09:23 2017 -0700
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Fri Apr 21 17:09:23 2017 -0700

----------------------------------------------------------------------
 .../geode/internal/cache/GemFireCacheImpl.java  | 28 +++++++++++++++++---
 .../geode/internal/cache/lru/HeapEvictor.java   | 13 +++++----
 .../internal/cache/GemFireCacheImplTest.java    | 21 +++++++++++++++
 3 files changed, 53 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/24d69907/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 56243e1..aee0ce8 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
@@ -2105,6 +2105,14 @@ public class GemFireCacheImpl
       return this.offHeapEvictor;
     }
   }
+  /** Used by test to inject an evictor */
+  void setOffHeapEvictor(OffHeapEvictor evictor) {
+    this.offHeapEvictor = evictor;
+  }
+  /** Used by test to inject an evictor */
+  void setHeapEvictor(HeapEvictor evictor) {
+    this.heapEvictor = evictor;
+  }
 
   @Override
   public PersistentMemberManager getPersistentMemberManager() {
@@ -2394,11 +2402,9 @@ public class GemFireCacheImpl
             if (cms != null) {
               cms.close();
             }
-            HeapEvictor he = this.heapEvictor;
-            if (he != null) {
-              he.close();
-            }
           }
+          closeHeapEvictor();
+          closeOffHeapEvictor();
         } catch (CancelException e) {
           // make sure the disk stores get closed
           closeDiskStores();
@@ -2482,6 +2488,20 @@ public class GemFireCacheImpl
 
   }
 
+  private void closeOffHeapEvictor() {
+    OffHeapEvictor evictor = this.offHeapEvictor;
+    if (evictor != null) {
+      evictor.close();
+    }
+  }
+
+  private void closeHeapEvictor() {
+    HeapEvictor evictor = this.heapEvictor;
+    if (evictor != null) {
+      evictor.close();
+    }
+  }
+
   // see Cache.isReconnecting()
   @Override
   public boolean isReconnecting() {

http://git-wip-us.apache.org/repos/asf/geode/blob/24d69907/geode-core/src/main/java/org/apache/geode/internal/cache/lru/HeapEvictor.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/lru/HeapEvictor.java b/geode-core/src/main/java/org/apache/geode/internal/cache/lru/HeapEvictor.java
index b22bb0e..899d5b7 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/lru/HeapEvictor.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/lru/HeapEvictor.java
@@ -94,7 +94,7 @@ public class HeapEvictor implements ResourceListener<MemoryEvent> {
 
   private BlockingQueue<Runnable> poolQueue;
 
-  private AtomicBoolean isRunning = new AtomicBoolean(true);
+  private final AtomicBoolean isRunning = new AtomicBoolean(true);
 
   public HeapEvictor(Cache gemFireCache) {
     this.cache = gemFireCache;
@@ -203,7 +203,7 @@ public class HeapEvictor implements ResourceListener<MemoryEvent> {
   }
 
   public ThreadPoolExecutor getEvictorThreadPool() {
-    if (isRunning.get()) {
+    if (isRunning()) {
       return evictorThreadPool;
     }
     return null;
@@ -215,7 +215,7 @@ public class HeapEvictor implements ResourceListener<MemoryEvent> {
    * @return sum of scheduled and running tasks
    */
   public int getRunningAndScheduledTasks() {
-    if (isRunning.get()) {
+    if (isRunning()) {
       return this.evictorThreadPool.getActiveCount() + this.evictorThreadPool.getQueue().size();
     }
     return -1;
@@ -327,7 +327,7 @@ public class HeapEvictor implements ResourceListener<MemoryEvent> {
 
     // Do we care about eviction events and did the eviction event originate
     // in this VM ...
-    if (this.isRunning.get() && event.isLocal()) {
+    if (isRunning() && event.isLocal()) {
       if (event.getState().isEviction()) {
         final LogWriter logWriter = cache.getLogger();
 
@@ -450,9 +450,12 @@ public class HeapEvictor implements ResourceListener<MemoryEvent> {
     getEvictorThreadPool().shutdownNow();
     isRunning.set(false);
   }
+  public boolean isRunning() {
+    return isRunning.get();
+  }
 
   public ArrayList testOnlyGetSizeOfTasks() {
-    if (isRunning.get())
+    if (isRunning())
       return testTaskSetSizes;
     return null;
   }

http://git-wip-us.apache.org/repos/asf/geode/blob/24d69907/geode-core/src/test/java/org/apache/geode/internal/cache/GemFireCacheImplTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/GemFireCacheImplTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/GemFireCacheImplTest.java
index 6838e74..ef6e09d 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/GemFireCacheImplTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/GemFireCacheImplTest.java
@@ -28,6 +28,8 @@ import org.junit.experimental.categories.Category;
 
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.internal.SystemTimer;
+import org.apache.geode.internal.cache.lru.HeapEvictor;
+import org.apache.geode.internal.cache.lru.OffHeapEvictor;
 import org.apache.geode.pdx.internal.TypeRegistry;
 import org.apache.geode.test.fake.Fakes;
 import org.apache.geode.test.junit.categories.UnitTest;
@@ -60,6 +62,25 @@ public class GemFireCacheImplTest {
       gfc.close();
     }
   }
+  
+  @Test
+  public void checkEvictorsClosed() {
+    InternalDistributedSystem ds = Fakes.distributedSystem();
+    CacheConfig cc = new CacheConfig();
+    TypeRegistry typeRegistry = mock(TypeRegistry.class);
+    SystemTimer ccpTimer = mock(SystemTimer.class);
+    HeapEvictor he = mock(HeapEvictor.class);
+    OffHeapEvictor ohe = mock(OffHeapEvictor.class);
+    GemFireCacheImpl gfc = GemFireCacheImpl.createWithAsyncEventListeners(ds, cc, typeRegistry);
+    try {
+      gfc.setHeapEvictor(he);
+      gfc.setOffHeapEvictor(ohe);
+    } finally {
+      gfc.close();
+    }
+    verify(he, times(1)).close();
+    verify(ohe, times(1)).close();
+  }
 
   @Test
   public void checkThatAsyncEventListenersUseAllThreadsInPool() {