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/11/03 22:11:48 UTC
[1/3] incubator-geode git commit: now uses an atomic and a count down
latch during shutDownAll
Repository: incubator-geode
Updated Branches:
refs/heads/feature/GEM-983 2f251c47d -> 3c27307c3
now uses an atomic and a count down latch during shutDownAll
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/b5b42bfb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/b5b42bfb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/b5b42bfb
Branch: refs/heads/feature/GEM-983
Commit: b5b42bfb13c7a12fd7aa3deae95a94e5301505ff
Parents: 2f251c4
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Wed Nov 2 15:49:40 2016 -0700
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Wed Nov 2 15:49:40 2016 -0700
----------------------------------------------------------------------
.../geode/internal/cache/GemFireCacheImpl.java | 105 ++++++++++---------
1 file changed, 58 insertions(+), 47 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/b5b42bfb/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 7514605..a04ce17 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
@@ -213,6 +213,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
@@ -543,7 +544,8 @@ public class GemFireCacheImpl
private final Object clientMetaDatServiceLock = new Object();
- private volatile boolean isShutDownAll = false;
+ private final AtomicBoolean isShutDownAll = new AtomicBoolean();
+ private final CountDownLatch shutDownAllFinished = new CountDownLatch(1);
private final ResourceAdvisor resourceAdvisor;
private final JmxManagerAdvisor jmxAdvisor;
@@ -1735,7 +1737,7 @@ public class GemFireCacheImpl
}
public boolean isCacheAtShutdownAll() {
- return isShutDownAll;
+ return isShutDownAll.get();
}
/**
@@ -1752,58 +1754,67 @@ public class GemFireCacheImpl
}
public void shutDownAll() {
+ if (!this.isShutDownAll.compareAndSet(false, true)) {
+ // it's already doing shutdown by another thread
+ try {
+ this.shutDownAllFinished.await();
+ } catch (InterruptedException e) {
+ logger.debug("Shutdown all interrupted while waiting for another thread to do the shutDownAll");
+ Thread.currentThread().interrupt();
+ }
+ return;
+ }
synchronized (GemFireCacheImpl.class) {
- boolean testIGE = Boolean.getBoolean("TestInternalGemFireError");
+ try {
+ boolean testIGE = Boolean.getBoolean("TestInternalGemFireError");
- if (testIGE) {
- InternalGemFireError assErr = new InternalGemFireError(
- LocalizedStrings.GemFireCache_UNEXPECTED_EXCEPTION.toLocalizedString());
- throw assErr;
- }
- if (isCacheAtShutdownAll()) {
- // it's already doing shutdown by another thread
- return;
- }
- if (LocalRegion.ISSUE_CALLBACKS_TO_CACHE_OBSERVER) {
- try {
- CacheObserverHolder.getInstance().beforeShutdownAll();
- } finally {
- LocalRegion.ISSUE_CALLBACKS_TO_CACHE_OBSERVER = false;
+ if (testIGE) {
+ InternalGemFireError assErr = new InternalGemFireError(
+ LocalizedStrings.GemFireCache_UNEXPECTED_EXCEPTION.toLocalizedString());
+ throw assErr;
}
- }
- this.isShutDownAll = true;
-
- // bug 44031 requires multithread shutdownall should be grouped
- // by root region. However, shutDownAllDuringRecovery.conf test revealed that
- // we have to close colocated child regions first.
- // Now check all the PR, if anyone has colocate-with attribute, sort all the
- // PRs by colocation relationship and close them sequentially, otherwise still
- // group them by root region.
- TreeMap<String, Map<String, PartitionedRegion>> prTrees = getPRTrees();
- if (prTrees.size() > 1 && shutdownAllPoolSize != 1) {
- ExecutorService es = getShutdownAllExecutorService(prTrees.size());
- for (final Map<String, PartitionedRegion> prSubMap : prTrees.values()) {
- es.execute(new Runnable() {
- public void run() {
- ConnectionTable.threadWantsSharedResources();
- shutdownSubTreeGracefully(prSubMap);
- }
- });
- } // for each root
- es.shutdown();
- try {
- es.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- logger.debug("Shutdown all interrupted while waiting for PRs to be shutdown gracefully.");
+ if (LocalRegion.ISSUE_CALLBACKS_TO_CACHE_OBSERVER) {
+ try {
+ CacheObserverHolder.getInstance().beforeShutdownAll();
+ } finally {
+ LocalRegion.ISSUE_CALLBACKS_TO_CACHE_OBSERVER = false;
+ }
}
- } else {
- for (final Map<String, PartitionedRegion> prSubMap : prTrees.values()) {
- shutdownSubTreeGracefully(prSubMap);
+ // bug 44031 requires multithread shutdownall should be grouped
+ // by root region. However, shutDownAllDuringRecovery.conf test revealed that
+ // we have to close colocated child regions first.
+ // Now check all the PR, if anyone has colocate-with attribute, sort all the
+ // PRs by colocation relationship and close them sequentially, otherwise still
+ // group them by root region.
+ TreeMap<String, Map<String, PartitionedRegion>> prTrees = getPRTrees();
+ if (prTrees.size() > 1 && shutdownAllPoolSize != 1) {
+ ExecutorService es = getShutdownAllExecutorService(prTrees.size());
+ for (final Map<String, PartitionedRegion> prSubMap : prTrees.values()) {
+ es.execute(new Runnable() {
+ public void run() {
+ ConnectionTable.threadWantsSharedResources();
+ shutdownSubTreeGracefully(prSubMap);
+ }
+ });
+ } // for each root
+ es.shutdown();
+ try {
+ es.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ logger.debug("Shutdown all interrupted while waiting for PRs to be shutdown gracefully.");
+ }
+
+ } else {
+ for (final Map<String, PartitionedRegion> prSubMap : prTrees.values()) {
+ shutdownSubTreeGracefully(prSubMap);
+ }
}
- }
- close("Shut down all members", null, false, true);
+ close("Shut down all members", null, false, true);
+ } finally {
+ this.shutDownAllFinished.countDown();
+ }
}
}
[3/3] incubator-geode git commit: formatting
Posted by ds...@apache.org.
formatting
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/3c27307c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/3c27307c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/3c27307c
Branch: refs/heads/feature/GEM-983
Commit: 3c27307c3c1e91fbad46541fe05929a629f79ed2
Parents: 2cb9aa0
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Thu Nov 3 15:10:48 2016 -0700
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Thu Nov 3 15:10:48 2016 -0700
----------------------------------------------------------------------
.../java/org/apache/geode/internal/cache/GemFireCacheImpl.java | 6 ++++--
.../geode/internal/cache/partitioned/ShutdownAllDUnitTest.java | 6 +++++-
2 files changed, 9 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/3c27307c/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 a04ce17..c76bf2b 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
@@ -1759,7 +1759,8 @@ public class GemFireCacheImpl
try {
this.shutDownAllFinished.await();
} catch (InterruptedException e) {
- logger.debug("Shutdown all interrupted while waiting for another thread to do the shutDownAll");
+ logger.debug(
+ "Shutdown all interrupted while waiting for another thread to do the shutDownAll");
Thread.currentThread().interrupt();
}
return;
@@ -1802,7 +1803,8 @@ public class GemFireCacheImpl
try {
es.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
} catch (InterruptedException e) {
- logger.debug("Shutdown all interrupted while waiting for PRs to be shutdown gracefully.");
+ logger
+ .debug("Shutdown all interrupted while waiting for PRs to be shutdown gracefully.");
}
} else {
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/3c27307c/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ShutdownAllDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ShutdownAllDUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ShutdownAllDUnitTest.java
index 304604e..52d1327 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ShutdownAllDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ShutdownAllDUnitTest.java
@@ -196,8 +196,10 @@ public class ShutdownAllDUnitTest extends JUnit4CacheTestCase {
private static final AtomicBoolean calledCreateCache = new AtomicBoolean();
private static final AtomicBoolean calledCloseCache = new AtomicBoolean();
private static CacheLifecycleListener cll;
+
@Test
- public void testShutdownAllInterruptsCacheCreation() throws ExecutionException, InterruptedException, TimeoutException {
+ public void testShutdownAllInterruptsCacheCreation()
+ throws ExecutionException, InterruptedException, TimeoutException {
Host host = Host.getHost(0);
VM vm0 = host.getVM(0);
VM vm2 = host.getVM(2);
@@ -211,6 +213,7 @@ public class ShutdownAllDUnitTest extends JUnit4CacheTestCase {
calledCreateCache.set(true);
Awaitility.await().atMost(90, TimeUnit.SECONDS).until(() -> cache.isCacheAtShutdownAll());
}
+
@Override
public void cacheClosed(GemFireCacheImpl cache) {
calledCloseCache.set(true);
@@ -240,6 +243,7 @@ public class ShutdownAllDUnitTest extends JUnit4CacheTestCase {
});
}
}
+
@Test
public void testShutdownAllOneServerAndRecover() throws Throwable {
Host host = Host.getHost(0);
[2/3] incubator-geode git commit: added shutdownAll unit test that
hangs if it waits for cache create to finish
Posted by ds...@apache.org.
added shutdownAll unit test that hangs if it waits for cache create to finish
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/2cb9aa08
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/2cb9aa08
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/2cb9aa08
Branch: refs/heads/feature/GEM-983
Commit: 2cb9aa081ee5e6f16e0a66be91cf300c5dda71fe
Parents: b5b42bf
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Thu Nov 3 15:05:09 2016 -0700
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Thu Nov 3 15:05:09 2016 -0700
----------------------------------------------------------------------
.../cache/partitioned/ShutdownAllDUnitTest.java | 53 ++++++++++++++++++++
1 file changed, 53 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/2cb9aa08/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ShutdownAllDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ShutdownAllDUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ShutdownAllDUnitTest.java
index 1bb06f1..304604e 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ShutdownAllDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/ShutdownAllDUnitTest.java
@@ -21,8 +21,12 @@ import java.io.IOException;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import com.jayway.awaitility.Awaitility;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -44,7 +48,9 @@ import org.apache.geode.cache.Region;
import org.apache.geode.cache.server.CacheServer;
import org.apache.geode.cache.util.CacheListenerAdapter;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.internal.cache.CacheLifecycleListener;
import org.apache.geode.internal.cache.DiskRegion;
+import org.apache.geode.internal.cache.GemFireCacheImpl;
import org.apache.geode.internal.cache.PartitionedRegion;
import org.apache.geode.internal.cache.control.InternalResourceManager;
import org.apache.geode.internal.cache.control.InternalResourceManager.ResourceObserver;
@@ -187,6 +193,53 @@ public class ShutdownAllDUnitTest extends JUnit4CacheTestCase {
vm1.invoke(removeExceptionTag1(expectedExceptions));
}
+ private static final AtomicBoolean calledCreateCache = new AtomicBoolean();
+ private static final AtomicBoolean calledCloseCache = new AtomicBoolean();
+ private static CacheLifecycleListener cll;
+ @Test
+ public void testShutdownAllInterruptsCacheCreation() throws ExecutionException, InterruptedException, TimeoutException {
+ Host host = Host.getHost(0);
+ VM vm0 = host.getVM(0);
+ VM vm2 = host.getVM(2);
+ closeAllCache();
+ // in vm0 create the cache in a way that hangs until
+ // it sees that a shutDownAll is in progress
+ AsyncInvocation<?> asyncCreate = vm0.invokeAsync(() -> {
+ cll = new CacheLifecycleListener() {
+ @Override
+ public void cacheCreated(GemFireCacheImpl cache) {
+ calledCreateCache.set(true);
+ Awaitility.await().atMost(90, TimeUnit.SECONDS).until(() -> cache.isCacheAtShutdownAll());
+ }
+ @Override
+ public void cacheClosed(GemFireCacheImpl cache) {
+ calledCloseCache.set(true);
+ }
+ };
+ GemFireCacheImpl.addCacheLifecycleListener(cll);
+ getCache();
+ });
+ try {
+ boolean vm0CalledCreateCache = vm0.invoke(() -> {
+ Awaitility.await().atMost(90, TimeUnit.SECONDS).until(() -> calledCreateCache.get());
+ return calledCreateCache.get();
+ });
+ assertTrue(vm0CalledCreateCache);
+ shutDownAllMembers(vm2, 1);
+ asyncCreate.get(60, TimeUnit.SECONDS);
+ boolean vm0CalledCloseCache = vm0.invoke(() -> {
+ Awaitility.await().atMost(90, TimeUnit.SECONDS).until(() -> calledCloseCache.get());
+ return calledCloseCache.get();
+ });
+ assertTrue(vm0CalledCloseCache);
+ } finally {
+ vm0.invoke(() -> {
+ calledCreateCache.set(false);
+ calledCloseCache.set(false);
+ GemFireCacheImpl.removeCacheLifecycleListener(cll);
+ });
+ }
+ }
@Test
public void testShutdownAllOneServerAndRecover() throws Throwable {
Host host = Host.getHost(0);