/** * Check if state counts are properly defined for each state * @return true if state counts valid, false otherwise */ private boolean areStateCountsValid() { for (String state : _statePriorityList) { // all states should have a count String count = _stateModelDef.getNumInstancesPerState(state); if (count == null) { _logger.error("State " + state + " needs an upper bound constraint, state model: " + _stateModelDef.getId()); return false; } // count should be a number, N, or R try { Integer.parseInt(count); } catch (NumberFormatException e) { if (!count.equals("N") && !count.equals("R")) { _logger.error("State " + state + " has invalid count " + count + ", state model: " + _stateModelDef.getId()); return false; } } } return true; }
/** * Check if state counts are properly defined for each state * @return true if state counts valid, false otherwise */ private boolean areStateCountsValid() { for (String state : _statePriorityList) { // all states should have a count String count = _stateModelDef.getNumInstancesPerState(state); if (count == null) { _logger.error("State " + state + " needs an upper bound constraint, state model: " + _stateModelDef.getId()); return false; } // count should be a number, N, or R try { Integer.parseInt(count); } catch (NumberFormatException e) { if (!count.equals("N") && !count.equals("R")) { _logger.error("State " + state + " has invalid count " + count + ", state model: " + _stateModelDef.getId()); return false; } } } return true; }
if (index <= 0 || index >= transition.length() - 1 || index != lastIndex) { _logger.error("Transition " + transition + " is not of the form SRC-DEST, state model: " + _stateModelDef.getId()); return false; if (!_stateSet.contains(from)) { _logger.error("State " + from + " in " + transition + " is not a defined state, state model" + _stateModelDef.getId()); return false; + " is not a defined state, state model: " + _stateModelDef.getId()); return false;
if (index <= 0 || index >= transition.length() - 1 || index != lastIndex) { _logger.error("Transition " + transition + " is not of the form SRC-DEST, state model: " + _stateModelDef.getId()); return false; if (!_stateSet.contains(from)) { _logger.error("State " + from + " in " + transition + " is not a defined state, state model" + _stateModelDef.getId()); return false; + " is not a defined state, state model: " + _stateModelDef.getId()); return false;
if (_stateModelDef.getId() == null || _stateModelDef.getId().isEmpty()) { _logger.error("State model does not have a name"); return false; .error("State model does not contain init state, statemodel:" + _stateModelDef.getId()); return false; + _stateModelDef.getId()); return false; + _stateModelDef.getId()); return false; + _stateModelDef.getId()); return false;
if (_stateModelDef.getId() == null || _stateModelDef.getId().isEmpty()) { _logger.error("State model does not have a name"); return false; .error("State model does not contain init state, statemodel:" + _stateModelDef.getId()); return false; + _stateModelDef.getId()); return false; + _stateModelDef.getId()); return false; + _stateModelDef.getId()); return false;
&& !to.equals(HelixDefinedState.ERROR.toString())) { _logger.error("Initial state " + from + " cannot reach " + to + ", state model: " + _stateModelDef.getId()); return false; + " contains an infinite loop, state model: " + _stateModelDef.getId()); return false; if (next == null) { _logger.error("Path from " + from + " to " + to + " is incomplete, state model: " + _stateModelDef.getId()); return false;
&& !to.equals(HelixDefinedState.ERROR.toString())) { _logger.error("Initial state " + from + " cannot reach " + to + ", state model: " + _stateModelDef.getId()); return false; + " contains an infinite loop, state model: " + _stateModelDef.getId()); return false; if (next == null) { _logger.error("Path from " + from + " to " + to + " is incomplete, state model: " + _stateModelDef.getId()); return false;
&& _stateModelDef.getNextStateForTransition(state, HelixDefinedState.DROPPED.toString()) == null) { _logger.error("State " + state + " cannot reach the DROPPED state, state model: " + _stateModelDef.getId()); return false; && _stateModelDef.getNextStateForTransition(_stateModelDef.getInitialState(), state) == null) { _logger.error("Initial state " + _stateModelDef.getInitialState() + " should be able to reach all states, state model: " + _stateModelDef.getId()); return false; if (intermediate != null && !_stateSet.contains(intermediate)) { _logger.error("Intermediate state " + intermediate + " for transition " + state + "-" + destState + " is not a valid state, state model: " + _stateModelDef.getId()); return false; _logger.error("Intermediate state " + intermediate + " for transition " + state + "-" + destState + " should never be the from state, state model: " + _stateModelDef.getId()); return false;
&& _stateModelDef.getNextStateForTransition(state, HelixDefinedState.DROPPED.toString()) == null) { _logger.error("State " + state + " cannot reach the DROPPED state, state model: " + _stateModelDef.getId()); return false; && _stateModelDef.getNextStateForTransition(_stateModelDef.getInitialState(), state) == null) { _logger.error("Initial state " + _stateModelDef.getInitialState() + " should be able to reach all states, state model: " + _stateModelDef.getId()); return false; if (intermediate != null && !_stateSet.contains(intermediate)) { _logger.error("Intermediate state " + intermediate + " for transition " + state + "-" + destState + " is not a valid state, state model: " + _stateModelDef.getId()); return false; _logger.error("Intermediate state " + intermediate + " for transition " + state + "-" + destState + " should never be the from state, state model: " + _stateModelDef.getId()); return false;
public void addCluster(String clusterName, boolean overwritePrevious) { _admin.addCluster(clusterName, overwritePrevious); for (BuiltInStateModelDefinitions def : BuiltInStateModelDefinitions.values()) { addStateModelDef(clusterName, def.getStateModelDefinition().getId(), def.getStateModelDefinition(), overwritePrevious); } }
public void addCluster(String clusterName, boolean overwritePrevious) { _admin.addCluster(clusterName, overwritePrevious); for (BuiltInStateModelDefinitions def : BuiltInStateModelDefinitions.values()) { addStateModelDef(clusterName, def.getStateModelDefinition().getId(), def.getStateModelDefinition(), overwritePrevious); } }
@Override public boolean createStateModelDef(StateModelDefinition stateModelDef) { String path = PropertyPathBuilder.stateModelDef(_clusterName, stateModelDef.getId()); HelixProperty property = getProperty(new PropertyKey.Builder(_clusterName).stateModelDef(stateModelDef.getId())); // Set new StateModelDefinition if it is different from old one. if (property != null) { // StateModelDefinition need to be updated if (!new StateModelDefinition(property.getRecord()).equals(stateModelDef)) { return stateModelDef.isValid() && _baseDataAccessor .set(path, stateModelDef.getRecord(), AccessOption.PERSISTENT); } } else { // StateModeDefinition does not exist return stateModelDef.isValid() && _baseDataAccessor .create(path, stateModelDef.getRecord(), AccessOption.PERSISTENT); } // StateModelDefinition exists but not need to be updated return true; }
@Override public boolean createStateModelDef(StateModelDefinition stateModelDef) { String path = PropertyPathBuilder.stateModelDef(_clusterName, stateModelDef.getId()); HelixProperty property = getProperty(new PropertyKey.Builder(_clusterName).stateModelDef(stateModelDef.getId())); // Set new StateModelDefinition if it is different from old one. if (property != null) { // StateModelDefinition need to be updated if (!new StateModelDefinition(property.getRecord()).equals(stateModelDef)) { return stateModelDef.isValid() && _baseDataAccessor .set(path, stateModelDef.getRecord(), AccessOption.PERSISTENT); } } else { // StateModeDefinition does not exist return stateModelDef.isValid() && _baseDataAccessor .create(path, stateModelDef.getRecord(), AccessOption.PERSISTENT); } // StateModelDefinition exists but not need to be updated return true; }
message = createStateTransitionCancellationMessage(manager, resource, partition.getPartitionName(), instanceName, sessionIdMap.get(instanceName), stateModelDef.getId(), pendingMessage.getFromState(), pendingMessage.getToState(), null, cancellationMessage, isCancellationEnabled, currentState); stateModelDef.getId(), pendingMessage.getFromState(), pendingState, nextState, cancellationMessage, isCancellationEnabled, currentState); stateModelDef.getId());
private void addStateModels(HelixDataAccessor accessor) { StateModelDefinition masterSlave = new StateModelDefinition(StateModelConfigGenerator.generateConfigForMasterSlave()); accessor.setProperty(accessor.keyBuilder().stateModelDef(masterSlave.getId()), masterSlave); StateModelDefinition onlineOffline = new StateModelDefinition(StateModelConfigGenerator.generateConfigForOnlineOffline()); accessor.setProperty(accessor.keyBuilder().stateModelDef(onlineOffline.getId()), onlineOffline); } }
message = createStateTransitionCancellationMessage(manager, resource, partition.getPartitionName(), instanceName, sessionIdMap.get(instanceName), stateModelDef.getId(), pendingMessage.getFromState(), pendingMessage.getToState(), null, cancellationMessage, isCancellationEnabled, currentState); stateModelDef.getId(), pendingMessage.getFromState(), pendingState, nextState, cancellationMessage, isCancellationEnabled, currentState); createStateTransitionMessage(manager, resource, partition.getPartitionName(), instanceName, currentState, nextState, sessionIdMap.get(instanceName), stateModelDef.getId());
protected void setupStateModel(String clusterName) { ZKHelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(_gZkClient)); Builder keyBuilder = accessor.keyBuilder(); StateModelDefinition masterSlave = new StateModelDefinition(StateModelConfigGenerator.generateConfigForMasterSlave()); accessor.setProperty(keyBuilder.stateModelDef(masterSlave.getId()), masterSlave); StateModelDefinition leaderStandby = new StateModelDefinition(StateModelConfigGenerator.generateConfigForLeaderStandby()); accessor.setProperty(keyBuilder.stateModelDef(leaderStandby.getId()), leaderStandby); StateModelDefinition onlineOffline = new StateModelDefinition(StateModelConfigGenerator.generateConfigForOnlineOffline()); accessor.setProperty(keyBuilder.stateModelDef(onlineOffline.getId()), onlineOffline); }
@Override public boolean verify() throws Exception { for (BuiltInStateModelDefinitions def : BuiltInStateModelDefinitions.values()) { String path = keyBuilder.stateModelDef(def.getStateModelDefinition().getId()).getPath(); boolean exist = baseAccessor.exists(path, 0); if (!exist) { return false; } // make sure MasterSlave is not over-written if (def == BuiltInStateModelDefinitions.MasterSlave) { Stat stat = new Stat(); baseAccessor.get(path, stat, 0); if (stat.getVersion() != 0) { return false; } } } return true; } }, 10 * 1000);
HelixAdmin admin = new ZKHelixAdmin(_gZkClient); admin.addCluster(clusterName); admin.addStateModelDef(clusterName, BuiltInStateModelDefinitions.MasterSlave.getStateModelDefinition().getId(), BuiltInStateModelDefinitions.MasterSlave.getStateModelDefinition()); ClusterControllerManager controller = new ClusterControllerManager(ZK_ADDR, clusterName);