You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by jx...@apache.org on 2018/07/10 01:20:51 UTC

[2/2] helix git commit: Fix RoutingTableProvider clean up in the tests.

Fix RoutingTableProvider clean up in the tests.

A backend thread is added to RoutingTableProvider recently, so in all related tests, need to shut it down.


Project: http://git-wip-us.apache.org/repos/asf/helix/repo
Commit: http://git-wip-us.apache.org/repos/asf/helix/commit/4511dbc6
Tree: http://git-wip-us.apache.org/repos/asf/helix/tree/4511dbc6
Diff: http://git-wip-us.apache.org/repos/asf/helix/diff/4511dbc6

Branch: refs/heads/master
Commit: 4511dbc6c0871ec73b287eae8a7190153b7b2d20
Parents: a720de0
Author: Jiajun Wang <jj...@linkedin.com>
Authored: Thu May 24 15:59:38 2018 -0700
Committer: Junkai Xue <jx...@jxue-mn2.linkedin.biz>
Committed: Mon Jul 9 18:20:41 2018 -0700

----------------------------------------------------------------------
 .../java/org/apache/helix/TestRoutingTable.java | 305 ++++++++++---------
 .../TestCorrectnessOnConnectivityLoss.java      |  33 +-
 .../integration/TestResourceGroupEndtoEnd.java  |   1 +
 .../spectator/TestRoutingTableProvider.java     |   2 +
 ...stRoutingTableProviderFromCurrentStates.java |  77 ++---
 .../TestRoutingTableProviderFromTargetEV.java   |  60 ++--
 .../spectator/TestRoutingTableSnapshot.java     |  84 ++---
 7 files changed, 302 insertions(+), 260 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/helix/blob/4511dbc6/helix-core/src/test/java/org/apache/helix/TestRoutingTable.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/TestRoutingTable.java b/helix-core/src/test/java/org/apache/helix/TestRoutingTable.java
