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 <[email protected]> Authored: Thu May 24 15:59:38 2018 -0700 Committer: Junkai Xue <[email protected]> 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) {
