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 2015/11/03 20:38:36 UTC

[04/35] incubator-geode git commit: GEODE-464: Fix AutoBalancer test race condition

GEODE-464: Fix AutoBalancer test race condition

Instance of cache Initializer is not destroyed when the cache is destroyed. As a
result, a scheduled rebalance job can start after a different test starts. This
can cause failures. Add a destroy method to kill scheduler in test tearDown to
prevent orphaned tasks from failing other tests.


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

Branch: refs/heads/develop
Commit: 82966c466a219f6a3674af0e702b9b12194c8c38
Parents: b6446dc
Author: Ashvin Agrawal <as...@apache.org>
Authored: Mon Oct 26 15:28:22 2015 -0700
Committer: Ashvin Agrawal <as...@apache.org>
Committed: Mon Oct 26 15:36:42 2015 -0700

----------------------------------------------------------------------
 .../gemfire/cache/util/AutoBalancer.java        | 14 +++++++
 .../util/AutoBalancerIntegrationJUnitTest.java  |  5 +++
 .../cache/util/AutoBalancerJUnitTest.java       | 39 ++++++++++++++++++++
 3 files changed, 58 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/82966c46/gemfire-rebalancer/src/main/java/com/gemstone/gemfire/cache/util/AutoBalancer.java
----------------------------------------------------------------------
diff --git a/gemfire-rebalancer/src/main/java/com/gemstone/gemfire/cache/util/AutoBalancer.java b/gemfire-rebalancer/src/main/java/com/gemstone/gemfire/cache/util/AutoBalancer.java
index 633ae39..48fec09 100644
--- a/gemfire-rebalancer/src/main/java/com/gemstone/gemfire/cache/util/AutoBalancer.java
+++ b/gemfire-rebalancer/src/main/java/com/gemstone/gemfire/cache/util/AutoBalancer.java
@@ -225,6 +225,9 @@ public class AutoBalancer implements Declarable {
         public void run() {
           try {
             auditor.execute();
+          } catch (CacheClosedException e) {
+            logger.warn("Cache closed while attempting to rebalance the cluster. Abort future jobs", e);
+            return;
           } catch (Exception e) {
             logger.warn("Error while executing out-of-balance audit.", e);
           }
@@ -232,6 +235,11 @@ public class AutoBalancer implements Declarable {
         }
       }, delay, TimeUnit.MILLISECONDS);
     }
+
+    @Override
+    public void destroy() {
+      trigger.shutdownNow();
+    }
   }
 
   /**
@@ -502,6 +510,8 @@ public class AutoBalancer implements Declarable {
 
   interface AuditScheduler {
     void init(String schedule);
+
+    void destroy();
   }
 
   interface OOBAuditor {
@@ -537,4 +547,8 @@ public class AutoBalancer implements Declarable {
   public CacheOperationFacade getCacheOperationFacade() {
     return this.cacheFacade;
   }
+
+  public void destroy() {
+    scheduler.destroy();
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/82966c46/gemfire-rebalancer/src/test/java/com/gemstone/gemfire/cache/util/AutoBalancerIntegrationJUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-rebalancer/src/test/java/com/gemstone/gemfire/cache/util/AutoBalancerIntegrationJUnitTest.java b/gemfire-rebalancer/src/test/java/com/gemstone/gemfire/cache/util/AutoBalancerIntegrationJUnitTest.java
index cff9d69..e50103c 100755
--- a/gemfire-rebalancer/src/test/java/com/gemstone/gemfire/cache/util/AutoBalancerIntegrationJUnitTest.java
+++ b/gemfire-rebalancer/src/test/java/com/gemstone/gemfire/cache/util/AutoBalancerIntegrationJUnitTest.java
@@ -51,6 +51,11 @@ public class AutoBalancerIntegrationJUnitTest {
       DLockService.destroy(AutoBalancer.AUTO_BALANCER_LOCK_SERVICE_NAME);
     }
 
+    AutoBalancer autoBalancer = (AutoBalancer) cache.getInitializer();
+    if (autoBalancer != null) {
+      autoBalancer.destroy();
+    }
+
     if (cache != null && !cache.isClosed()) {
       try {
         final HostStatSampler statSampler = ((InternalDistributedSystem) cache.getDistributedSystem()).getStatSampler();

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/82966c46/gemfire-rebalancer/src/test/java/com/gemstone/gemfire/cache/util/AutoBalancerJUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-rebalancer/src/test/java/com/gemstone/gemfire/cache/util/AutoBalancerJUnitTest.java b/gemfire-rebalancer/src/test/java/com/gemstone/gemfire/cache/util/AutoBalancerJUnitTest.java
index c0b6725..cb88022 100644
--- a/gemfire-rebalancer/src/test/java/com/gemstone/gemfire/cache/util/AutoBalancerJUnitTest.java
+++ b/gemfire-rebalancer/src/test/java/com/gemstone/gemfire/cache/util/AutoBalancerJUnitTest.java
@@ -556,6 +556,45 @@ public class AutoBalancerJUnitTest {
     assertTrue(latch.await(1, TimeUnit.SECONDS));
   }
 
+  @Test
+  public void destroyAutoBalancer() throws InterruptedException {
+    final CountDownLatch latch = new CountDownLatch(2);
+    final CountDownLatch timerLatch = new CountDownLatch(1);
+    final int timer = 20; // simulate 20 milliseconds
+
+    mockContext.checking(new Expectations() {
+      {
+        oneOf(mockAuditor).init(with(any(Properties.class)));
+        allowing(mockAuditor).execute();
+        allowing(mockClock).currentTimeMillis();
+        will(new CustomAction("returnTime") {
+          @Override
+          public Object invoke(Invocation invocation) throws Throwable {
+            latch.countDown();
+            if (latch.getCount() == 0) {
+              assertTrue(timerLatch.await(1, TimeUnit.SECONDS));
+              // scheduler is destroyed before wait is over
+              fail();
+            }
+            return 1000L - timer;
+          }
+        });
+      }
+    });
+
+    Properties props = AutoBalancerJUnitTest.getBasicConfig();
+
+    assertEquals(2, latch.getCount());
+    AutoBalancer autoR = new AutoBalancer(null, mockAuditor, mockClock, null);
+    autoR.init(props);
+    assertTrue(latch.await(1, TimeUnit.SECONDS));
+
+    // after destroy no more execute will be called.
+    autoR.destroy();
+    timerLatch.countDown();
+    TimeUnit.MILLISECONDS.sleep(2 * timer);
+  }
+
   static Properties getBasicConfig() {
     Properties props = new Properties();
     // every second schedule