Fix conflicts and make test passed
Project: http://git-wip-us.apache.org/repos/asf/helix/repo Commit: http://git-wip-us.apache.org/repos/asf/helix/commit/fa587f0b Tree: http://git-wip-us.apache.org/repos/asf/helix/tree/fa587f0b Diff: http://git-wip-us.apache.org/repos/asf/helix/diff/fa587f0b Branch: refs/heads/master Commit: fa587f0bfcb229f773eda764c8d2e3a27c814c96 Parents: fe0b6e8 Author: Junkai Xue <j...@linkedin.com> Authored: Tue Nov 7 17:05:09 2017 -0800 Committer: Junkai Xue <j...@linkedin.com> Committed: Tue Nov 7 18:17:12 2017 -0800 ---------------------------------------------------------------------- .../webapp/TestHelixAdminScenariosRest.java | 6 +- .../apache/helix/webapp/TestResetInstance.java | 2 +- .../helix/webapp/TestResetPartitionState.java | 2 +- .../apache/helix/webapp/TestResetResource.java | 4 +- .../webapp/resources/TestJobQueuesResource.java | 2 +- .../org/apache/helix/agent/TestHelixAgent.java | 4 +- .../java/org/apache/helix/HelixProperty.java | 9 - .../main/java/org/apache/helix/PropertyKey.java | 5 - .../helix/manager/zk/CallbackHandler.java | 70 +- .../ClusterExternalViewVerifier.java | 175 ----- .../ClusterVerifiers/ClusterStateVerifier.java | 739 ------------------- .../tools/ClusterVerifiers/ClusterVerifier.java | 148 ---- .../helix/integration/TestAddClusterV2.java | 2 +- .../TestAddStateModelFactoryAfterConnect.java | 4 +- .../TestAutoRebalanceWithDisabledInstance.java | 114 --- .../helix/integration/TestBasicSpectator.java | 2 +- .../integration/TestCleanupExternalView.java | 2 +- .../integration/TestControllerHistory.java | 59 -- .../TestCorrectnessOnConnectivityLoss.java | 4 +- .../integration/TestCrushAutoRebalance.java | 222 ------ .../TestCrushAutoRebalanceNonRack.java | 216 ------ .../integration/TestDelayedAutoRebalance.java | 452 ------------ .../TestDelayedAutoRebalanceWithRackaware.java | 73 -- .../TestDisableCustomCodeRunner.java | 2 +- .../integration/TestDisableExternalView.java | 2 +- .../helix/integration/TestDisableNode.java | 2 +- .../helix/integration/TestDisablePartition.java | 2 +- .../helix/integration/TestDisableResource.java | 2 +- .../integration/TestDistributedCMMain.java | 4 +- .../TestDistributedClusterController.java | 4 +- .../org/apache/helix/integration/TestDrop.java | 2 + .../helix/integration/TestDropResource.java | 2 +- .../integration/TestEntropyFreeNodeBounce.java | 6 +- .../helix/integration/TestErrorPartition.java | 2 +- .../integration/TestExternalViewUpdates.java | 6 +- .../integration/TestHelixCustomCodeRunner.java | 2 +- .../helix/integration/TestHelixInstanceTag.java | 2 +- .../helix/integration/TestInstanceHistory.java | 56 -- .../integration/TestInvalidAutoIdealState.java | 4 +- .../TestInvalidResourceRebalance.java | 2 +- .../integration/TestNodeOfflineTimeStamp.java | 59 -- .../TestPartitionLevelTransitionConstraint.java | 2 +- .../helix/integration/TestPauseSignal.java | 4 +- .../TestReelectedPipelineCorrectness.java | 4 +- .../helix/integration/TestRenamePartition.java | 2 +- .../helix/integration/TestResetInstance.java | 2 +- .../integration/TestResetPartitionState.java | 2 +- .../helix/integration/TestResetResource.java | 2 +- .../TestResourceWithSamePartitionKey.java | 2 +- .../helix/integration/TestSchemataSM.java | 4 +- .../integration/TestSemiAutoRebalance.java | 229 ------ .../TestSessionExpiryInTransition.java | 4 +- .../helix/integration/TestStandAloneCMMain.java | 2 +- .../TestStandAloneCMSessionExpiry.java | 2 +- .../TestStateTransitionTimeoutWithResource.java | 192 ----- .../helix/integration/TestSwapInstance.java | 2 +- .../integration/TestZkCallbackHandlerLeak.java | 2 +- .../helix/integration/TestZkReconnect.java | 4 +- .../helix/integration/TestZkSessionExpiry.java | 2 +- .../common/ZkStandAloneCMTestBase.java | 6 +- .../controller/TestControllerLiveLock.java | 2 +- .../TestSkipBestPossibleCalculation.java | 8 +- .../manager/TestConsecutiveZkSessionExpiry.java | 4 +- .../manager/TestControllerManager.java | 4 +- .../TestDistributedControllerManager.java | 4 +- .../integration/manager/TestStateModelLeak.java | 4 +- .../manager/TestZkCallbackHandlerLeak.java | 2 +- .../messaging/TestMessageThrottle2.java | 4 +- .../paticipant/TestNonOfflineInitState.java | 4 +- .../paticipant/TestParticipantErrorMessage.java | 4 +- .../paticipant/TestRestartParticipant.java | 4 +- .../paticipant/TestStateTransitionTimeout.java | 4 +- .../TestAutoRebalancePartitionLimit.java | 4 +- .../TestCustomizedIdealStateRebalancer.java | 4 +- .../rebalancer/TestFullAutoNodeTagging.java | 6 +- .../manager/zk/TestLiveInstanceBounce.java | 2 +- .../TestClusterStatusMonitorLifecycle.java | 6 +- .../mbeans/TestResetClusterMetrics.java | 2 +- .../helix/tools/TestClusterStateVerifier.java | 4 +- .../apache/helix/tools/TestHelixAdminCli.java | 6 +- 80 files changed, 144 insertions(+), 2884 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestHelixAdminScenariosRest.java ---------------------------------------------------------------------- diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestHelixAdminScenariosRest.java b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestHelixAdminScenariosRest.java index 369c6f0..0b49096 100644 --- a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestHelixAdminScenariosRest.java +++ b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestHelixAdminScenariosRest.java @@ -41,9 +41,9 @@ import org.apache.helix.model.IdealState.IdealStateProperty; import org.apache.helix.model.InstanceConfig; import org.apache.helix.model.LiveInstance; import org.apache.helix.tools.ClusterSetup; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier.BestPossAndExtViewZkVerifier; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier.MasterNbInExtViewVerifier; +import org.apache.helix.tools.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier.BestPossAndExtViewZkVerifier; +import org.apache.helix.tools.ClusterStateVerifier.MasterNbInExtViewVerifier; import org.apache.helix.webapp.resources.ClusterRepresentationUtil; import org.apache.helix.webapp.resources.InstancesResource.ListInstancesWrapper; import org.apache.helix.webapp.resources.JsonParameters; http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetInstance.java ---------------------------------------------------------------------- diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetInstance.java b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetInstance.java index 052c3c0..fdcb1e5 100644 --- a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetInstance.java +++ b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetInstance.java @@ -29,7 +29,7 @@ import org.apache.helix.integration.manager.ClusterControllerManager; import org.apache.helix.integration.manager.MockParticipantManager; import org.apache.helix.mock.participant.ErrTransition; import org.apache.helix.tools.ClusterSetup; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier; import org.apache.helix.webapp.resources.JsonParameters; import org.testng.Assert; import org.testng.annotations.Test; http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetPartitionState.java ---------------------------------------------------------------------- diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetPartitionState.java b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetPartitionState.java index 79364d2..ddf2ec1 100644 --- a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetPartitionState.java +++ b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetPartitionState.java @@ -37,7 +37,7 @@ import org.apache.helix.mock.participant.ErrTransition; import org.apache.helix.model.LiveInstance; import org.apache.helix.model.Message; import org.apache.helix.tools.ClusterSetup; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier; import org.apache.helix.webapp.resources.JsonParameters; import org.apache.log4j.Logger; import org.testng.Assert; http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetResource.java ---------------------------------------------------------------------- diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetResource.java b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetResource.java index eb5d2a5..6746c70 100644 --- a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetResource.java +++ b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestResetResource.java @@ -29,7 +29,7 @@ import org.apache.helix.integration.manager.ClusterControllerManager; import org.apache.helix.integration.manager.MockParticipantManager; import org.apache.helix.mock.participant.ErrTransition; import org.apache.helix.tools.ClusterSetup; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier; import org.apache.helix.webapp.resources.JsonParameters; import org.testng.Assert; import org.testng.annotations.Test; @@ -71,7 +71,7 @@ public class TestResetResource extends AdminTestBase { if (i == 0) { participants[i] = - new MockParticipantManager(ZK_ADDR, clusterName, instanceName); + new MockParticipantManager(ZK_ADDR, clusterName, instanceName); participants[i].setTransition(new ErrTransition(errPartitions)); } else { participants[i] = new MockParticipantManager(ZK_ADDR, clusterName, instanceName); http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/resources/TestJobQueuesResource.java ---------------------------------------------------------------------- diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/resources/TestJobQueuesResource.java b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/resources/TestJobQueuesResource.java index 5d82723..5d8a93b 100644 --- a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/resources/TestJobQueuesResource.java +++ b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/resources/TestJobQueuesResource.java @@ -39,7 +39,7 @@ import org.apache.helix.task.TaskFactory; import org.apache.helix.task.TaskStateModelFactory; import org.apache.helix.task.beans.JobBean; import org.apache.helix.task.beans.WorkflowBean; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier; import org.apache.helix.webapp.AdminTestBase; import org.apache.helix.webapp.AdminTestHelper; import org.apache.log4j.Logger; http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-agent/src/test/java/org/apache/helix/agent/TestHelixAgent.java ---------------------------------------------------------------------- diff --git a/helix-agent/src/test/java/org/apache/helix/agent/TestHelixAgent.java b/helix-agent/src/test/java/org/apache/helix/agent/TestHelixAgent.java index a0638f0..27b4d36 100644 --- a/helix-agent/src/test/java/org/apache/helix/agent/TestHelixAgent.java +++ b/helix-agent/src/test/java/org/apache/helix/agent/TestHelixAgent.java @@ -34,8 +34,8 @@ import org.apache.helix.model.HelixConfigScope; import org.apache.helix.model.HelixConfigScope.ConfigScopeProperty; import org.apache.helix.model.builder.HelixConfigScopeBuilder; import org.apache.helix.tools.ClusterSetup; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier.BestPossAndExtViewZkVerifier; +import org.apache.helix.tools.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier.BestPossAndExtViewZkVerifier; import org.apache.log4j.Logger; import org.testng.Assert; import org.testng.annotations.AfterMethod; http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/main/java/org/apache/helix/HelixProperty.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/HelixProperty.java b/helix-core/src/main/java/org/apache/helix/HelixProperty.java index 47806aa..4a3ec5e 100644 --- a/helix-core/src/main/java/org/apache/helix/HelixProperty.java +++ b/helix-core/src/main/java/org/apache/helix/HelixProperty.java @@ -152,15 +152,6 @@ public class HelixProperty { } /** - * Initialize the property with an existing ZNRecord with new record id - * @param record - * @param id - */ - public HelixProperty(ZNRecord record, String id) { - _record = new ZNRecord(record, id); - } - - /** * Get the property identifier * @return the property id */ http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/main/java/org/apache/helix/PropertyKey.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/PropertyKey.java b/helix-core/src/main/java/org/apache/helix/PropertyKey.java index 775db7a..20cb833 100644 --- a/helix-core/src/main/java/org/apache/helix/PropertyKey.java +++ b/helix-core/src/main/java/org/apache/helix/PropertyKey.java @@ -329,11 +329,6 @@ public class PropertyKey { return new PropertyKey(ERRORS, Error.class, _clusterName, instanceName); } - public PropertyKey participantHistory(String instanceName) { - return new PropertyKey(INSTANCE_HISTORY, ParticipantHistory.class, _clusterName, - instanceName); - } - /** * Get a property key associated with {@link Error} for an instance under a session * @param instanceName http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/main/java/org/apache/helix/manager/zk/CallbackHandler.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/manager/zk/CallbackHandler.java b/helix-core/src/main/java/org/apache/helix/manager/zk/CallbackHandler.java index aa0cbbc..45dcc15 100644 --- a/helix-core/src/main/java/org/apache/helix/manager/zk/CallbackHandler.java +++ b/helix-core/src/main/java/org/apache/helix/manager/zk/CallbackHandler.java @@ -161,41 +161,41 @@ public class CallbackHandler implements IZkChildListener, IZkDataListener { Class listenerClass = null; switch (_changeType) { - case IDEAL_STATE: - listenerClass = IdealStateChangeListener.class; - break; - case INSTANCE_CONFIG: - if (_listener instanceof ConfigChangeListener) { - listenerClass = ConfigChangeListener.class; - } else if (_listener instanceof InstanceConfigChangeListener) { - listenerClass = InstanceConfigChangeListener.class; - } - break; - case CLUSTER_CONFIG: - listenerClass = ClusterConfigChangeListener.class; - break; - case RESOURCE_CONFIG: - listenerClass = ResourceConfigChangeListener.class; - break; - case CONFIG: + case IDEAL_STATE: + listenerClass = IdealStateChangeListener.class; + break; + case INSTANCE_CONFIG: + if (_listener instanceof ConfigChangeListener) { listenerClass = ConfigChangeListener.class; - break; - case LIVE_INSTANCE: - listenerClass = LiveInstanceChangeListener.class; - break; - case CURRENT_STATE: - listenerClass = CurrentStateChangeListener.class; ; - break; - case MESSAGE: - case MESSAGES_CONTROLLER: - listenerClass = MessageListener.class; - break; - case EXTERNAL_VIEW: - case TARGET_EXTERNAL_VIEW: - listenerClass = ExternalViewChangeListener.class; - break; - case CONTROLLER: - listenerClass = ControllerChangeListener.class; + } else if (_listener instanceof InstanceConfigChangeListener) { + listenerClass = InstanceConfigChangeListener.class; + } + break; + case CLUSTER_CONFIG: + listenerClass = ClusterConfigChangeListener.class; + break; + case RESOURCE_CONFIG: + listenerClass = ResourceConfigChangeListener.class; + break; + case CONFIG: + listenerClass = ConfigChangeListener.class; + break; + case LIVE_INSTANCE: + listenerClass = LiveInstanceChangeListener.class; + break; + case CURRENT_STATE: + listenerClass = CurrentStateChangeListener.class; ; + break; + case MESSAGE: + case MESSAGES_CONTROLLER: + listenerClass = MessageListener.class; + break; + case EXTERNAL_VIEW: + case TARGET_EXTERNAL_VIEW: + listenerClass = ExternalViewChangeListener.class; + break; + case CONTROLLER: + listenerClass = ControllerChangeListener.class; } Method callbackMethod = listenerClass.getMethods()[0]; @@ -449,7 +449,7 @@ public class CallbackHandler implements IZkChildListener, IZkDataListener { case CURRENT_STATE: case IDEAL_STATE: case EXTERNAL_VIEW: - case TARGET_EXTERNAL_VIEW:{ + case TARGET_EXTERNAL_VIEW:{ // check if bucketized BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<ZNRecord>(_zkClient); List<ZNRecord> records = baseAccessor.getChildren(path, null, 0); http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterExternalViewVerifier.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterExternalViewVerifier.java b/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterExternalViewVerifier.java deleted file mode 100644 index 933acc2..0000000 --- a/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterExternalViewVerifier.java +++ /dev/null @@ -1,175 +0,0 @@ -package org.apache.helix.tools.ClusterVerifiers; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.helix.controller.pipeline.Stage; -import org.apache.helix.controller.pipeline.StageContext; -import org.apache.helix.controller.stages.AttributeName; -import org.apache.helix.controller.stages.BestPossibleStateCalcStage; -import org.apache.helix.controller.stages.BestPossibleStateOutput; -import org.apache.helix.controller.stages.ClusterDataCache; -import org.apache.helix.controller.stages.ClusterEvent; -import org.apache.helix.controller.stages.CurrentStateComputationStage; -import org.apache.helix.controller.stages.ResourceComputationStage; -import org.apache.helix.manager.zk.ZkClient; -import org.apache.helix.model.ExternalView; -import org.apache.helix.model.Partition; -import org.apache.log4j.Logger; - -/** - * given zk, cluster, and a list of expected live-instances - * check whether cluster's external-view reaches best-possible states - */ - -/** - * This class is deprecated, please use BestPossibleExternalViewVerifier instead. - */ -@Deprecated -public class ClusterExternalViewVerifier extends ClusterVerifier { - private static Logger LOG = Logger.getLogger(ClusterExternalViewVerifier.class); - - final List<String> _expectSortedLiveNodes; // always sorted - - public ClusterExternalViewVerifier(ZkClient zkclient, String clusterName, - List<String> expectLiveNodes) { - super(zkclient, clusterName); - _expectSortedLiveNodes = expectLiveNodes; - Collections.sort(_expectSortedLiveNodes); - } - - boolean verifyLiveNodes(List<String> actualLiveNodes) { - Collections.sort(actualLiveNodes); - return _expectSortedLiveNodes.equals(actualLiveNodes); - } - - /** - * @param externalView - * @param bestPossibleState map of partition to map of instance to state - * @return - */ - boolean verifyExternalView(ExternalView externalView, - Map<Partition, Map<String, String>> bestPossibleState) { - Map<String, Map<String, String>> bestPossibleStateMap = - convertBestPossibleState(bestPossibleState); - // trimBestPossibleState(bestPossibleStateMap); - - Map<String, Map<String, String>> externalViewMap = externalView.getRecord().getMapFields(); - return externalViewMap.equals(bestPossibleStateMap); - } - - static void runStage(ClusterEvent event, Stage stage) throws Exception { - StageContext context = new StageContext(); - stage.init(context); - stage.preProcess(); - stage.process(event); - stage.postProcess(); - } - - BestPossibleStateOutput calculateBestPossibleState(ClusterDataCache cache) throws Exception { - ClusterEvent event = new ClusterEvent("event"); - event.addAttribute("ClusterDataCache", cache); - - List<Stage> stages = new ArrayList<Stage>(); - stages.add(new ResourceComputationStage()); - stages.add(new CurrentStateComputationStage()); - stages.add(new BestPossibleStateCalcStage()); - - for (Stage stage : stages) { - runStage(event, stage); - } - - return event.getAttribute(AttributeName.BEST_POSSIBLE_STATE.name()); - } - - /** - * remove empty map and DROPPED state from best possible state - * @param bestPossibleState - */ - // static void trimBestPossibleState(Map<String, Map<String, String>> bestPossibleState) { - // Iterator<Entry<String, Map<String, String>>> iter = bestPossibleState.entrySet().iterator(); - // while (iter.hasNext()) { - // Map.Entry<String, Map<String, String>> entry = iter.next(); - // Map<String, String> instanceStateMap = entry.getValue(); - // if (instanceStateMap.isEmpty()) { - // iter.remove(); - // } else { - // // remove instances with DROPPED state - // Iterator<Map.Entry<String, String>> insIter = instanceStateMap.entrySet().iterator(); - // while (insIter.hasNext()) { - // Map.Entry<String, String> insEntry = insIter.next(); - // String state = insEntry.getValue(); - // if (state.equalsIgnoreCase(HelixDefinedState.DROPPED.toString())) { - // insIter.remove(); - // } - // } - // } - // } - // } - - static Map<String, Map<String, String>> convertBestPossibleState( - Map<Partition, Map<String, String>> bestPossibleState) { - Map<String, Map<String, String>> result = new HashMap<String, Map<String, String>>(); - for (Partition partition : bestPossibleState.keySet()) { - result.put(partition.getPartitionName(), bestPossibleState.get(partition)); - } - return result; - } - - @Override - public boolean verify() throws Exception { - ClusterDataCache cache = new ClusterDataCache(); - cache.refresh(_accessor); - - List<String> liveInstances = new ArrayList<String>(); - liveInstances.addAll(cache.getLiveInstances().keySet()); - boolean success = verifyLiveNodes(liveInstances); - if (!success) { - LOG.info("liveNodes not match, expect: " + _expectSortedLiveNodes + ", actual: " - + liveInstances); - return false; - } - - BestPossibleStateOutput bestPossbileStates = calculateBestPossibleState(cache); - Map<String, ExternalView> externalViews = - _accessor.getChildValuesMap(_keyBuilder.externalViews()); - - // TODO all ideal-states should be included in external-views - - for (String resourceName : externalViews.keySet()) { - ExternalView externalView = externalViews.get(resourceName); - Map<Partition, Map<String, String>> bestPossbileState = - bestPossbileStates.getResourceMap(resourceName); - success = verifyExternalView(externalView, bestPossbileState); - if (!success) { - LOG.info("external-view for resource: " + resourceName + " not match"); - return false; - } - } - - return true; - } - -} http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterStateVerifier.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterStateVerifier.java b/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterStateVerifier.java deleted file mode 100644 index eace66f..0000000 --- a/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterStateVerifier.java +++ /dev/null @@ -1,739 +0,0 @@ -package org.apache.helix.tools.ClusterVerifiers; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import org.I0Itec.zkclient.IZkChildListener; -import org.I0Itec.zkclient.IZkDataListener; -import org.I0Itec.zkclient.exception.ZkNodeExistsException; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.GnuParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.apache.helix.HelixDataAccessor; -import org.apache.helix.HelixDefinedState; -import org.apache.helix.PropertyKey; -import org.apache.helix.PropertyKey.Builder; -import org.apache.helix.PropertyPathBuilder; -import org.apache.helix.PropertyType; -import org.apache.helix.ZNRecord; -import org.apache.helix.controller.pipeline.Stage; -import org.apache.helix.controller.pipeline.StageContext; -import org.apache.helix.controller.stages.AttributeName; -import org.apache.helix.controller.stages.BestPossibleStateCalcStage; -import org.apache.helix.controller.stages.BestPossibleStateOutput; -import org.apache.helix.controller.stages.ClusterDataCache; -import org.apache.helix.controller.stages.ClusterEvent; -import org.apache.helix.controller.stages.CurrentStateComputationStage; -import org.apache.helix.controller.stages.ResourceComputationStage; -import org.apache.helix.manager.zk.ZKHelixDataAccessor; -import org.apache.helix.manager.zk.ZkBaseDataAccessor; -import org.apache.helix.manager.zk.ZkClient; -import org.apache.helix.model.ExternalView; -import org.apache.helix.model.IdealState; -import org.apache.helix.model.Partition; -import org.apache.helix.model.Resource; -import org.apache.helix.task.TaskConstants; -import org.apache.helix.tools.ClusterSetup; -import org.apache.helix.util.ZKClientPool; -import org.apache.log4j.Logger; - -import com.google.common.collect.Sets; - -/** - * This class is deprecated, please use dedicated verifier classes, such as BestPossibleExternViewVerifier, etc. - */ -@Deprecated -public class ClusterStateVerifier { - public static String cluster = "cluster"; - public static String zkServerAddress = "zkSvr"; - public static String help = "help"; - public static String timeout = "timeout"; - public static String period = "period"; - public static String resources = "resources"; - - private static Logger LOG = Logger.getLogger(ClusterStateVerifier.class); - - public interface Verifier { - boolean verify(); - } - - public interface ZkVerifier extends Verifier { - ZkClient getZkClient(); - - String getClusterName(); - } - - /** Use BestPossibleExternViewVerifier instead */ - @Deprecated - static class ExtViewVeriferZkListener implements IZkChildListener, IZkDataListener { - final CountDownLatch _countDown; - final ZkClient _zkClient; - final Verifier _verifier; - - public ExtViewVeriferZkListener(CountDownLatch countDown, ZkClient zkClient, ZkVerifier verifier) { - _countDown = countDown; - _zkClient = zkClient; - _verifier = verifier; - } - - @Override - public void handleDataChange(String dataPath, Object data) throws Exception { - boolean result = _verifier.verify(); - if (result == true) { - _countDown.countDown(); - } - } - - @Override - public void handleDataDeleted(String dataPath) throws Exception { - // TODO Auto-generated method stub - - } - - @Override - public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { - for (String child : currentChilds) { - String childPath = parentPath.equals("/") ? parentPath + child : parentPath + "/" + child; - _zkClient.subscribeDataChanges(childPath, this); - } - - boolean result = _verifier.verify(); - if (result == true) { - _countDown.countDown(); - } - } - } - - private static ZkClient validateAndGetClient(String zkAddr, String clusterName) { - if (zkAddr == null || clusterName == null) { - throw new IllegalArgumentException("requires zkAddr|clusterName"); - } - return ZKClientPool.getZkClient(zkAddr); - } - - public static class BestPossAndExtViewZkVerifier implements ZkVerifier { - private final String clusterName; - private final Map<String, Map<String, String>> errStates; - private final ZkClient zkClient; - private final Set<String> resources; - - public BestPossAndExtViewZkVerifier(String zkAddr, String clusterName) { - this(zkAddr, clusterName, null); - } - - public BestPossAndExtViewZkVerifier(String zkAddr, String clusterName, - Map<String, Map<String, String>> errStates) { - this(zkAddr, clusterName, errStates, null); - } - - public BestPossAndExtViewZkVerifier(String zkAddr, String clusterName, - Map<String, Map<String, String>> errStates, Set<String> resources) { - this(validateAndGetClient(zkAddr, clusterName), clusterName, errStates, resources); - } - - public BestPossAndExtViewZkVerifier(ZkClient zkClient, String clusterName, - Map<String, Map<String, String>> errStates, Set<String> resources) { - if (zkClient == null || clusterName == null) { - throw new IllegalArgumentException("requires zkClient|clusterName"); - } - this.clusterName = clusterName; - this.errStates = errStates; - this.zkClient = zkClient; - this.resources = resources; - } - - @Override - public boolean verify() { - try { - HelixDataAccessor accessor = - new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(zkClient)); - - return verifyBestPossAndExtView(accessor, errStates, clusterName, resources); - } catch (Exception e) { - LOG.error("exception in verification", e); - } - return false; - } - - private boolean verifyBestPossAndExtView(HelixDataAccessor accessor, - Map<String, Map<String, String>> errStates, String clusterName, Set<String> resources) { - try { - PropertyKey.Builder keyBuilder = accessor.keyBuilder(); - // read cluster once and do verification - ClusterDataCache cache = new ClusterDataCache(); - cache.refresh(accessor); - - Map<String, IdealState> idealStates = cache.getIdealStates(); - if (idealStates == null) { - // ideal state is null because ideal state is dropped - idealStates = Collections.emptyMap(); - } - - // filter out all resources that use Task state model - Iterator<Map.Entry<String, IdealState>> it = idealStates.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry<String, IdealState> pair = it.next(); - if (pair.getValue().getStateModelDefRef().equals(TaskConstants.STATE_MODEL_NAME)) { - it.remove(); - } - } - - Map<String, ExternalView> extViews = accessor.getChildValuesMap(keyBuilder.externalViews()); - if (extViews == null) { - extViews = Collections.emptyMap(); - } - - // Filter resources if requested - if (resources != null && !resources.isEmpty()) { - idealStates.keySet().retainAll(resources); - extViews.keySet().retainAll(resources); - } - - // if externalView is not empty and idealState doesn't exist - // add empty idealState for the resource - for (String resource : extViews.keySet()) { - if (!idealStates.containsKey(resource)) { - idealStates.put(resource, new IdealState(resource)); - } - } - - // calculate best possible state - BestPossibleStateOutput bestPossOutput = calcBestPossState(cache, resources); - Map<String, Map<Partition, Map<String, String>>> bestPossStateMap = - bestPossOutput.getStateMap(); - - // set error states - if (errStates != null) { - for (String resourceName : errStates.keySet()) { - Map<String, String> partErrStates = errStates.get(resourceName); - for (String partitionName : partErrStates.keySet()) { - String instanceName = partErrStates.get(partitionName); - - if (!bestPossStateMap.containsKey(resourceName)) { - bestPossStateMap.put(resourceName, new HashMap<Partition, Map<String, String>>()); - } - Partition partition = new Partition(partitionName); - if (!bestPossStateMap.get(resourceName).containsKey(partition)) { - bestPossStateMap.get(resourceName).put(partition, new HashMap<String, String>()); - } - bestPossStateMap.get(resourceName).get(partition) - .put(instanceName, HelixDefinedState.ERROR.name()); - } - } - } - - // System.out.println("stateMap: " + bestPossStateMap); - - for (String resourceName : idealStates.keySet()) { - ExternalView extView = extViews.get(resourceName); - if (extView == null) { - IdealState is = idealStates.get(resourceName); - if (is.isExternalViewDisabled()) { - continue; - } else { - LOG.info("externalView for " + resourceName + " is not available"); - return false; - } - } - - // step 0: remove empty map and DROPPED state from best possible state - Map<Partition, Map<String, String>> bpStateMap = - bestPossOutput.getResourceMap(resourceName); - Iterator<Map.Entry<Partition, Map<String, String>>> iter = bpStateMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry<Partition, Map<String, String>> entry = iter.next(); - Map<String, String> instanceStateMap = entry.getValue(); - if (instanceStateMap.isEmpty()) { - iter.remove(); - } else { - // remove instances with DROPPED state - Iterator<Map.Entry<String, String>> insIter = instanceStateMap.entrySet().iterator(); - while (insIter.hasNext()) { - Map.Entry<String, String> insEntry = insIter.next(); - String state = insEntry.getValue(); - if (state.equalsIgnoreCase(HelixDefinedState.DROPPED.name())) { - insIter.remove(); - } - } - } - } - - // System.err.println("resource: " + resourceName + ", bpStateMap: " + bpStateMap); - - // step 1: externalView and bestPossibleState has equal size - int extViewSize = extView.getRecord().getMapFields().size(); - int bestPossStateSize = bestPossOutput.getResourceMap(resourceName).size(); - if (extViewSize != bestPossStateSize) { - LOG.info("exterView size (" + extViewSize + ") is different from bestPossState size (" - + bestPossStateSize + ") for resource: " + resourceName); - - // System.err.println("exterView size (" + extViewSize - // + ") is different from bestPossState size (" + bestPossStateSize - // + ") for resource: " + resourceName); - // System.out.println("extView: " + extView.getRecord().getMapFields()); - // System.out.println("bestPossState: " + - // bestPossOutput.getResourceMap(resourceName)); - return false; - } - - // step 2: every entry in external view is contained in best possible state - for (String partition : extView.getRecord().getMapFields().keySet()) { - Map<String, String> evInstanceStateMap = extView.getRecord().getMapField(partition); - Map<String, String> bpInstanceStateMap = - bestPossOutput.getInstanceStateMap(resourceName, new Partition(partition)); - - boolean result = compareMap(evInstanceStateMap, bpInstanceStateMap); - if (result == false) { - LOG.info("externalView is different from bestPossibleState for partition:" + partition); - - // System.err.println("externalView is different from bestPossibleState for partition: " - // + partition + ", actual: " + evInstanceStateMap + ", bestPoss: " + - // bpInstanceStateMap); - return false; - } - } - } - return true; - } catch (Exception e) { - LOG.error("exception in verification", e); - return false; - } - } - - /** - * calculate the best possible state note that DROPPED states are not checked since when - * kick off the BestPossibleStateCalcStage we are providing an empty current state map - * - * @param cache - * @return - * @throws Exception - */ - private BestPossibleStateOutput calcBestPossState(ClusterDataCache cache, Set<String> resources) - throws Exception { - ClusterEvent event = new ClusterEvent("sampleEvent"); - event.addAttribute("ClusterDataCache", cache); - - ResourceComputationStage rcState = new ResourceComputationStage(); - CurrentStateComputationStage csStage = new CurrentStateComputationStage(); - BestPossibleStateCalcStage bpStage = new BestPossibleStateCalcStage(); - - runStage(event, rcState); - - // Filter resources if specified - if (resources != null) { - Map<String, Resource> resourceMap = event.getAttribute(AttributeName.RESOURCES.name()); - resourceMap.keySet().retainAll(resources); - } - - runStage(event, csStage); - runStage(event, bpStage); - - BestPossibleStateOutput output = - event.getAttribute(AttributeName.BEST_POSSIBLE_STATE.name()); - - // System.out.println("output:" + output); - return output; - } - - private void runStage(ClusterEvent event, Stage stage) throws Exception { - StageContext context = new StageContext(); - stage.init(context); - stage.preProcess(); - stage.process(event); - stage.postProcess(); - } - - private <K, V> boolean compareMap(Map<K, V> map1, Map<K, V> map2) { - boolean isEqual = true; - if (map1 == null && map2 == null) { - // OK - } else if (map1 == null && map2 != null) { - if (!map2.isEmpty()) { - isEqual = false; - } - } else if (map1 != null && map2 == null) { - if (!map1.isEmpty()) { - isEqual = false; - } - } else { - // verify size - if (map1.size() != map2.size()) { - isEqual = false; - } - // verify each <key, value> in map1 is contained in map2 - for (K key : map1.keySet()) { - if (!map1.get(key).equals(map2.get(key))) { - LOG.debug( - "different value for key: " + key + "(map1: " + map1.get(key) + ", map2: " + map2 - .get(key) + ")"); - isEqual = false; - break; - } - } - } - return isEqual; - } - - @Override - public ZkClient getZkClient() { - return zkClient; - } - - @Override - public String getClusterName() { - return clusterName; - } - - @Override - public String toString() { - String verifierName = getClass().getName(); - verifierName = verifierName.substring(verifierName.lastIndexOf('.') + 1, verifierName.length()); - return verifierName + "(" + clusterName + "@" + zkClient.getServers() + ")"; - } - } - - - public static class MasterNbInExtViewVerifier implements ZkVerifier { - private final String clusterName; - private final ZkClient zkClient; - - public MasterNbInExtViewVerifier(String zkAddr, String clusterName) { - this(validateAndGetClient(zkAddr, clusterName), clusterName); - } - - public MasterNbInExtViewVerifier(ZkClient zkClient, String clusterName) { - if (zkClient == null || clusterName == null) { - throw new IllegalArgumentException("requires zkClient|clusterName"); - } - this.clusterName = clusterName; - this.zkClient = zkClient; - } - - @Override - public boolean verify() { - try { - ZKHelixDataAccessor accessor = - new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(zkClient)); - - return verifyMasterNbInExtView(accessor); - } catch (Exception e) { - LOG.error("exception in verification", e); - } - return false; - } - - @Override - public ZkClient getZkClient() { - return zkClient; - } - - @Override - public String getClusterName() { - return clusterName; - } - - private boolean verifyMasterNbInExtView(HelixDataAccessor accessor) { - Builder keyBuilder = accessor.keyBuilder(); - - Map<String, IdealState> idealStates = accessor.getChildValuesMap(keyBuilder.idealStates()); - if (idealStates == null || idealStates.size() == 0) { - LOG.info("No resource idealState"); - return true; - } - - Map<String, ExternalView> extViews = accessor.getChildValuesMap(keyBuilder.externalViews()); - if (extViews == null || extViews.size() < idealStates.size()) { - LOG.info("No externalViews | externalView.size() < idealState.size()"); - return false; - } - - for (String resource : extViews.keySet()) { - int partitions = idealStates.get(resource).getNumPartitions(); - Map<String, Map<String, String>> instanceStateMap = - extViews.get(resource).getRecord().getMapFields(); - if (instanceStateMap.size() < partitions) { - LOG.info("Number of externalViews (" + instanceStateMap.size() + ") < partitions (" - + partitions + ")"); - return false; - } - - for (String partition : instanceStateMap.keySet()) { - boolean foundMaster = false; - for (String instance : instanceStateMap.get(partition).keySet()) { - if (instanceStateMap.get(partition).get(instance).equalsIgnoreCase("MASTER")) { - foundMaster = true; - break; - } - } - if (!foundMaster) { - LOG.info("No MASTER for partition: " + partition); - return false; - } - } - } - return true; - } - } - - public static boolean verifyByPolling(Verifier verifier) { - return verifyByPolling(verifier, 30 * 1000); - } - - public static boolean verifyByPolling(Verifier verifier, long timeout) { - return verifyByPolling(verifier, timeout, 1000); - } - - public static boolean verifyByPolling(Verifier verifier, long timeout, long period) { - long startTime = System.currentTimeMillis(); - boolean result = false; - try { - long curTime; - do { - Thread.sleep(period); - result = verifier.verify(); - if (result == true) { - break; - } - curTime = System.currentTimeMillis(); - } while (curTime <= startTime + timeout); - return result; - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - long endTime = System.currentTimeMillis(); - - // debug - System.err.println(result + ": " + verifier + ": wait " + (endTime - startTime) - + "ms to verify"); - - } - return false; - } - - public static boolean verifyByZkCallback(ZkVerifier verifier) { - return verifyByZkCallback(verifier, 30000); - } - - /** - * This function should be always single threaded - * - * @param verifier - * @param timeout - * @return - */ - public static boolean verifyByZkCallback(ZkVerifier verifier, long timeout) { - long startTime = System.currentTimeMillis(); - CountDownLatch countDown = new CountDownLatch(1); - ZkClient zkClient = verifier.getZkClient(); - String clusterName = verifier.getClusterName(); - - // add an ephemeral node to /{clusterName}/CONFIGS/CLUSTER/verify - // so when analyze zk log, we know when a test ends - try { - zkClient.createEphemeral("/" + clusterName + "/CONFIGS/CLUSTER/verify"); - } catch (ZkNodeExistsException ex) { - LOG.error("There is already a verification in progress", ex); - throw ex; - } - - ExtViewVeriferZkListener listener = new ExtViewVeriferZkListener(countDown, zkClient, verifier); - - String extViewPath = PropertyPathBuilder.getPath(PropertyType.EXTERNALVIEW, clusterName); - zkClient.subscribeChildChanges(extViewPath, listener); - for (String child : zkClient.getChildren(extViewPath)) { - String childPath = extViewPath.equals("/") ? extViewPath + child : extViewPath + "/" + child; - zkClient.subscribeDataChanges(childPath, listener); - } - - // do initial verify - boolean result = verifier.verify(); - if (result == false) { - try { - result = countDown.await(timeout, TimeUnit.MILLISECONDS); - if (result == false) { - // make a final try if timeout - result = verifier.verify(); - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - // clean up - zkClient.unsubscribeChildChanges(extViewPath, listener); - for (String child : zkClient.getChildren(extViewPath)) { - String childPath = extViewPath.equals("/") ? extViewPath + child : extViewPath + "/" + child; - zkClient.unsubscribeDataChanges(childPath, listener); - } - - long endTime = System.currentTimeMillis(); - - zkClient.delete("/" + clusterName + "/CONFIGS/CLUSTER/verify"); - // debug - System.err.println(result + ": wait " + (endTime - startTime) + "ms, " + verifier); - - return result; - } - - @SuppressWarnings("static-access") - private static Options constructCommandLineOptions() { - Option helpOption = - OptionBuilder.withLongOpt(help).withDescription("Prints command-line options info") - .create(); - - Option zkServerOption = - OptionBuilder.withLongOpt(zkServerAddress).withDescription("Provide zookeeper address") - .create(); - zkServerOption.setArgs(1); - zkServerOption.setRequired(true); - zkServerOption.setArgName("ZookeeperServerAddress(Required)"); - - Option clusterOption = - OptionBuilder.withLongOpt(cluster).withDescription("Provide cluster name").create(); - clusterOption.setArgs(1); - clusterOption.setRequired(true); - clusterOption.setArgName("Cluster name (Required)"); - - Option timeoutOption = - OptionBuilder.withLongOpt(timeout).withDescription("Timeout value for verification") - .create(); - timeoutOption.setArgs(1); - timeoutOption.setArgName("Timeout value (Optional), default=30s"); - - Option sleepIntervalOption = - OptionBuilder.withLongOpt(period).withDescription("Polling period for verification") - .create(); - sleepIntervalOption.setArgs(1); - sleepIntervalOption.setArgName("Polling period value (Optional), default=1s"); - - Option resourcesOption = - OptionBuilder.withLongOpt(resources).withDescription("Specific set of resources to verify") - .create(); - resourcesOption.setArgs(1); - resourcesOption.setArgName("Comma-separated resource names, default is all resources"); - - Options options = new Options(); - options.addOption(helpOption); - options.addOption(zkServerOption); - options.addOption(clusterOption); - options.addOption(timeoutOption); - options.addOption(sleepIntervalOption); - options.addOption(resourcesOption); - - return options; - } - - public static void printUsage(Options cliOptions) { - HelpFormatter helpFormatter = new HelpFormatter(); - helpFormatter.setWidth(1000); - helpFormatter.printHelp("java " + ClusterSetup.class.getName(), cliOptions); - } - - public static CommandLine processCommandLineArgs(String[] cliArgs) { - CommandLineParser cliParser = new GnuParser(); - Options cliOptions = constructCommandLineOptions(); - // CommandLine cmd = null; - - try { - return cliParser.parse(cliOptions, cliArgs); - } catch (ParseException pe) { - System.err.println("CommandLineClient: failed to parse command-line options: " - + pe.toString()); - printUsage(cliOptions); - System.exit(1); - } - return null; - } - - public static boolean verifyState(String[] args) { - // TODO Auto-generated method stub - String clusterName = "storage-cluster"; - String zkServer = "localhost:2181"; - long timeoutValue = 0; - long periodValue = 1000; - - Set<String> resourceSet = null; - if (args.length > 0) { - CommandLine cmd = processCommandLineArgs(args); - zkServer = cmd.getOptionValue(zkServerAddress); - clusterName = cmd.getOptionValue(cluster); - String timeoutStr = cmd.getOptionValue(timeout); - String periodStr = cmd.getOptionValue(period); - String resourceStr = cmd.getOptionValue(resources); - - if (timeoutStr != null) { - try { - timeoutValue = Long.parseLong(timeoutStr); - } catch (Exception e) { - System.err.println("Exception in converting " + timeoutStr + " to long. Use default (0)"); - } - } - - if (periodStr != null) { - try { - periodValue = Long.parseLong(periodStr); - } catch (Exception e) { - System.err.println("Exception in converting " + periodStr - + " to long. Use default (1000)"); - } - } - - // Allow specifying resources explicitly - if (resourceStr != null) { - String[] resources = resourceStr.split("[\\s,]"); - resourceSet = Sets.newHashSet(resources); - } - - } - // return verifyByPolling(new BestPossAndExtViewZkVerifier(zkServer, clusterName), - // timeoutValue, - // periodValue); - - ZkVerifier verifier; - if (resourceSet == null) { - verifier = new BestPossAndExtViewZkVerifier(zkServer, clusterName); - } else { - verifier = new BestPossAndExtViewZkVerifier(zkServer, clusterName, null, resourceSet); - } - return verifyByZkCallback(verifier, timeoutValue); - } - - public static void main(String[] args) { - boolean result = verifyState(args); - System.out.println(result ? "Successful" : "failed"); - System.exit(1); - } - -} http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterVerifier.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterVerifier.java b/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterVerifier.java deleted file mode 100644 index 13d98f4..0000000 --- a/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/ClusterVerifier.java +++ /dev/null @@ -1,148 +0,0 @@ -package org.apache.helix.tools.ClusterVerifiers; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import org.I0Itec.zkclient.IZkChildListener; -import org.I0Itec.zkclient.IZkDataListener; -import org.apache.helix.HelixDataAccessor; -import org.apache.helix.PropertyKey; -import org.apache.helix.ZNRecord; -import org.apache.helix.manager.zk.ZKHelixDataAccessor; -import org.apache.helix.manager.zk.ZkBaseDataAccessor; -import org.apache.helix.manager.zk.ZkClient; -import org.apache.log4j.Logger; - -@Deprecated -public abstract class ClusterVerifier implements IZkChildListener, IZkDataListener { - private static Logger LOG = Logger.getLogger(ClusterVerifier.class); - - protected final ZkClient _zkclient; - protected final String _clusterName; - protected final HelixDataAccessor _accessor; - protected final PropertyKey.Builder _keyBuilder; - private CountDownLatch _countdown; - - static class ClusterVerifyTrigger { - final PropertyKey _triggerKey; - final boolean _triggerOnChildDataChange; - - public ClusterVerifyTrigger(PropertyKey triggerKey, boolean triggerOnChildDataChange) { - _triggerKey = triggerKey; - _triggerOnChildDataChange = triggerOnChildDataChange; - } - } - - public ClusterVerifier(ZkClient zkclient, String clusterName) { - _zkclient = zkclient; - _clusterName = clusterName; - _accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(zkclient)); - _keyBuilder = _accessor.keyBuilder(); - } - - public boolean verifyByCallback(long timeout, List<ClusterVerifyTrigger> triggers) { - _countdown = new CountDownLatch(1); - - for (ClusterVerifyTrigger trigger : triggers) { - String path = trigger._triggerKey.getPath(); - _zkclient.subscribeChildChanges(path, this); - if (trigger._triggerOnChildDataChange) { - List<String> childs = _zkclient.getChildren(path); - for (String child : childs) { - String childPath = String.format("%s/%s", path, child); - _zkclient.subscribeDataChanges(childPath, this); - } - } - } - - boolean success = false; - try { - success = verify(); - if (!success) { - - success = _countdown.await(timeout, TimeUnit.MILLISECONDS); - if (!success) { - // make a final try if timeout - success = verify(); - } - } - } catch (Exception e) { - LOG.error("Exception in verifier", e); - } - - // clean up - _zkclient.unsubscribeAll(); - - return success; - } - - @Override - public void handleDataChange(String dataPath, Object data) throws Exception { - boolean success = verify(); - if (success) { - _countdown.countDown(); - } - } - - @Override - public void handleDataDeleted(String dataPath) throws Exception { - _zkclient.unsubscribeDataChanges(dataPath, this); - } - - @Override - public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { - for (String child : currentChilds) { - String childPath = String.format("%s/%s", parentPath, child); - _zkclient.subscribeDataChanges(childPath, this); - } - - boolean success = verify(); - if (success) { - _countdown.countDown(); - } - } - - public boolean verifyByPolling(long timeout) { - try { - long start = System.currentTimeMillis(); - boolean success; - do { - success = verify(); - if (success) { - return true; - } - TimeUnit.MILLISECONDS.sleep(500); - } while ((System.currentTimeMillis() - start) <= timeout); - } catch (Exception e) { - LOG.error("Exception in verifier", e); - } - return false; - } - - /** - * verify - * @return - * @throws Exception - */ - public abstract boolean verify() throws Exception; -} http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/test/java/org/apache/helix/integration/TestAddClusterV2.java ---------------------------------------------------------------------- diff --git a/helix-core/src/test/java/org/apache/helix/integration/TestAddClusterV2.java b/helix-core/src/test/java/org/apache/helix/integration/TestAddClusterV2.java index 1cc462b..6b27085 100644 --- a/helix-core/src/test/java/org/apache/helix/integration/TestAddClusterV2.java +++ b/helix-core/src/test/java/org/apache/helix/integration/TestAddClusterV2.java @@ -25,7 +25,7 @@ import org.apache.helix.integration.common.ZkIntegrationTestBase; import org.apache.helix.integration.manager.ClusterDistributedController; import org.apache.helix.integration.manager.MockParticipantManager; import org.apache.helix.tools.ClusterSetup; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier; import org.apache.log4j.Logger; import org.testng.Assert; import org.testng.annotations.AfterClass; http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/test/java/org/apache/helix/integration/TestAddStateModelFactoryAfterConnect.java ---------------------------------------------------------------------- diff --git a/helix-core/src/test/java/org/apache/helix/integration/TestAddStateModelFactoryAfterConnect.java b/helix-core/src/test/java/org/apache/helix/integration/TestAddStateModelFactoryAfterConnect.java index 5cbec64..b05b9fb 100644 --- a/helix-core/src/test/java/org/apache/helix/integration/TestAddStateModelFactoryAfterConnect.java +++ b/helix-core/src/test/java/org/apache/helix/integration/TestAddStateModelFactoryAfterConnect.java @@ -34,8 +34,8 @@ import org.apache.helix.mock.participant.MockMSModelFactory; import org.apache.helix.model.IdealState; import org.apache.helix.model.Message; import org.apache.helix.tools.ClusterSetup; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier.BestPossAndExtViewZkVerifier; +import org.apache.helix.tools.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier.BestPossAndExtViewZkVerifier; import org.testng.Assert; import org.testng.annotations.Test; http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/test/java/org/apache/helix/integration/TestAutoRebalanceWithDisabledInstance.java ---------------------------------------------------------------------- diff --git a/helix-core/src/test/java/org/apache/helix/integration/TestAutoRebalanceWithDisabledInstance.java b/helix-core/src/test/java/org/apache/helix/integration/TestAutoRebalanceWithDisabledInstance.java deleted file mode 100644 index dfc7b35..0000000 --- a/helix-core/src/test/java/org/apache/helix/integration/TestAutoRebalanceWithDisabledInstance.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.apache.helix.integration; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import org.apache.helix.HelixAdmin; -import org.apache.helix.integration.manager.MockParticipantManager; -import org.apache.helix.model.ExternalView; -import org.apache.helix.model.IdealState.RebalanceMode; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; -import org.testng.Assert; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -public class TestAutoRebalanceWithDisabledInstance extends ZkStandAloneCMTestBase { - private static String TEST_DB_2 = "TestDB2"; - - @BeforeClass - @Override - public void beforeClass() throws Exception { - super.beforeClass(); - _setupTool.addResourceToCluster(CLUSTER_NAME, TEST_DB_2, _PARTITIONS, STATE_MODEL, - RebalanceMode.FULL_AUTO + ""); - _setupTool.rebalanceResource(CLUSTER_NAME, TEST_DB_2, _replica); - - Thread.sleep(200); - - boolean result = - ClusterStateVerifier.verifyByZkCallback(new ClusterStateVerifier.BestPossAndExtViewZkVerifier(ZK_ADDR, - CLUSTER_NAME)); - Assert.assertTrue(result); - } - - @Test() - public void testDisableEnableInstanceAutoRebalance() throws Exception { - String disabledInstance = _participants[0].getInstanceName(); - - Set<String> currentPartitions = getCurrentPartitionsOnInstance(CLUSTER_NAME, TEST_DB_2, - disabledInstance); - Assert.assertFalse(currentPartitions.isEmpty()); - - // disable instance - _setupTool.getClusterManagementTool().enableInstance(CLUSTER_NAME, disabledInstance, false); - Thread.sleep(1000); - currentPartitions = getCurrentPartitionsOnInstance(CLUSTER_NAME, TEST_DB_2, disabledInstance); - Assert.assertTrue(currentPartitions.isEmpty()); - - //enable instance - _setupTool.getClusterManagementTool().enableInstance(CLUSTER_NAME, disabledInstance, true); - Thread.sleep(1000); - currentPartitions = getCurrentPartitionsOnInstance(CLUSTER_NAME, TEST_DB_2, disabledInstance); - Assert.assertFalse(currentPartitions.isEmpty()); - } - - @Test() - public void testAddDisabledInstanceAutoRebalance() throws Exception { - // add disabled instance. - String nodeName = PARTICIPANT_PREFIX + "_" + (START_PORT + NODE_NR); - _setupTool.addInstanceToCluster(CLUSTER_NAME, nodeName); - MockParticipantManager participant = - new MockParticipantManager(ZK_ADDR, CLUSTER_NAME, nodeName); - _setupTool.getClusterManagementTool().enableInstance(CLUSTER_NAME, nodeName, false); - - participant.syncStart(); - - Thread.sleep(400); - Set<String> currentPartitions = getCurrentPartitionsOnInstance(CLUSTER_NAME, TEST_DB_2, - nodeName); - Assert.assertTrue(currentPartitions.isEmpty()); - - //enable instance - _setupTool.getClusterManagementTool().enableInstance(CLUSTER_NAME, nodeName, true); - Thread.sleep(400); - currentPartitions = getCurrentPartitionsOnInstance(CLUSTER_NAME, TEST_DB_2, nodeName); - Assert.assertFalse(currentPartitions.isEmpty()); - } - - - private Set<String> getCurrentPartitionsOnInstance(String cluster, String dbName, String instance) { - HelixAdmin admin = _setupTool.getClusterManagementTool(); - Set<String> partitionSet = new HashSet<String>(); - - ExternalView ev = admin.getResourceExternalView(cluster, dbName); - for (String partition : ev.getRecord().getMapFields().keySet()) { - Map<String, String> assignments = ev.getRecord().getMapField(partition); - for (String ins : assignments.keySet()) { - if (ins.equals(instance)) { - partitionSet.add(partition); - } - } - } - return partitionSet; - } -} http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/test/java/org/apache/helix/integration/TestBasicSpectator.java ---------------------------------------------------------------------- diff --git a/helix-core/src/test/java/org/apache/helix/integration/TestBasicSpectator.java b/helix-core/src/test/java/org/apache/helix/integration/TestBasicSpectator.java index e621350..a24ded4 100644 --- a/helix-core/src/test/java/org/apache/helix/integration/TestBasicSpectator.java +++ b/helix-core/src/test/java/org/apache/helix/integration/TestBasicSpectator.java @@ -30,7 +30,7 @@ import org.apache.helix.InstanceType; import org.apache.helix.NotificationContext; import org.apache.helix.integration.common.ZkStandAloneCMTestBase; import org.apache.helix.model.ExternalView; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier; import org.testng.Assert; import org.testng.annotations.Test; http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/test/java/org/apache/helix/integration/TestCleanupExternalView.java ---------------------------------------------------------------------- diff --git a/helix-core/src/test/java/org/apache/helix/integration/TestCleanupExternalView.java b/helix-core/src/test/java/org/apache/helix/integration/TestCleanupExternalView.java index f042e66..e7a7ea0 100644 --- a/helix-core/src/test/java/org/apache/helix/integration/TestCleanupExternalView.java +++ b/helix-core/src/test/java/org/apache/helix/integration/TestCleanupExternalView.java @@ -27,7 +27,7 @@ import org.apache.helix.manager.zk.ZKHelixDataAccessor; import org.apache.helix.manager.zk.ZkBaseDataAccessor; import org.apache.helix.model.ExternalView; import org.apache.helix.model.LiveInstance; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier; import org.testng.Assert; import org.testng.annotations.Test; http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/test/java/org/apache/helix/integration/TestControllerHistory.java ---------------------------------------------------------------------- diff --git a/helix-core/src/test/java/org/apache/helix/integration/TestControllerHistory.java b/helix-core/src/test/java/org/apache/helix/integration/TestControllerHistory.java deleted file mode 100644 index b078c96..0000000 --- a/helix-core/src/test/java/org/apache/helix/integration/TestControllerHistory.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.apache.helix.integration; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import org.apache.helix.HelixManager; -import org.apache.helix.HelixManagerFactory; -import org.apache.helix.InstanceType; -import org.apache.helix.PropertyKey; -import org.apache.helix.integration.manager.ClusterControllerManager; -import org.apache.helix.model.LeaderHistory; -import org.testng.Assert; -import org.testng.annotations.Test; - -import java.util.List; - -public class TestControllerHistory extends ZkStandAloneCMTestBase { - - @Test() - public void testControllerLeaderHistory() throws Exception { - HelixManager manager = HelixManagerFactory - .getZKHelixManager(CLUSTER_NAME, "admin", InstanceType.ADMINISTRATOR, ZK_ADDR); - manager.connect(); - - PropertyKey.Builder keyBuilder = new PropertyKey.Builder(CLUSTER_NAME); - PropertyKey propertyKey = keyBuilder.controllerLeaderHistory(); - LeaderHistory leaderHistory = manager.getHelixDataAccessor().getProperty(propertyKey); - Assert.assertNotNull(leaderHistory); - List<String> list = leaderHistory.getRecord().getListField("HISTORY"); - Assert.assertEquals(list.size(), 1); - - for (int i = 0; i <= 12; i++) { - _controller.syncStop(); - _controller = new ClusterControllerManager(ZK_ADDR, CLUSTER_NAME, "Controller-" + i); - _controller.syncStart(); - } - - leaderHistory = manager.getHelixDataAccessor().getProperty(propertyKey); - Assert.assertNotNull(leaderHistory); - list = leaderHistory.getRecord().getListField("HISTORY"); - Assert.assertEquals(list.size(), 10); - manager.disconnect(); - } -} http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/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 753baf7..cbe231d 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 @@ -36,8 +36,8 @@ import org.apache.helix.participant.statemachine.StateModelInfo; import org.apache.helix.participant.statemachine.StateTransitionError; import org.apache.helix.participant.statemachine.Transition; import org.apache.helix.spectator.RoutingTableProvider; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier.BestPossAndExtViewZkVerifier; +import org.apache.helix.tools.ClusterStateVerifier; +import org.apache.helix.tools.ClusterStateVerifier.BestPossAndExtViewZkVerifier; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; http://git-wip-us.apache.org/repos/asf/helix/blob/fa587f0b/helix-core/src/test/java/org/apache/helix/integration/TestCrushAutoRebalance.java ---------------------------------------------------------------------- diff --git a/helix-core/src/test/java/org/apache/helix/integration/TestCrushAutoRebalance.java b/helix-core/src/test/java/org/apache/helix/integration/TestCrushAutoRebalance.java deleted file mode 100644 index 72df3eb..0000000 --- a/helix-core/src/test/java/org/apache/helix/integration/TestCrushAutoRebalance.java +++ /dev/null @@ -1,222 +0,0 @@ -package org.apache.helix.integration; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import org.apache.helix.controller.rebalancer.strategy.CrushRebalanceStrategy; -import org.apache.helix.controller.rebalancer.strategy.MultiRoundCrushRebalanceStrategy; -import org.apache.helix.integration.manager.ClusterControllerManager; -import org.apache.helix.integration.manager.MockParticipantManager; -import org.apache.helix.model.BuiltInStateModelDefinitions; -import org.apache.helix.model.ExternalView; -import org.apache.helix.model.IdealState; -import org.apache.helix.model.IdealState.RebalanceMode; -import org.apache.helix.model.InstanceConfig; -import org.apache.helix.tools.ClusterSetup; -import org.apache.helix.tools.ClusterVerifiers.ClusterStateVerifier; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class TestCrushAutoRebalance extends ZkIntegrationTestBase { - final int NUM_NODE = 6; - protected static final int START_PORT = 12918; - protected static final int _PARTITIONS = 20; - - protected final String CLASS_NAME = getShortClassName(); - protected final String CLUSTER_NAME = CLUSTER_PREFIX + "_" + CLASS_NAME; - protected ClusterControllerManager _controller; - - protected ClusterSetup _setupTool = null; - List<MockParticipantManager> _participants = new ArrayList<MockParticipantManager>(); - Map<String, String> _nodeToZoneMap = new HashMap<String, String>(); - Map<String, String> _nodeToTagMap = new HashMap<String, String>(); - List<String> _nodes = new ArrayList<String>(); - List<String> _allDBs = new ArrayList<String>(); - int _replica = 3; - - @BeforeClass - public void beforeClass() throws Exception { - System.out.println("START " + CLASS_NAME + " at " + new Date(System.currentTimeMillis())); - - String namespace = "/" + CLUSTER_NAME; - if (_gZkClient.exists(namespace)) { - _gZkClient.deleteRecursive(namespace); - } - _setupTool = new ClusterSetup(_gZkClient); - _setupTool.addCluster(CLUSTER_NAME, true); - - for (int i = 0; i < NUM_NODE; i++) { - String storageNodeName = PARTICIPANT_PREFIX + "_" + (START_PORT + i); - _setupTool.addInstanceToCluster(CLUSTER_NAME, storageNodeName); - String zone = "zone-" + i % 3; - String tag = "tag-" + i % 2; - _setupTool.getClusterManagementTool().setInstanceZoneId(CLUSTER_NAME, storageNodeName, zone); - _setupTool.getClusterManagementTool().addInstanceTag(CLUSTER_NAME, storageNodeName, tag); - _nodeToZoneMap.put(storageNodeName, zone); - _nodeToTagMap.put(storageNodeName, tag); - _nodes.add(storageNodeName); - } - - // start dummy participants - for (String node : _nodes) { - MockParticipantManager participant = - new MockParticipantManager(ZK_ADDR, CLUSTER_NAME, node); - participant.syncStart(); - _participants.add(participant); - } - - // start controller - String controllerName = CONTROLLER_PREFIX + "_0"; - _controller = new ClusterControllerManager(ZK_ADDR, CLUSTER_NAME, controllerName); - _controller.syncStart(); - } - - @DataProvider(name = "rebalanceStrategies") - public static String [][] rebalanceStrategies() { - return new String[][] { {"CrushRebalanceStrategy", CrushRebalanceStrategy.class.getName()}, - {"MultiRoundCrushRebalanceStrategy", MultiRoundCrushRebalanceStrategy.class.getName()} - }; - } - - @Test(dataProvider = "rebalanceStrategies") - public void testZoneIsolation(String rebalanceStrategyName, String rebalanceStrategyClass) - throws Exception { - System.out.println("Test " + rebalanceStrategyName); - List<String> testDBs = new ArrayList<String>(); - String[] testModels = { BuiltInStateModelDefinitions.OnlineOffline.name(), - BuiltInStateModelDefinitions.MasterSlave.name(), - BuiltInStateModelDefinitions.LeaderStandby.name() - }; - int i = 0; - for (String stateModel : testModels) { - String db = "Test-DB-" + rebalanceStrategyName + "-" + i++; - _setupTool.addResourceToCluster(CLUSTER_NAME, db, _PARTITIONS, stateModel, - RebalanceMode.FULL_AUTO + "", rebalanceStrategyClass); - _setupTool.rebalanceStorageCluster(CLUSTER_NAME, db, _replica); - testDBs.add(db); - _allDBs.add(db); - } - Thread.sleep(300); - - boolean result = ClusterStateVerifier.verifyByZkCallback( - new ClusterStateVerifier.BestPossAndExtViewZkVerifier(ZK_ADDR, CLUSTER_NAME)); - Assert.assertTrue(result); - - for (String db : testDBs) { - IdealState is = _setupTool.getClusterManagementTool().getResourceIdealState(CLUSTER_NAME, db); - ExternalView ev = - _setupTool.getClusterManagementTool().getResourceExternalView(CLUSTER_NAME, db); - validateZoneAndTagIsolation(is, ev); - } - } - - @Test(dataProvider = "rebalanceStrategies") - public void testZoneIsolationWithInstanceTag( - String rebalanceStrategyName, String rebalanceStrategyClass) throws Exception { - List<String> testDBs = new ArrayList<String>(); - Set<String> tags = new HashSet<String>(_nodeToTagMap.values()); - int i = 0; - for (String tag : tags) { - String db = "Test-DB-Tag-" + rebalanceStrategyName + "-" + i++; - _setupTool.addResourceToCluster(CLUSTER_NAME, db, _PARTITIONS, - BuiltInStateModelDefinitions.MasterSlave.name(), RebalanceMode.FULL_AUTO + "", - rebalanceStrategyClass); - IdealState is = _setupTool.getClusterManagementTool().getResourceIdealState(CLUSTER_NAME, db); - is.setInstanceGroupTag(tag); - _setupTool.getClusterManagementTool().setResourceIdealState(CLUSTER_NAME, db, is); - _setupTool.rebalanceStorageCluster(CLUSTER_NAME, db, _replica); - testDBs.add(db); - _allDBs.add(db); - } - Thread.sleep(300); - - boolean result = ClusterStateVerifier.verifyByZkCallback( - new ClusterStateVerifier.BestPossAndExtViewZkVerifier(ZK_ADDR, CLUSTER_NAME)); - Assert.assertTrue(result); - - for (String db : testDBs) { - IdealState is = _setupTool.getClusterManagementTool().getResourceIdealState(CLUSTER_NAME, db); - ExternalView ev = - _setupTool.getClusterManagementTool().getResourceExternalView(CLUSTER_NAME, db); - validateZoneAndTagIsolation(is, ev); - } - } - - /** - * Validate instances for each partition is on different zone and with necessary tagged instances. - */ - private void validateZoneAndTagIsolation(IdealState is, ExternalView ev) { - int replica = Integer.valueOf(is.getReplicas()); - String tag = is.getInstanceGroupTag(); - - for (String partition : is.getPartitionSet()) { - Set<String> assignedZones = new HashSet<String>(); - - Map<String, String> assignmentMap = ev.getRecord().getMapField(partition); - Set<String> instancesInEV = assignmentMap.keySet(); - for (String instance : instancesInEV) { - assignedZones.add(_nodeToZoneMap.get(instance)); - if (tag != null) { - InstanceConfig config = - _setupTool.getClusterManagementTool().getInstanceConfig(CLUSTER_NAME, instance); - Assert.assertTrue(config.containsTag(tag)); - } - } - Assert.assertEquals(assignedZones.size(), replica); - } - } - - @Test() - public void testAddZone() throws Exception { - //TODO - } - - @Test() - public void testAddNodes() throws Exception { - //TODO - } - - @Test() - public void testNodeFailure() throws Exception { - //TODO - } - - @AfterClass - public void afterClass() throws Exception { - /** - * shutdown order: 1) disconnect the controller 2) disconnect participants - */ - _controller.syncStop(); - for (MockParticipantManager participant : _participants) { - participant.syncStop(); - } - _setupTool.deleteCluster(CLUSTER_NAME); - System.out.println("END " + CLASS_NAME + " at " + new Date(System.currentTimeMillis())); - } -}