private static StateModelDefinition getStateModelDef(StateModelConfig stateModel, ConstraintsConfig constraints) { StateModelDefinition.Builder builder = new StateModelDefinition.Builder(stateModel.name); if (stateModel.states == null || stateModel.states.size() == 0) { throw new HelixException("List of states are required in a state model!"); throw new HelixException("Initial state is not a valid state"); builder.initialState(stateModel.initialState); builder.addState(state, statePriorities.get(state)); } else { builder.addState(state); throw new HelixException("State " + state + " has a count, but not in the state list!"); builder.dynamicUpperBound(state, counts.get("count")); builder.addTransition(from, to, transitionPriorities.get(name)); } else { builder.addTransition(from, to); return builder.build();
StateModelDefinition stateModel = new StateModelDefinition.Builder("MasterSlave") .initialState("OFFLINE") .addState("MASTER", 1).addState("SLAVE", 2).addState("OFFLINE") .addState(HelixDefinedState.DROPPED.toString()) .upperBound("MASTER", 1) .dynamicUpperBound("SLAVE", "R") .addTransition("SLAVE", "MASTER", 1).addTransition("OFFLINE", "SLAVE", 2) .addTransition("MASTER", "SLAVE", 3).addTransition("SLAVE", "OFFLINE", 3) .addTransition("OFFLINE", HelixDefinedState.DROPPED.toString()) .build();
private static StateModelDefinition getStateModelDef(StateModelConfig stateModel, ConstraintsConfig constraints) { StateModelDefinition.Builder builder = new StateModelDefinition.Builder(stateModel.name); if (stateModel.states == null || stateModel.states.size() == 0) { throw new HelixException("List of states are required in a state model!"); throw new HelixException("Initial state is not a valid state"); builder.initialState(stateModel.initialState); builder.addState(state, statePriorities.get(state)); } else { builder.addState(state); throw new HelixException("State " + state + " has a count, but not in the state list!"); builder.dynamicUpperBound(state, counts.get("count")); builder.addTransition(from, to, transitionPriorities.get(name)); } else { builder.addTransition(from, to); return builder.build();
StateModelDefinition.Builder builder =new StateModelDefinition.Builder(TaskConstants.STATE_MODEL_NAME); builder.initialState(TaskPartitionState.INIT.name()); builder.addState(TaskPartitionState.INIT.name(), 0); builder.addState(TaskPartitionState.RUNNING.name(), 1); builder.addState(TaskPartitionState.STOPPED.name(), 2); builder.addState(TaskPartitionState.COMPLETED.name(), 3); builder.addState(TaskPartitionState.TIMED_OUT.name(), 4); builder.addState(TaskPartitionState.TASK_ERROR.name(), 5); builder.addState(TaskPartitionState.TASK_ABORTED.name(), 6); builder.addState(TaskPartitionState.DROPPED.name()); builder.addTransition(TaskPartitionState.INIT.name(), TaskPartitionState.RUNNING.name(), 0); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.STOPPED.name(), 1); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.COMPLETED.name(), 2); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.TIMED_OUT.name(), 3); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.TASK_ERROR.name(), 4); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.TASK_ABORTED.name(), 5); builder.addTransition(TaskPartitionState.STOPPED.name(), TaskPartitionState.RUNNING.name(), 6); builder.addTransition(TaskPartitionState.INIT.name(), TaskPartitionState.DROPPED.name(), 7); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.DROPPED.name(), 8); builder.addTransition(TaskPartitionState.COMPLETED.name(), TaskPartitionState.DROPPED.name(), 9); builder.addTransition(TaskPartitionState.STOPPED.name(), TaskPartitionState.DROPPED.name(), 10); builder.addTransition(TaskPartitionState.TIMED_OUT.name(), TaskPartitionState.DROPPED.name(), 11); builder.addTransition(TaskPartitionState.TASK_ERROR.name(), TaskPartitionState.DROPPED.name(), 12); builder.addTransition(TaskPartitionState.TASK_ABORTED.name(), TaskPartitionState.DROPPED.name(), 13);
StateModelDefinition.Builder builder =new StateModelDefinition.Builder(TaskConstants.STATE_MODEL_NAME); builder.initialState(TaskPartitionState.INIT.name()); builder.addState(TaskPartitionState.INIT.name(), 0); builder.addState(TaskPartitionState.RUNNING.name(), 1); builder.addState(TaskPartitionState.STOPPED.name(), 2); builder.addState(TaskPartitionState.COMPLETED.name(), 3); builder.addState(TaskPartitionState.TIMED_OUT.name(), 4); builder.addState(TaskPartitionState.TASK_ERROR.name(), 5); builder.addState(TaskPartitionState.TASK_ABORTED.name(), 6); builder.addState(TaskPartitionState.DROPPED.name()); builder.addTransition(TaskPartitionState.INIT.name(), TaskPartitionState.RUNNING.name(), 0); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.STOPPED.name(), 1); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.COMPLETED.name(), 2); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.TIMED_OUT.name(), 3); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.TASK_ERROR.name(), 4); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.TASK_ABORTED.name(), 5); builder.addTransition(TaskPartitionState.STOPPED.name(), TaskPartitionState.RUNNING.name(), 6); builder.addTransition(TaskPartitionState.INIT.name(), TaskPartitionState.DROPPED.name(), 7); builder.addTransition(TaskPartitionState.RUNNING.name(), TaskPartitionState.DROPPED.name(), 8); builder.addTransition(TaskPartitionState.COMPLETED.name(), TaskPartitionState.DROPPED.name(), 9); builder.addTransition(TaskPartitionState.STOPPED.name(), TaskPartitionState.DROPPED.name(), 10); builder.addTransition(TaskPartitionState.TIMED_OUT.name(), TaskPartitionState.DROPPED.name(), 11); builder.addTransition(TaskPartitionState.TASK_ERROR.name(), TaskPartitionState.DROPPED.name(), 12); builder.addTransition(TaskPartitionState.TASK_ABORTED.name(), TaskPartitionState.DROPPED.name(), 13);
private static StateModelDefinition defineStateModel() { StateModelDefinition.Builder builder = new StateModelDefinition.Builder("Bootstrap"); builder.addState("MASTER", 1); builder.addState("SLAVE", 2); builder.addState("BOOTSTRAP", 3); builder.addState("OFFLINE"); builder.addState("DROPPED"); builder.initialState("OFFLINE"); builder.addTransition("OFFLINE", "BOOTSTRAP", 3); builder.addTransition("BOOTSTRAP", "SLAVE", 2); builder.addTransition("SLAVE", "MASTER", 1); builder.addTransition("MASTER", "SLAVE", 4); builder.addTransition("SLAVE", "OFFLINE", 5); builder.addTransition("OFFLINE", "DROPPED", 6); builder.upperBound("MASTER", 1); builder.dynamicUpperBound("SLAVE", "R"); StateModelDefinition statemodelDefinition = builder.build();
/** * Build Master-slave state model definition * @return */ public static StateModelDefinition build() { StateModelDefinition.Builder builder =new StateModelDefinition.Builder(name); // init state builder.initialState(States.OFFLINE.name()); // add states builder.addState(States.MASTER.name(), 0); builder.addState(States.SLAVE.name(), 1); builder.addState(States.OFFLINE.name(), 2); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name()); } // add transitions builder.addTransition(States.MASTER.name(), States.SLAVE.name(), 0); builder.addTransition(States.SLAVE.name(), States.MASTER.name(), 1); builder.addTransition(States.OFFLINE.name(), States.SLAVE.name(), 2); builder.addTransition(States.SLAVE.name(), States.OFFLINE.name(), 3); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name()); // bounds builder.upperBound(States.MASTER.name(), 1); builder.dynamicUpperBound(States.SLAVE.name(), "R"); return builder.build(); }
/** * Build Master-slave state model definition * @return */ public static StateModelDefinition build() { StateModelDefinition.Builder builder =new StateModelDefinition.Builder(name); // init state builder.initialState(States.OFFLINE.name()); // add states builder.addState(States.MASTER.name(), 0); builder.addState(States.SLAVE.name(), 1); builder.addState(States.OFFLINE.name(), 2); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name()); } // add transitions builder.addTransition(States.MASTER.name(), States.SLAVE.name(), 0); builder.addTransition(States.SLAVE.name(), States.MASTER.name(), 1); builder.addTransition(States.OFFLINE.name(), States.SLAVE.name(), 2); builder.addTransition(States.SLAVE.name(), States.OFFLINE.name(), 3); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name()); // bounds builder.upperBound(States.MASTER.name(), 1); builder.dynamicUpperBound(States.SLAVE.name(), "R"); return builder.build(); }
/** * Build Leader-standby state model definition * @return */ public static StateModelDefinition build() { StateModelDefinition.Builder builder =new StateModelDefinition.Builder(name); // init state builder.initialState(States.OFFLINE.name()); // add states builder.addState(States.LEADER.name(), 0); builder.addState(States.STANDBY.name(), 1); builder.addState(States.OFFLINE.name(), 2); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name()); } // add transitions builder.addTransition(States.LEADER.name(), States.STANDBY.name(), 0); builder.addTransition(States.STANDBY.name(), States.LEADER.name(), 1); builder.addTransition(States.OFFLINE.name(), States.STANDBY.name(), 2); builder.addTransition(States.STANDBY.name(), States.OFFLINE.name(), 3); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name()); // bounds builder.upperBound(States.LEADER.name(), 1); builder.dynamicUpperBound(States.STANDBY.name(), "R"); return builder.build(); }
private static StateModelDefinition defineStateModel() { StateModelDefinition.Builder builder = new StateModelDefinition.Builder(STATE_MODEL_NAME); // Add states and their rank to indicate priority. Lower the rank higher the // priority builder.addState(MASTER, 1); builder.addState(SLAVE, 2); builder.addState(OFFLINE); builder.addState(DROPPED); // Set the initial state when the node starts builder.initialState(OFFLINE); // Add transitions between the states. builder.addTransition(OFFLINE, SLAVE); builder.addTransition(SLAVE, OFFLINE); builder.addTransition(SLAVE, MASTER); builder.addTransition(MASTER, SLAVE); builder.addTransition(OFFLINE, DROPPED); // set constraints on states. // static constraint builder.upperBound(MASTER, 1); // dynamic constraint, R means it should be derived based on the replication // factor. builder.dynamicUpperBound(SLAVE, "R"); StateModelDefinition statemodelDefinition = builder.build(); return statemodelDefinition; }
/** * Build Leader-standby state model definition * @return */ public static StateModelDefinition build() { StateModelDefinition.Builder builder =new StateModelDefinition.Builder(name); // init state builder.initialState(States.OFFLINE.name()); // add states builder.addState(States.LEADER.name(), 0); builder.addState(States.STANDBY.name(), 1); builder.addState(States.OFFLINE.name(), 2); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name()); } // add transitions builder.addTransition(States.LEADER.name(), States.STANDBY.name(), 0); builder.addTransition(States.STANDBY.name(), States.LEADER.name(), 1); builder.addTransition(States.OFFLINE.name(), States.STANDBY.name(), 2); builder.addTransition(States.STANDBY.name(), States.OFFLINE.name(), 3); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name()); // bounds builder.upperBound(States.LEADER.name(), 1); builder.dynamicUpperBound(States.STANDBY.name(), "R"); return builder.build(); }
private static StateModelDefinition defineStateModel() { StateModelDefinition.Builder builder = new StateModelDefinition.Builder(STATE_MODEL_NAME); // Add states and their rank to indicate priority. Lower the rank higher the // priority builder.addState(MASTER, 1); builder.addState(SLAVE, 2); builder.addState(OFFLINE); builder.addState(DROPPED); // Set the initial state when the node starts builder.initialState(OFFLINE); // Add transitions between the states. builder.addTransition(OFFLINE, SLAVE); builder.addTransition(SLAVE, OFFLINE); builder.addTransition(SLAVE, MASTER); builder.addTransition(MASTER, SLAVE); builder.addTransition(OFFLINE, DROPPED); // set constraints on states. // static constraint builder.upperBound(MASTER, 1); // dynamic constraint, R means it should be derived based on the replication // factor. builder.dynamicUpperBound(SLAVE, "R"); StateModelDefinition statemodelDefinition = builder.build(); return statemodelDefinition; }
/** * SRC and DEST in a transition SRC-TEST must be valid states */ @Test public void testTransitionsWithInvalidStates() { // invalid to state StateModelDefinition stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addState("DROPPED") .addTransition("OFFLINE", "SLAVE").addTransition("SLAVE", "MASTER") .addTransition("SLAVE", "OFFLINE").addTransition("OFFLINE", "DROPPED") .addTransition("MASTER", "SLAVE").addTransition("OFFLINE", "INVALID").build(); Assert.assertFalse(stateModel.isValid()); // invalid from state stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addState("DROPPED") .addTransition("OFFLINE", "SLAVE").addTransition("SLAVE", "MASTER") .addTransition("SLAVE", "OFFLINE").addTransition("OFFLINE", "DROPPED") .addTransition("MASTER", "SLAVE").addTransition("INVALID", "MASTER").build(); Assert.assertFalse(stateModel.isValid()); }
/** * Build StorageSchemata state model definition * @return */ public static StateModelDefinition build() { StateModelDefinition.Builder builder =new StateModelDefinition.Builder(name); // init state builder.initialState(States.OFFLINE.name()); // add states builder.addState(States.MASTER.name(), 0); builder.addState(States.OFFLINE.name(), 1); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name()); } // add transitions builder.addTransition(States.MASTER.name(), States.OFFLINE.name(), 0); builder.addTransition(States.OFFLINE.name(), States.MASTER.name(), 1); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name()); // bounds builder.dynamicUpperBound(States.MASTER.name(), "N"); return builder.build(); }
/** * Build OnlineOffline state model definition * @return */ public static StateModelDefinition build() { StateModelDefinition.Builder builder =new StateModelDefinition.Builder(name); // init state builder.initialState(States.OFFLINE.name()); // add states builder.addState(States.ONLINE.name(), 0); builder.addState(States.OFFLINE.name(), 1); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name()); } // add transitions builder.addTransition(States.ONLINE.name(), States.OFFLINE.name(), 0); builder.addTransition(States.OFFLINE.name(), States.ONLINE.name(), 1); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name()); // bounds builder.dynamicUpperBound(States.ONLINE.name(), "R"); return builder.build(); }
/** * Build SchedulerTaskQueue state model definition * @return */ public static StateModelDefinition build() { StateModelDefinition.Builder builder =new StateModelDefinition.Builder(name); // init state builder.initialState(States.OFFLINE.name()); // add states builder.addState(States.COMPLETED.name(), 0); builder.addState(States.OFFLINE.name(), 1); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name()); } // add transitions builder.addTransition(States.COMPLETED.name(), States.OFFLINE.name(), 0); builder.addTransition(States.OFFLINE.name(), States.COMPLETED.name(), 1); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name()); // bounds builder.dynamicUpperBound(States.COMPLETED.name(), "1"); return builder.build(); }
/** * Build SchedulerTaskQueue state model definition * @return */ public static StateModelDefinition build() { StateModelDefinition.Builder builder =new StateModelDefinition.Builder(name); // init state builder.initialState(States.OFFLINE.name()); // add states builder.addState(States.COMPLETED.name(), 0); builder.addState(States.OFFLINE.name(), 1); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name()); } // add transitions builder.addTransition(States.COMPLETED.name(), States.OFFLINE.name(), 0); builder.addTransition(States.OFFLINE.name(), States.COMPLETED.name(), 1); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name()); // bounds builder.dynamicUpperBound(States.COMPLETED.name(), "1"); return builder.build(); }
/** * Build StorageSchemata state model definition * @return */ public static StateModelDefinition build() { StateModelDefinition.Builder builder =new StateModelDefinition.Builder(name); // init state builder.initialState(States.OFFLINE.name()); // add states builder.addState(States.MASTER.name(), 0); builder.addState(States.OFFLINE.name(), 1); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name()); } // add transitions builder.addTransition(States.MASTER.name(), States.OFFLINE.name(), 0); builder.addTransition(States.OFFLINE.name(), States.MASTER.name(), 1); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name()); // bounds builder.dynamicUpperBound(States.MASTER.name(), "N"); return builder.build(); }
/** * Ensure that Helix can catch when a state doesn't have a path to DROPPED */ @Test public void testNoPathToDropped() { StateModelDefinition stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addState("DROPPED") .addTransition("OFFLINE", "SLAVE").addTransition("SLAVE", "MASTER") .addTransition("SLAVE", "OFFLINE").addTransition("OFFLINE", "DROPPED").build(); Assert.assertFalse(stateModel.isValid()); // now see that adding MASTER-DROPPED fixes the problem stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addState("DROPPED") .addTransition("OFFLINE", "SLAVE").addTransition("SLAVE", "MASTER") .addTransition("SLAVE", "OFFLINE").addTransition("OFFLINE", "DROPPED") .addTransition("MASTER", "DROPPED").build(); Assert.assertTrue(stateModel.isValid()); }
/** * Get a StateModelDefinition without transitions. The auto rebalancer doesn't take transitions * into account when computing mappings, so this is acceptable. * @param modelName name to give the model * @param initialState initial state for all nodes * @param states ordered map of state to count * @return incomplete StateModelDefinition for rebalancing */ private StateModelDefinition getIncompleteStateModelDef(String modelName, String initialState, LinkedHashMap<String, Integer> states) { StateModelDefinition.Builder builder = new StateModelDefinition.Builder(modelName); builder.initialState(initialState); int i = states.size(); for (String state : states.keySet()) { builder.addState(state, i); builder.upperBound(state, states.get(state)); i--; } return builder.build(); }