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);