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() {