"Instance Config size does not match"); value = accessor.getProperty(keyBuilder.clusterConfig()); value._record.setSimpleField("" + System.currentTimeMillis(), "newValue"); listener.reset(); accessor.setProperty(keyBuilder.clusterConfig(), value); Thread.sleep(500); // wait zk callback Assert.assertTrue(listener._clusterConfigChanged,
public void dropInstanceFromCluster(String clusterName, String instanceId) { ZKHelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(_zkClient)); Builder keyBuilder = accessor.keyBuilder(); InstanceConfig instanceConfig = InstanceConfig.toInstanceConfig(instanceId); instanceId = instanceConfig.getInstanceName(); // ensure node is not live LiveInstance liveInstance = accessor.getProperty(keyBuilder.liveInstance(instanceId)); if (liveInstance != null) { throw new HelixException(String .format("Cannot drop instance %s as it is still live. Please stop it first", instanceId)); } InstanceConfig config = accessor.getProperty(keyBuilder.instanceConfig(instanceId)); if (config == null) { String error = "Node " + instanceId + " does not exist, cannot drop"; _logger.warn(error); throw new HelixException(error); } ClusterConfig clusterConfig = accessor.getProperty(keyBuilder.clusterConfig()); // ensure node is disabled, otherwise fail if (config.getInstanceEnabled() && (clusterConfig.getDisabledInstances() == null || !clusterConfig.getDisabledInstances().containsKey(instanceId))) { String error = "Node " + instanceId + " is enabled, cannot drop"; _logger.warn(error); throw new HelixException(error); } _admin.dropInstance(clusterName, config); }
Assert.assertEquals(listener._configSize, _numNodes, "Instance Config size does not match"); value = accessor.getProperty(keyBuilder.clusterConfig()); value._record.setSimpleField("" + System.currentTimeMillis(), "newClusterValue"); listener.reset(); accessor.setProperty(keyBuilder.clusterConfig(), value); Thread.sleep(500); // wait zk callback Assert.assertTrue(listener._configChanged,
ClusterConfig clusterConfig = accessor.getProperty(accessor.keyBuilder().clusterConfig()); StateTransitionThrottleConfig throttleConfigForLoadRebalance = new StateTransitionThrottleConfig(StateTransitionThrottleConfig.RebalanceType.ANY,
@Test public void testIdealStateValidity() throws Exception { MockAccessor accessor = new MockAccessor(); accessor.setProperty(accessor.keyBuilder().clusterConfig(), new ClusterConfig("TestCluster"));
Builder keyBuilder = accessor.keyBuilder(); ClusterConfig clusterConfig = new ClusterConfig("TestCluster"); accessor.setProperty(keyBuilder.clusterConfig(), clusterConfig); for (String node : _liveNodes) { LiveInstance liveInstance = new LiveInstance(node);
ClusterConfig clusterConfig = accessor.getProperty(accessor.keyBuilder().clusterConfig());
public void dropInstanceFromCluster(String clusterName, String instanceId) { ZKHelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(_zkClient)); Builder keyBuilder = accessor.keyBuilder(); InstanceConfig instanceConfig = InstanceConfig.toInstanceConfig(instanceId); instanceId = instanceConfig.getInstanceName(); // ensure node is not live LiveInstance liveInstance = accessor.getProperty(keyBuilder.liveInstance(instanceId)); if (liveInstance != null) { throw new HelixException(String .format("Cannot drop instance %s as it is still live. Please stop it first", instanceId)); } InstanceConfig config = accessor.getProperty(keyBuilder.instanceConfig(instanceId)); if (config == null) { String error = "Node " + instanceId + " does not exist, cannot drop"; _logger.warn(error); throw new HelixException(error); } ClusterConfig clusterConfig = accessor.getProperty(keyBuilder.clusterConfig()); // ensure node is disabled, otherwise fail if (config.getInstanceEnabled() && (clusterConfig.getDisabledInstances() == null || !clusterConfig.getDisabledInstances().containsKey(instanceId))) { String error = "Node " + instanceId + " is enabled, cannot drop"; _logger.warn(error); throw new HelixException(error); } _admin.dropInstance(clusterName, config); }
@Test public void testMissingStateModel() throws Exception { MockAccessor accessor = new MockAccessor(); accessor.setProperty(accessor.keyBuilder().clusterConfig(), new ClusterConfig("TestCluster")); // create an ideal state and no spec String masterSlaveCustomResource = "masterSlaveCustomResource"; String leaderStandbyCustomResource = "leaderStandbyCustomResource"; createIS(accessor, masterSlaveCustomResource, "MasterSlave", RebalanceMode.CUSTOMIZED); createIS(accessor, leaderStandbyCustomResource, "LeaderStandby", RebalanceMode.CUSTOMIZED); // add some state models (but not leader standby) addStateModels(accessor); // refresh the cache ClusterEvent event = new ClusterEvent(ClusterEventType.Unknown); ClusterDataCache cache = new ClusterDataCache(); cache.refresh(accessor); event.addAttribute(AttributeName.ClusterDataCache.name(), cache); // run resource computation new ResourceComputationStage().process(event); Map<String, Resource> resourceMap = event.getAttribute(AttributeName.RESOURCES.name()); Assert.assertTrue(resourceMap.containsKey(masterSlaveCustomResource)); Assert.assertTrue(resourceMap.containsKey(leaderStandbyCustomResource)); // run resource validation new ResourceValidationStage().process(event); Map<String, Resource> finalResourceMap = event.getAttribute(AttributeName.RESOURCES.name()); Assert.assertTrue(finalResourceMap.containsKey(masterSlaveCustomResource)); Assert.assertFalse(finalResourceMap.containsKey(leaderStandbyCustomResource)); }
@Test public void testNoSpec() throws Exception { MockAccessor accessor = new MockAccessor(); accessor.setProperty(accessor.keyBuilder().clusterConfig(), new ClusterConfig("TestCluster")); // create an ideal state and no spec String masterSlaveCustomResource = "masterSlaveCustomResource"; createIS(accessor, masterSlaveCustomResource, "MasterSlave", RebalanceMode.CUSTOMIZED); // add some state models addStateModels(accessor); // refresh the cache ClusterEvent event = new ClusterEvent(ClusterEventType.Unknown); ClusterDataCache cache = new ClusterDataCache(); cache.refresh(accessor); event.addAttribute(AttributeName.ClusterDataCache.name(), cache); // run resource computation new ResourceComputationStage().process(event); Map<String, Resource> resourceMap = event.getAttribute(AttributeName.RESOURCES.name()); Assert.assertTrue(resourceMap.containsKey(masterSlaveCustomResource)); // run resource validation new ResourceValidationStage().process(event); Map<String, Resource> finalResourceMap = event.getAttribute(AttributeName.RESOURCES.name()); Assert.assertTrue(finalResourceMap.containsKey(masterSlaveCustomResource)); }
private void setupCluster(String clusterName, ZKHelixDataAccessor accessor) throws Exception { TestHelper.setupCluster(clusterName, ZK_ADDR, 12918, // participant start port "localhost", // participant name prefix resourceNamePrefix, // resource name prefix 1, // resources 15, // partitions per resource participantCount, // number of nodes 3, // replicas "MasterSlave", IdealState.RebalanceMode.FULL_AUTO, true); // do rebalance PropertyKey.Builder keyBuilder = accessor.keyBuilder(); ClusterConfig clusterConfig = accessor.getProperty(accessor.keyBuilder().clusterConfig()); clusterConfig.setResourcePriorityField("Name"); List<StateTransitionThrottleConfig> throttleConfigs = new ArrayList<>(); throttleConfigs.add( new StateTransitionThrottleConfig(StateTransitionThrottleConfig.RebalanceType.LOAD_BALANCE, StateTransitionThrottleConfig.ThrottleScope.CLUSTER, 100)); throttleConfigs.add(new StateTransitionThrottleConfig( StateTransitionThrottleConfig.RebalanceType.RECOVERY_BALANCE, StateTransitionThrottleConfig.ThrottleScope.CLUSTER, 100)); clusterConfig.setStateTransitionThrottleConfigs(throttleConfigs); accessor.setProperty(keyBuilder.clusterConfig(), clusterConfig); }
public void removeListenersFromController(GenericHelixController controller) { PropertyKey.Builder keyBuilder = new PropertyKey.Builder(_manager.getClusterName()); /** * reset generic-controller */ _manager.removeListener(keyBuilder.idealStates(), controller); _manager.removeListener(keyBuilder.liveInstances(), controller); _manager.removeListener(keyBuilder.clusterConfig(), controller); _manager.removeListener(keyBuilder.resourceConfigs(), controller); _manager.removeListener(keyBuilder.instanceConfigs(), controller); _manager.removeListener(keyBuilder.controller(), controller); /** * reset controller message listener and unregister all message handlers */ _manager.removeListener(keyBuilder.controllerMessages(), _messagingService.getExecutor()); }
protected void setClusterConfig(ClusterConfig clusterConfig) { accessor.setProperty(accessor.keyBuilder().clusterConfig(), clusterConfig); }
private void preSetup(StateTransitionThrottleConfig.RebalanceType rebalanceType, Set<String> resourceSet, int numOfLiveInstances, int numOfReplicas) { setupIdealState(numOfLiveInstances, resourceSet.toArray(new String[resourceSet.size()]), numOfLiveInstances, numOfReplicas, IdealState.RebalanceMode.FULL_AUTO, "OnlineOffline"); setupStateModel(); setupLiveInstances(numOfLiveInstances); // Set up cluster configs _clusterConfig = accessor.getProperty(accessor.keyBuilder().clusterConfig()); StateTransitionThrottleConfig throttleConfig = new StateTransitionThrottleConfig(rebalanceType, StateTransitionThrottleConfig.ThrottleScope.CLUSTER, Integer.MAX_VALUE); _clusterConfig.setStateTransitionThrottleConfigs(Collections.singletonList(throttleConfig)); setClusterConfig(_clusterConfig); } }
private void createISSpec(HelixDataAccessor accessor, String specId, String stateModelDefRef, RebalanceMode rebalanceMode) { PropertyKey propertyKey = accessor.keyBuilder().clusterConfig(); HelixProperty property = accessor.getProperty(propertyKey); if (property == null) { property = new HelixProperty("sampleClusterConfig"); } String key = "IdealStateRule!" + specId; String value = IdealStateProperty.REBALANCE_MODE.toString() + "=" + rebalanceMode.toString() + "," + IdealStateProperty.STATE_MODEL_DEF_REF.toString() + "=" + stateModelDefRef; property.getRecord().setSimpleField(key, value); accessor.setProperty(propertyKey, property); }
private void preSetup(StateTransitionThrottleConfig.RebalanceType rebalanceType, Set<String> resourceSet, int numOfLiveInstances, int numOfReplicas, String stateModelName) { setupIdealState(numOfLiveInstances, resourceSet.toArray(new String[resourceSet.size()]), numOfLiveInstances, numOfReplicas, IdealState.RebalanceMode.FULL_AUTO, stateModelName); setupStateModel(); setupLiveInstances(numOfLiveInstances); // Set up cluster configs _clusterConfig = accessor.getProperty(accessor.keyBuilder().clusterConfig()); StateTransitionThrottleConfig throttleConfig = new StateTransitionThrottleConfig(rebalanceType, StateTransitionThrottleConfig.ThrottleScope.CLUSTER, Integer.MAX_VALUE); _clusterConfig.setStateTransitionThrottleConfigs(Collections.singletonList(throttleConfig)); setClusterConfig(_clusterConfig); } }
private void preSetup(StateTransitionThrottleConfig.RebalanceType rebalanceType, Set<String> resourceSet, String priorityField, int numOfLiveInstances, int numOfReplicas) { setupIdealState(numOfLiveInstances, resourceSet.toArray(new String[resourceSet.size()]), numOfLiveInstances, numOfReplicas, IdealState.RebalanceMode.FULL_AUTO, "MasterSlave"); setupStateModel(); setupLiveInstances(numOfLiveInstances); // Set up cluster configs ClusterConfig clusterConfig = accessor.getProperty(accessor.keyBuilder().clusterConfig()); StateTransitionThrottleConfig throttleConfig = new StateTransitionThrottleConfig(rebalanceType, StateTransitionThrottleConfig.ThrottleScope.CLUSTER, 1); clusterConfig.setStateTransitionThrottleConfigs(Collections.singletonList(throttleConfig)); clusterConfig.setResourcePriorityField(priorityField); setClusterConfig(clusterConfig); }
private void refreshClusterConfig(String clusterName, HelixDataAccessor accessor) { accessor.setProperty(accessor.keyBuilder().clusterConfig(), new ClusterConfig(clusterName)); } }
@Override public void addClusterfigChangeListener(ClusterConfigChangeListener listener) throws Exception{ addListener(listener, new Builder(_clusterName).clusterConfig(), ChangeType.CLUSTER_CONFIG, new EventType[] { EventType.NodeDataChanged }); }
@Override public void addClusterfigChangeListener(ClusterConfigChangeListener listener) throws Exception{ addListener(listener, new Builder(_clusterName).clusterConfig(), ChangeType.CLUSTER_CONFIG, new EventType[] { EventType.NodeDataChanged }); }