From bfaa8399529b6e63b307c1fbe60903c3ca08fbb1 Mon Sep 17 00:00:00 2001 From: Harry Zhang Date: Thu, 4 Oct 2018 15:50:16 -0700 Subject: [PATCH] [HELIX-779] do not clean list field in maintenance rebalancer for new resources --- .../rebalancer/MaintenanceRebalancer.java | 7 +++++- .../TestClusterMaintenanceMode.java | 22 +++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/helix-core/src/main/java/org/apache/helix/controller/rebalancer/MaintenanceRebalancer.java b/helix-core/src/main/java/org/apache/helix/controller/rebalancer/MaintenanceRebalancer.java index 3de3a3d6a4..8bcf9993c7 100644 --- a/helix-core/src/main/java/org/apache/helix/controller/rebalancer/MaintenanceRebalancer.java +++ b/helix-core/src/main/java/org/apache/helix/controller/rebalancer/MaintenanceRebalancer.java @@ -24,7 +24,12 @@ public IdealState computeNewIdealState(String resourceName, IdealState currentId if (currentStateMap == null || currentStateMap.size() == 0) { LOG.warn(String .format("No new partition will be assigned for %s in maintenance mode", resourceName)); - currentIdealState.setPreferenceLists(Collections.EMPTY_MAP); + + // Clear all preference lists, if the resource has not yet been rebalanced, + // leave it as is + for (List pList : currentIdealState.getPreferenceLists().values()) { + pList.clear(); + } return currentIdealState; } diff --git a/helix-core/src/test/java/org/apache/helix/integration/controller/TestClusterMaintenanceMode.java b/helix-core/src/test/java/org/apache/helix/integration/controller/TestClusterMaintenanceMode.java index 4e4771bde3..2eb8034a6b 100644 --- a/helix-core/src/test/java/org/apache/helix/integration/controller/TestClusterMaintenanceMode.java +++ b/helix-core/src/test/java/org/apache/helix/integration/controller/TestClusterMaintenanceMode.java @@ -13,6 +13,8 @@ public class TestClusterMaintenanceMode extends TaskTestBase { MockParticipantManager _newInstance; + private String newResourceAddedDuringMaintenanceMode = + String.format("%s_%s", WorkflowGenerator.DEFAULT_TGT_DB, 1); @BeforeClass public void beforeClass() throws Exception { @@ -53,13 +55,13 @@ public void testMaintenanceModeAddNewInstance() throws InterruptedException { @Test (dependsOnMethods = "testMaintenanceModeAddNewInstance") public void testMaintenanceModeAddNewResource() throws InterruptedException { _gSetupTool.getClusterManagementTool() - .addResource(CLUSTER_NAME, WorkflowGenerator.DEFAULT_TGT_DB + 1, 7, "MasterSlave", + .addResource(CLUSTER_NAME, newResourceAddedDuringMaintenanceMode, 7, "MasterSlave", IdealState.RebalanceMode.FULL_AUTO.name()); _gSetupTool.getClusterManagementTool() - .rebalance(CLUSTER_NAME, WorkflowGenerator.DEFAULT_TGT_DB + 1, 3); + .rebalance(CLUSTER_NAME, newResourceAddedDuringMaintenanceMode, 3); Assert.assertTrue(_clusterVerifier.verifyByPolling()); ExternalView externalView = _gSetupTool.getClusterManagementTool() - .getResourceExternalView(CLUSTER_NAME, WorkflowGenerator.DEFAULT_TGT_DB + 1); + .getResourceExternalView(CLUSTER_NAME, newResourceAddedDuringMaintenanceMode); Assert.assertNull(externalView); } @@ -88,4 +90,16 @@ public void testMaintenanceModeInstanceBack() throws InterruptedException { } } } -} \ No newline at end of file + + @Test (dependsOnMethods = "testMaintenanceModeInstanceBack") + public void testExitMaintenanceModeNewResourceRecovery() throws InterruptedException { + _gSetupTool.getClusterManagementTool().enableMaintenanceMode(CLUSTER_NAME, false); + Assert.assertTrue(_clusterVerifier.verifyByPolling()); + ExternalView externalView = _gSetupTool.getClusterManagementTool() + .getResourceExternalView(CLUSTER_NAME, newResourceAddedDuringMaintenanceMode); + Assert.assertEquals(externalView.getRecord().getMapFields().size(), 7); + for (Map stateMap : externalView.getRecord().getMapFields().values()) { + Assert.assertTrue(stateMap.values().contains("MASTER")); + } + } +}