index 8987147..d6144f3 100644
--- a/helix-core/src/test/java/org/apache/helix/TestRoutingTable.java
+++ b/helix-core/src/test/java/org/apache/helix/TestRoutingTable.java
@@ -90,12 +90,14 @@ public class TestRoutingTable {
 
   @Test()
   public void testNullAndEmpty() {
-
     RoutingTableProvider routingTable = new RoutingTableProvider();
-    routingTable.onExternalViewChange(null, changeContext);
-    List<ExternalView> list = Collections.emptyList();
-    routingTable.onExternalViewChange(list, changeContext);
-
+    try {
+      routingTable.onExternalViewChange(null, changeContext);
+      List<ExternalView> list = Collections.emptyList();
+      routingTable.onExternalViewChange(list, changeContext);
+    } finally {
+      routingTable.shutdown();
+    }
   }
 
   @Test()
@@ -104,40 +106,44 @@ public class TestRoutingTable {
     RoutingTableProvider routingTable = new RoutingTableProvider();
     ZNRecord record = new ZNRecord("TESTDB");
 
-    // one master
-    add(record, "TESTDB_0", "localhost_8900", "MASTER");
-    List<ExternalView> externalViewList = new ArrayList<>();
-    externalViewList.add(new ExternalView(record));
-    routingTable.onExternalViewChange(externalViewList, changeContext);
-
-    instances = routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
-    AssertJUnit.assertNotNull(instances);
-    AssertJUnit.assertEquals(instances.size(), 1);
-
-    // additions
-    add(record, "TESTDB_0", "localhost_8901", "MASTER");
-    add(record, "TESTDB_1", "localhost_8900", "SLAVE");
-
-    externalViewList = new ArrayList<ExternalView>();
-    externalViewList.add(new ExternalView(record));
-    routingTable.onExternalViewChange(externalViewList, changeContext);
-
-    instances = routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
-    AssertJUnit.assertNotNull(instances);
-    AssertJUnit.assertEquals(instances.size(), 2);
-
-    instances = routingTable.getInstances("TESTDB", "TESTDB_1", "SLAVE");
-    AssertJUnit.assertNotNull(instances);
-    AssertJUnit.assertEquals(instances.size(), 1);
-
-    // updates
-    add(record, "TESTDB_0", "localhost_8901", "SLAVE");
-    externalViewList = new ArrayList<>();
-    externalViewList.add(new ExternalView(record));
-    routingTable.onExternalViewChange(externalViewList, changeContext);
-    instances = routingTable.getInstances("TESTDB", "TESTDB_0", "SLAVE");
-    AssertJUnit.assertNotNull(instances);
-    AssertJUnit.assertEquals(instances.size(), 1);
+    try {
+      // one master
+      add(record, "TESTDB_0", "localhost_8900", "MASTER");
+      List<ExternalView> externalViewList = new ArrayList<>();
+      externalViewList.add(new ExternalView(record));
+      routingTable.onExternalViewChange(externalViewList, changeContext);
+
+      instances = routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
+      AssertJUnit.assertNotNull(instances);
+      AssertJUnit.assertEquals(instances.size(), 1);
+
+      // additions
+      add(record, "TESTDB_0", "localhost_8901", "MASTER");
+      add(record, "TESTDB_1", "localhost_8900", "SLAVE");
+
+      externalViewList = new ArrayList<ExternalView>();
+      externalViewList.add(new ExternalView(record));
+      routingTable.onExternalViewChange(externalViewList, changeContext);
+
+      instances = routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
+      AssertJUnit.assertNotNull(instances);
+      AssertJUnit.assertEquals(instances.size(), 2);
+
+      instances = routingTable.getInstances("TESTDB", "TESTDB_1", "SLAVE");
+      AssertJUnit.assertNotNull(instances);
+      AssertJUnit.assertEquals(instances.size(), 1);
+
+      // updates
+      add(record, "TESTDB_0", "localhost_8901", "SLAVE");
+      externalViewList = new ArrayList<>();
+      externalViewList.add(new ExternalView(record));
+      routingTable.onExternalViewChange(externalViewList, changeContext);
+      instances = routingTable.getInstances("TESTDB", "TESTDB_0", "SLAVE");
+      AssertJUnit.assertNotNull(instances);
+      AssertJUnit.assertEquals(instances.size(), 1);
+    } finally {
+      routingTable.shutdown();
+    }
   }
 
 
@@ -147,20 +153,24 @@ public class TestRoutingTable {
     List<ExternalView> externalViewList = new ArrayList<>();
     Set<String> databases = new HashSet<>();
 
-    for (int i = 0; i < 5; i++) {
-      String db = "TESTDB" + i;
-      ZNRecord record = new ZNRecord(db);
-      // one master
-      add(record, db+"_0", "localhost_8900", "MASTER");
-      add(record, db+"_1", "localhost_8901", "SLAVE");
-      externalViewList.add(new ExternalView(record));
-      databases.add(db);
-    }
+    try {
+      for (int i = 0; i < 5; i++) {
+        String db = "TESTDB" + i;
+        ZNRecord record = new ZNRecord(db);
+        // one master
+        add(record, db + "_0", "localhost_8900", "MASTER");
+        add(record, db + "_1", "localhost_8901", "SLAVE");
+        externalViewList.add(new ExternalView(record));
+        databases.add(db);
+      }
 
-    routingTable.onExternalViewChange(externalViewList, changeContext);
-    Collection<String> resources = routingTable.getResources();
-    Assert.assertEquals(databases.size(), externalViewList.size());
-    Assert.assertEquals(databases, new HashSet<>(resources));
+      routingTable.onExternalViewChange(externalViewList, changeContext);
+      Collection<String> resources = routingTable.getResources();
+      Assert.assertEquals(databases.size(), externalViewList.size());
+      Assert.assertEquals(databases, new HashSet<>(resources));
+    } finally {
+      routingTable.shutdown();
+    }
   }
 
   @Test()
@@ -168,23 +178,27 @@ public class TestRoutingTable {
     List<InstanceConfig> instances;
     RoutingTableProvider routingTable = new RoutingTableProvider();
 
-    List<ExternalView> externalViewList = new ArrayList<ExternalView>();
-    ZNRecord record = new ZNRecord("TESTDB");
+    try {
+      List<ExternalView> externalViewList = new ArrayList<ExternalView>();
+      ZNRecord record = new ZNRecord("TESTDB");
 
-    // one master
-    add(record, "TESTDB_0", "localhost_8900", "MASTER");
-    externalViewList.add(new ExternalView(record));
-    routingTable.onExternalViewChange(externalViewList, changeContext);
-    instances = routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
-    AssertJUnit.assertNotNull(instances);
-    AssertJUnit.assertEquals(instances.size(), 1);
-
-    externalViewList.clear();
-    routingTable.onExternalViewChange(externalViewList, changeContext);
-    Thread.sleep(100);
-    instances = routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
-    AssertJUnit.assertNotNull(instances);
-    AssertJUnit.assertEquals(instances.size(), 0);
+      // one master
+      add(record, "TESTDB_0", "localhost_8900", "MASTER");
+      externalViewList.add(new ExternalView(record));
+      routingTable.onExternalViewChange(externalViewList, changeContext);
+      instances = routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
+      AssertJUnit.assertNotNull(instances);
+      AssertJUnit.assertEquals(instances.size(), 1);
+
+      externalViewList.clear();
+      routingTable.onExternalViewChange(externalViewList, changeContext);
+      Thread.sleep(100);
+      instances = routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
+      AssertJUnit.assertNotNull(instances);
+      AssertJUnit.assertEquals(instances.size(), 0);
+    } finally {
+      routingTable.shutdown();
+    }
   }
 
   @Test()
@@ -193,92 +207,101 @@ public class TestRoutingTable {
     Set<InstanceConfig> instancesSet;
     InstanceConfig instancesArray[];
     RoutingTableProvider routingTable = new RoutingTableProvider();
-    List<ExternalView> externalViewList = new ArrayList<ExternalView>();
-    ZNRecord record = new ZNRecord("TESTDB");
 
-    // one master
-    add(record, "TESTDB_0", "localhost_8900", "MASTER");
-    add(record, "TESTDB_1", "localhost_8900", "MASTER");
-    add(record, "TESTDB_2", "localhost_8900", "MASTER");
-    add(record, "TESTDB_3", "localhost_8900", "SLAVE");
-    add(record, "TESTDB_4", "localhost_8900", "SLAVE");
-    add(record, "TESTDB_5", "localhost_8900", "SLAVE");
-
-    add(record, "TESTDB_0", "localhost_8901", "SLAVE");
-    add(record, "TESTDB_1", "localhost_8901", "SLAVE");
-    add(record, "TESTDB_2", "localhost_8901", "SLAVE");
-    add(record, "TESTDB_3", "localhost_8901", "MASTER");
-    add(record, "TESTDB_4", "localhost_8901", "MASTER");
-    add(record, "TESTDB_5", "localhost_8901", "MASTER");
-
-    externalViewList.add(new ExternalView(record));
-    routingTable.onExternalViewChange(externalViewList, changeContext);
-    instancesList = routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
-    AssertJUnit.assertNotNull(instancesList);
-    AssertJUnit.assertEquals(instancesList.size(), 1);
-    instancesSet = routingTable.getInstances("TESTDB", "MASTER");
-    AssertJUnit.assertNotNull(instancesSet);
-    AssertJUnit.assertEquals(instancesSet.size(), 2);
-    instancesSet = routingTable.getInstances("TESTDB", "SLAVE");
-    AssertJUnit.assertNotNull(instancesSet);
-    AssertJUnit.assertEquals(instancesSet.size(), 2);
-    instancesArray = new InstanceConfig[instancesSet.size()];
-    instancesSet.toArray(instancesArray);
-    AssertJUnit.assertEquals(instancesArray[0].getHostName(), "localhost");
-    AssertJUnit.assertEquals(instancesArray[0].getPort(), "8900");
-    AssertJUnit.assertEquals(instancesArray[1].getHostName(), "localhost");
-    AssertJUnit.assertEquals(instancesArray[1].getPort(), "8901");
+    try {
+      List<ExternalView> externalViewList = new ArrayList<ExternalView>();
+      ZNRecord record = new ZNRecord("TESTDB");
+
+      // one master
+      add(record, "TESTDB_0", "localhost_8900", "MASTER");
+      add(record, "TESTDB_1", "localhost_8900", "MASTER");
+      add(record, "TESTDB_2", "localhost_8900", "MASTER");
+      add(record, "TESTDB_3", "localhost_8900", "SLAVE");
+      add(record, "TESTDB_4", "localhost_8900", "SLAVE");
+      add(record, "TESTDB_5", "localhost_8900", "SLAVE");
+
+      add(record, "TESTDB_0", "localhost_8901", "SLAVE");
+      add(record, "TESTDB_1", "localhost_8901", "SLAVE");
+      add(record, "TESTDB_2", "localhost_8901", "SLAVE");
+      add(record, "TESTDB_3", "localhost_8901", "MASTER");
+      add(record, "TESTDB_4", "localhost_8901", "MASTER");
+      add(record, "TESTDB_5", "localhost_8901", "MASTER");
+
+      externalViewList.add(new ExternalView(record));
+      routingTable.onExternalViewChange(externalViewList, changeContext);
+      instancesList = routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
+      AssertJUnit.assertNotNull(instancesList);
+      AssertJUnit.assertEquals(instancesList.size(), 1);
+      instancesSet = routingTable.getInstances("TESTDB", "MASTER");
+      AssertJUnit.assertNotNull(instancesSet);
+      AssertJUnit.assertEquals(instancesSet.size(), 2);
+      instancesSet = routingTable.getInstances("TESTDB", "SLAVE");
+      AssertJUnit.assertNotNull(instancesSet);
+      AssertJUnit.assertEquals(instancesSet.size(), 2);
+      instancesArray = new InstanceConfig[instancesSet.size()];
+      instancesSet.toArray(instancesArray);
+      AssertJUnit.assertEquals(instancesArray[0].getHostName(), "localhost");
+      AssertJUnit.assertEquals(instancesArray[0].getPort(), "8900");
+      AssertJUnit.assertEquals(instancesArray[1].getHostName(), "localhost");
+      AssertJUnit.assertEquals(instancesArray[1].getPort(), "8901");
+    } finally {
+      routingTable.shutdown();
+    }
   }
 
   @Test()
   public void testMultiThread() throws Exception {
     final RoutingTableProvider routingTable = new RoutingTableProvider();
     List<ExternalView> externalViewList = new ArrayList<>();
-    ZNRecord record = new ZNRecord("TESTDB");
-    for (int i = 0; i < 1000; i++) {
-      add(record, "TESTDB_" + i, "localhost_8900", "MASTER");
-    }
-    externalViewList.add(new ExternalView(record));
-    routingTable.onExternalViewChange(externalViewList, changeContext);
-    Callable<Boolean> runnable = new Callable<Boolean>() {
-      @Override
-      public Boolean call() throws Exception {
 
-        try {
-          int count = 0;
-          while (count < 100) {
-            List<InstanceConfig> instancesList =
-                routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
-            AssertJUnit.assertEquals(instancesList.size(), 1);
-            // System.out.println(System.currentTimeMillis() + "-->"
-            // + instancesList.size());
-
-            Thread.sleep(5);
-
-            count++;
+    try {
+      ZNRecord record = new ZNRecord("TESTDB");
+      for (int i = 0; i < 1000; i++) {
+        add(record, "TESTDB_" + i, "localhost_8900", "MASTER");
+      }
+      externalViewList.add(new ExternalView(record));
+      routingTable.onExternalViewChange(externalViewList, changeContext);
+      Callable<Boolean> runnable = new Callable<Boolean>() {
+        @Override
+        public Boolean call() throws Exception {
+
+          try {
+            int count = 0;
+            while (count < 100) {
+              List<InstanceConfig> instancesList =
+                  routingTable.getInstances("TESTDB", "TESTDB_0", "MASTER");
+              AssertJUnit.assertEquals(instancesList.size(), 1);
+              // System.out.println(System.currentTimeMillis() + "-->"
+              // + instancesList.size());
+
+              Thread.sleep(5);
+
+              count++;
+            }
+          } catch (InterruptedException e) {
+            // e.printStackTrace();
           }
+          return true;
+        }
+      };
+      ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
+      Future<Boolean> submit = executor.submit(runnable);
+      int count = 0;
+      while (count < 10) {
+        try {
+          Thread.sleep(10);
         } catch (InterruptedException e) {
-          // e.printStackTrace();
+          e.printStackTrace();
         }
-        return true;
+        routingTable.onExternalViewChange(externalViewList, changeContext);
+        count++;
       }
-    };
-    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
-    Future<Boolean> submit = executor.submit(runnable);
-    int count = 0;
-    while (count < 10) {
-      try {
-        Thread.sleep(10);
-      } catch (InterruptedException e) {
-        e.printStackTrace();
-      }
-      routingTable.onExternalViewChange(externalViewList, changeContext);
-      count++;
-    }
-
-    Boolean result = submit.get(60, TimeUnit.SECONDS);
-    AssertJUnit.assertEquals(result, Boolean.TRUE);
 
+      Boolean result = submit.get(60, TimeUnit.SECONDS);
+      AssertJUnit.assertEquals(result, Boolean.TRUE);
+    } finally {
+      routingTable.shutdown();
+    }
   }
 
   private void add(ZNRecord record, String stateUnitKey, String instanceName, String state) {

http://git-wip-us.apache.org/repos/asf/helix/blob/4511dbc6/helix-core/src/test/java/org/apache/helix/integration/TestCorrectnessOnConnectivityLoss.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/integration/TestCorrectnessOnConnectivityLoss.java b/helix-core/src/test/java/org/apache/helix/integration/TestCorrectnessOnConnectivityLoss.java
index cbe231d..2d8749e 100644
--- a/helix-core/src/test/java/org/apache/helix/integration/TestCorrectnessOnConnectivityLoss.java
+++ b/helix-core/src/test/java/org/apache/helix/integration/TestCorrectnessOnConnectivityLoss.java
@@ -118,21 +118,24 @@ public class TestCorrectnessOnConnectivityLoss {
     participant.connect();
 
     RoutingTableProvider routingTableProvider = new RoutingTableProvider();
-    HelixManager spectator =
-        HelixManagerFactory.getZKHelixManager(_clusterName, "spectator", InstanceType.SPECTATOR,
-            ZK_ADDR);
-    spectator.connect();
-    spectator.addConfigChangeListener(routingTableProvider);
-    spectator.addExternalViewChangeListener(routingTableProvider);
-    Thread.sleep(1000);
-
-    // Now let's stop the ZK server; this should do nothing
-    TestHelper.stopZkServer(_zkServer);
-    Thread.sleep(1000);
-
-    // Verify routing table still works
-    Assert.assertEquals(routingTableProvider.getInstances("resource0", "ONLINE").size(), 1);
-    Assert.assertEquals(routingTableProvider.getInstances("resource0", "OFFLINE").size(), 0);
+    try {
+      HelixManager spectator = HelixManagerFactory
+          .getZKHelixManager(_clusterName, "spectator", InstanceType.SPECTATOR, ZK_ADDR);
+      spectator.connect();
+      spectator.addConfigChangeListener(routingTableProvider);
+      spectator.addExternalViewChangeListener(routingTableProvider);
+      Thread.sleep(1000);
+
+      // Now let's stop the ZK server; this should do nothing
+      TestHelper.stopZkServer(_zkServer);
+      Thread.sleep(1000);
+
+      // Verify routing table still works
+      Assert.assertEquals(routingTableProvider.getInstances("resource0", "ONLINE").size(), 1);
+      Assert.assertEquals(routingTableProvider.getInstances("resource0", "OFFLINE").size(), 0);
+    } finally {
+      routingTableProvider.shutdown();
+    }
   }
 
   @AfterMethod

http://git-wip-us.apache.org/repos/asf/helix/blob/4511dbc6/helix-core/src/test/java/org/apache/helix/integration/TestResourceGroupEndtoEnd.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/integration/TestResourceGroupEndtoEnd.java b/helix-core/src/test/java/org/apache/helix/integration/TestResourceGroupEndtoEnd.java
index 47f8af9..f2d876d 100644
--- a/helix-core/src/test/java/org/apache/helix/integration/TestResourceGroupEndtoEnd.java
+++ b/helix-core/src/test/java/org/apache/helix/integration/TestResourceGroupEndtoEnd.java
@@ -139,6 +139,7 @@ public class TestResourceGroupEndtoEnd extends ZkIntegrationTestBase {
 
     _controller.syncStop();
     _spectator.disconnect();
+    _routingTableProvider.shutdown();
   }
 
   private void addInstanceGroup(String clusterName, String instanceTag, int numInstance) {

http://git-wip-us.apache.org/repos/asf/helix/blob/4511dbc6/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProvider.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProvider.java b/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProvider.java
index b34e447..e395519 100644
--- a/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProvider.java
+++ b/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProvider.java
@@ -122,6 +122,8 @@ public class TestRoutingTableProvider extends ZkIntegrationTestBase {
       p.syncStop();
     }
     _controller.syncStop();
+    _routingTableProvider.shutdown();
+    _routingTableProvider2.shutdown();
     _spectator.disconnect();
     _gSetupTool.deleteCluster(CLUSTER_NAME);
   }

http://git-wip-us.apache.org/repos/asf/helix/blob/4511dbc6/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProviderFromCurrentStates.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProviderFromCurrentStates.java b/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProviderFromCurrentStates.java
index 6187cff..72a6dae 100644
--- a/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProviderFromCurrentStates.java
+++ b/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProviderFromCurrentStates.java
@@ -88,49 +88,52 @@ public class TestRoutingTableProviderFromCurrentStates extends ZkIntegrationTest
         new RoutingTableProvider(_manager, PropertyType.EXTERNALVIEW);
     RoutingTableProvider routingTableCurrentStates = new RoutingTableProvider(_manager, PropertyType.CURRENTSTATES);
 
-    String db1 = "TestDB-1";
-    _setupTool.addResourceToCluster(CLUSTER_NAME, db1, NUM_PARTITIONS, "MasterSlave",
-        IdealState.RebalanceMode.FULL_AUTO.name());
-    _setupTool.rebalanceStorageCluster(CLUSTER_NAME, db1, NUM_REPLICAS);
-
-    Thread.sleep(200);
-    HelixClusterVerifier clusterVerifier =
-        new BestPossibleExternalViewVerifier.Builder(CLUSTER_NAME).setZkAddr(ZK_ADDR).build();
-    Assert.assertTrue(clusterVerifier.verify());
-
-    IdealState idealState1 = _setupTool.getClusterManagementTool().getResourceIdealState(
-        CLUSTER_NAME, db1);
-    validate(idealState1, routingTableEV, routingTableCurrentStates);
-
-    // add new DB
-    String db2 = "TestDB-2";
-    _setupTool.addResourceToCluster(CLUSTER_NAME, db2, NUM_PARTITIONS, "MasterSlave",
-        IdealState.RebalanceMode.FULL_AUTO.name());
-    _setupTool.rebalanceStorageCluster(CLUSTER_NAME, db2, NUM_REPLICAS);
-
-    Thread.sleep(200);
-    Assert.assertTrue(clusterVerifier.verify());
-
-    IdealState idealState2 = _setupTool.getClusterManagementTool().getResourceIdealState(
-        CLUSTER_NAME, db2);
-    validate(idealState2, routingTableEV, routingTableCurrentStates);
-
-    // shutdown an instance
-    _participants[0].syncStop();
-    Thread.sleep(200);
-    Assert.assertTrue(clusterVerifier.verify());
-    validate(idealState1, routingTableEV, routingTableCurrentStates);
-    validate(idealState2, routingTableEV, routingTableCurrentStates);
+    try {
+      String db1 = "TestDB-1";
+      _setupTool.addResourceToCluster(CLUSTER_NAME, db1, NUM_PARTITIONS, "MasterSlave", IdealState.RebalanceMode.FULL_AUTO.name());
+      _setupTool.rebalanceStorageCluster(CLUSTER_NAME, db1, NUM_REPLICAS);
+
+      Thread.sleep(200);
+      HelixClusterVerifier clusterVerifier =
+          new BestPossibleExternalViewVerifier.Builder(CLUSTER_NAME).setZkAddr(ZK_ADDR).build();
+      Assert.assertTrue(clusterVerifier.verify());
+
+      IdealState idealState1 =
+          _setupTool.getClusterManagementTool().getResourceIdealState(CLUSTER_NAME, db1);
+      validate(idealState1, routingTableEV, routingTableCurrentStates);
+
+      // add new DB
+      String db2 = "TestDB-2";
+      _setupTool.addResourceToCluster(CLUSTER_NAME, db2, NUM_PARTITIONS, "MasterSlave", IdealState.RebalanceMode.FULL_AUTO.name());
+      _setupTool.rebalanceStorageCluster(CLUSTER_NAME, db2, NUM_REPLICAS);
+
+      Thread.sleep(200);
+      Assert.assertTrue(clusterVerifier.verify());
+
+      IdealState idealState2 =
+          _setupTool.getClusterManagementTool().getResourceIdealState(CLUSTER_NAME, db2);
+      validate(idealState2, routingTableEV, routingTableCurrentStates);
+
+      // shutdown an instance
+      _participants[0].syncStop();
+      Thread.sleep(200);
+      Assert.assertTrue(clusterVerifier.verify());
+      validate(idealState1, routingTableEV, routingTableCurrentStates);
+      validate(idealState2, routingTableEV, routingTableCurrentStates);
+    } finally {
+      routingTableEV.shutdown();
+      routingTableCurrentStates.shutdown();
+    }
   }
 
   @Test (dependsOnMethods = {"testRoutingTableWithCurrentStates"})
   public void testWithSupportSourceDataType() {
-    new RoutingTableProvider(_manager, PropertyType.EXTERNALVIEW);
-    new RoutingTableProvider(_manager, PropertyType.TARGETEXTERNALVIEW);
-    new RoutingTableProvider(_manager, PropertyType.CURRENTSTATES);
+    new RoutingTableProvider(_manager, PropertyType.EXTERNALVIEW).shutdown();
+    new RoutingTableProvider(_manager, PropertyType.TARGETEXTERNALVIEW).shutdown();
+    new RoutingTableProvider(_manager, PropertyType.CURRENTSTATES).shutdown();
 
     try {
-      new RoutingTableProvider(_manager, PropertyType.IDEALSTATES);
+      new RoutingTableProvider(_manager, PropertyType.IDEALSTATES).shutdown();
       Assert.fail();
     } catch (HelixException ex) {
       Assert.assertTrue(ex.getMessage().contains("Unsupported source data type"));

http://git-wip-us.apache.org/repos/asf/helix/blob/4511dbc6/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProviderFromTargetEV.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProviderFromTargetEV.java b/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProviderFromTargetEV.java
index fbf17cf..16a759e 100644
--- a/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProviderFromTargetEV.java
+++ b/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableProviderFromTargetEV.java
@@ -103,8 +103,12 @@ public class TestRoutingTableProviderFromTargetEV extends ZkIntegrationTestBase
     String resourceName = WorkflowGenerator.DEFAULT_TGT_DB + 1;
     RoutingTableProvider externalViewProvider =
         new RoutingTableProvider(_manager, PropertyType.EXTERNALVIEW);
-    Assert.assertEquals(externalViewProvider.getInstancesForResource(resourceName, "SLAVE").size(),
-        0);
+    try {
+      Assert.assertEquals(externalViewProvider.getInstancesForResource(resourceName, "SLAVE").size(),
+          0);
+    } finally {
+      externalViewProvider.shutdown();
+    }
   }
 
   @Test (dependsOnMethods = "testTargetExternalViewWithoutEnable")
@@ -120,33 +124,37 @@ public class TestRoutingTableProviderFromTargetEV extends ZkIntegrationTestBase
     RoutingTableProvider targetExternalViewProvider =
         new RoutingTableProvider(_manager, PropertyType.TARGETEXTERNALVIEW);
 
-    // ExternalView should not contain any MASTERS
-    // TargetExternalView should contain MASTERS same as the partition number
-    Set<InstanceConfig> externalViewMasters =
-        externalViewProvider.getInstancesForResource(WorkflowGenerator.DEFAULT_TGT_DB, "MASTER");
-    Assert.assertEquals(externalViewMasters.size(), 0);
-    Set<InstanceConfig> targetExternalViewMasters = targetExternalViewProvider
-        .getInstancesForResource(WorkflowGenerator.DEFAULT_TGT_DB, "MASTER");
-    Assert.assertEquals(targetExternalViewMasters.size(), NUM_NODES);
-
-    // TargetExternalView MASTERS mapping should exactly match IdealState MASTERS mapping
-    Map<String, Map<String, String>> stateMap = _setupTool.getClusterManagementTool()
-        .getResourceIdealState(CLUSTER_NAME, WorkflowGenerator.DEFAULT_TGT_DB).getRecord()
-        .getMapFields();
-
-    Set<String> idealMasters = new HashSet<>();
-    Set<String> targetMasters = new HashSet<>();
-    for (Map<String, String> instanceMap : stateMap.values()) {
-      for (String instance : instanceMap.keySet()) {
-        if (instanceMap.get(instance).equals("MASTER")) {
-          idealMasters.add(instance);
+    try {
+      // ExternalView should not contain any MASTERS
+      // TargetExternalView should contain MASTERS same as the partition number
+      Set<InstanceConfig> externalViewMasters =
+          externalViewProvider.getInstancesForResource(WorkflowGenerator.DEFAULT_TGT_DB, "MASTER");
+      Assert.assertEquals(externalViewMasters.size(), 0);
+      Set<InstanceConfig> targetExternalViewMasters = targetExternalViewProvider
+          .getInstancesForResource(WorkflowGenerator.DEFAULT_TGT_DB, "MASTER");
+      Assert.assertEquals(targetExternalViewMasters.size(), NUM_NODES);
+
+      // TargetExternalView MASTERS mapping should exactly match IdealState MASTERS mapping
+      Map<String, Map<String, String>> stateMap = _setupTool.getClusterManagementTool()
+          .getResourceIdealState(CLUSTER_NAME, WorkflowGenerator.DEFAULT_TGT_DB).getRecord().getMapFields();
+
+      Set<String> idealMasters = new HashSet<>();
+      Set<String> targetMasters = new HashSet<>();
+      for (Map<String, String> instanceMap : stateMap.values()) {
+        for (String instance : instanceMap.keySet()) {
+          if (instanceMap.get(instance).equals("MASTER")) {
+            idealMasters.add(instance);
+          }
         }
       }
-    }
 
-    for (InstanceConfig instanceConfig : targetExternalViewMasters) {
-      targetMasters.add(instanceConfig.getInstanceName());
+      for (InstanceConfig instanceConfig : targetExternalViewMasters) {
+        targetMasters.add(instanceConfig.getInstanceName());
+      }
+      Assert.assertTrue(idealMasters.equals(targetMasters));
+    } finally {
+      externalViewProvider.shutdown();
+      targetExternalViewProvider.shutdown();
     }
-    Assert.assertTrue(idealMasters.equals(targetMasters));
   }
 }

http://git-wip-us.apache.org/repos/asf/helix/blob/4511dbc6/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableSnapshot.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableSnapshot.java b/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableSnapshot.java
index d556b7a..118387c 100644
--- a/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableSnapshot.java
+++ b/helix-core/src/test/java/org/apache/helix/integration/spectator/TestRoutingTableSnapshot.java
@@ -80,47 +80,49 @@ public class TestRoutingTableSnapshot extends ZkIntegrationTestBase {
     RoutingTableProvider routingTableProvider =
         new RoutingTableProvider(_manager, PropertyType.EXTERNALVIEW);
 
-    String db1 = "TestDB-1";
-    _setupTool.addResourceToCluster(CLUSTER_NAME, db1, NUM_PARTITIONS, "MasterSlave",
-        IdealState.RebalanceMode.FULL_AUTO.name());
-    _setupTool.rebalanceStorageCluster(CLUSTER_NAME, db1, NUM_REPLICAS);
-
-    Thread.sleep(200);
-    HelixClusterVerifier clusterVerifier =
-        new BestPossibleExternalViewVerifier.Builder(CLUSTER_NAME).setZkAddr(ZK_ADDR).build();
-    Assert.assertTrue(clusterVerifier.verify());
-
-    IdealState idealState1 = _setupTool.getClusterManagementTool().getResourceIdealState(
-        CLUSTER_NAME, db1);
-
-    RoutingTableSnapshot routingTableSnapshot = routingTableProvider.getRoutingTableSnapshot();
-    validateMapping(idealState1, routingTableSnapshot);
-
-    Assert.assertEquals(routingTableSnapshot.getInstanceConfigs().size(), NUM_NODES);
-    Assert.assertEquals(routingTableSnapshot.getResources().size(), 1);
-    Assert.assertEquals(routingTableSnapshot.getLiveInstances().size(), NUM_NODES);
-
-    // add new DB and shutdown an instance
-    String db2 = "TestDB-2";
-    _setupTool.addResourceToCluster(CLUSTER_NAME, db2, NUM_PARTITIONS, "MasterSlave",
-        IdealState.RebalanceMode.FULL_AUTO.name());
-    _setupTool.rebalanceStorageCluster(CLUSTER_NAME, db2, NUM_REPLICAS);
-
-    // shutdown an instance
-    _participants[0].syncStop();
-    Thread.sleep(200);
-    Assert.assertTrue(clusterVerifier.verify());
-
-    // the original snapshot should not change
-    Assert.assertEquals(routingTableSnapshot.getInstanceConfigs().size(), NUM_NODES);
-    Assert.assertEquals(routingTableSnapshot.getResources().size(), 1);
-    Assert.assertEquals(routingTableSnapshot.getLiveInstances().size(), NUM_NODES);
-
-    RoutingTableSnapshot newRoutingTableSnapshot = routingTableProvider.getRoutingTableSnapshot();
-
-    Assert.assertEquals(newRoutingTableSnapshot.getInstanceConfigs().size(), NUM_NODES);
-    Assert.assertEquals(newRoutingTableSnapshot.getResources().size(), 2);
-    Assert.assertEquals(newRoutingTableSnapshot.getLiveInstances().size(), NUM_NODES - 1);
+    try {
+      String db1 = "TestDB-1";
+      _setupTool.addResourceToCluster(CLUSTER_NAME, db1, NUM_PARTITIONS, "MasterSlave", IdealState.RebalanceMode.FULL_AUTO.name());
+      _setupTool.rebalanceStorageCluster(CLUSTER_NAME, db1, NUM_REPLICAS);
+
+      Thread.sleep(200);
+      HelixClusterVerifier clusterVerifier =
+          new BestPossibleExternalViewVerifier.Builder(CLUSTER_NAME).setZkAddr(ZK_ADDR).build();
+      Assert.assertTrue(clusterVerifier.verify());
+
+      IdealState idealState1 =
+          _setupTool.getClusterManagementTool().getResourceIdealState(CLUSTER_NAME, db1);
+
+      RoutingTableSnapshot routingTableSnapshot = routingTableProvider.getRoutingTableSnapshot();
+      validateMapping(idealState1, routingTableSnapshot);
+
+      Assert.assertEquals(routingTableSnapshot.getInstanceConfigs().size(), NUM_NODES);
+      Assert.assertEquals(routingTableSnapshot.getResources().size(), 1);
+      Assert.assertEquals(routingTableSnapshot.getLiveInstances().size(), NUM_NODES);
+
+      // add new DB and shutdown an instance
+      String db2 = "TestDB-2";
+      _setupTool.addResourceToCluster(CLUSTER_NAME, db2, NUM_PARTITIONS, "MasterSlave", IdealState.RebalanceMode.FULL_AUTO.name());
+      _setupTool.rebalanceStorageCluster(CLUSTER_NAME, db2, NUM_REPLICAS);
+
+      // shutdown an instance
+      _participants[0].syncStop();
+      Thread.sleep(200);
+      Assert.assertTrue(clusterVerifier.verify());
+
+      // the original snapshot should not change
+      Assert.assertEquals(routingTableSnapshot.getInstanceConfigs().size(), NUM_NODES);
+      Assert.assertEquals(routingTableSnapshot.getResources().size(), 1);
+      Assert.assertEquals(routingTableSnapshot.getLiveInstances().size(), NUM_NODES);
+
+      RoutingTableSnapshot newRoutingTableSnapshot = routingTableProvider.getRoutingTableSnapshot();
+
+      Assert.assertEquals(newRoutingTableSnapshot.getInstanceConfigs().size(), NUM_NODES);
+      Assert.assertEquals(newRoutingTableSnapshot.getResources().size(), 2);
+      Assert.assertEquals(newRoutingTableSnapshot.getLiveInstances().size(), NUM_NODES - 1);
+    } finally {
+      routingTableProvider.shutdown();
+    }
   }
 
   private void validateMapping(IdealState idealState, RoutingTableSnapshot routingTableSnapshot) {