/** * Ensure that Helix responds negatively if DROPPED is not specified */ @Test public void testNoDroppedState() { StateModelDefinition stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addTransition("OFFLINE", "SLAVE") .addTransition("SLAVE", "MASTER").addTransition("MASTER", "SLAVE") .addTransition("SLAVE", "OFFLINE").build(); Assert.assertFalse(stateModel.isValid()); }
/** * There should be an initial state, otherwise instantiation should fail */ @Test public void testNoInitialState() { try { new StateModelDefinition.Builder("stateModel").addState("OFFLINE").addState("MASTER") .addState("SLAVE").addState("DROPPED").addTransition("OFFLINE", "SLAVE") .addTransition("SLAVE", "MASTER").addTransition("SLAVE", "OFFLINE") .addTransition("OFFLINE", "DROPPED").addTransition("MASTER", "SLAVE").build(); Assert.fail("StateModelDefinition creation should fail if no initial state"); } catch (IllegalArgumentException e) { } }
/** * The initial state should be added as a state, otherwise validation check should fail */ @Test public void testInitialStateIsNotState() { StateModelDefinition stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("MASTER") .addState("SLAVE").addState("DROPPED").addTransition("OFFLINE", "SLAVE") .addTransition("SLAVE", "MASTER").addTransition("SLAVE", "OFFLINE") .addTransition("OFFLINE", "DROPPED").addTransition("MASTER", "SLAVE").build(); Assert.assertFalse(stateModel.isValid()); }
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 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(); }
/** * 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 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 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 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 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(); }
/** * 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()); }
/** * Build OnlineOffline state model definition */ public static StateModelDefinition build() { Builder builder = new Builder(name); // init state builder.initialState(States.OFFLINE.name()); // add states builder.addState(States.ONLINE.name(), 20); builder.addState(States.OFFLINE.name(), -1); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name(), -1); } // add transitions builder.addTransition(States.ONLINE.name(), States.OFFLINE.name(), 25); builder.addTransition(States.OFFLINE.name(), States.ONLINE.name(), 5); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name(), 0); // bounds builder.dynamicUpperBound(States.ONLINE.name(), "R"); return builder.build(); }
/** * Create a modified version of OnlineOffline where the parallelism is enforced by the upper bound * of ONLINE * @param stateModelName * @param parallelism * @return */ private StateModelDefinition createEnforcedParallelismStateModelDef(String stateModelName, int parallelism) { StateModelDefinition.Builder builder = new StateModelDefinition.Builder(stateModelName).addState("ONLINE", 1).addState("OFFLINE") .addState("DROPPED").addState("ERROR").initialState("OFFLINE") .addTransition("ERROR", "OFFLINE", 1).addTransition("ONLINE", "OFFLINE", 2) .addTransition("OFFLINE", "DROPPED", 3).addTransition("OFFLINE", "ONLINE", 4) .dynamicUpperBound("ONLINE", String.valueOf(PARALLELISM)).upperBound("OFFLINE", -1) .upperBound("DROPPED", -1).upperBound("ERROR", -1); return builder.build(); }
/** * Create a modified version of OnlineOffline where the transition to ONLINE is given lowest * priority * @param stateModelName * @return */ private StateModelDefinition createReprioritizedStateModelDef(String stateModelName) { StateModelDefinition.Builder builder = new StateModelDefinition.Builder(stateModelName).addState("ONLINE", 1).addState("OFFLINE") .addState("DROPPED").addState("ERROR").initialState("OFFLINE") .addTransition("ERROR", "OFFLINE", 1).addTransition("ONLINE", "OFFLINE", 2) .addTransition("OFFLINE", "DROPPED", 3).addTransition("OFFLINE", "ONLINE", 4) .dynamicUpperBound("ONLINE", "R").upperBound("OFFLINE", -1).upperBound("DROPPED", -1) .upperBound("ERROR", -1); return builder.build(); }
/** * The initial state should be able to reach all states, should fail validation otherwise */ @Test public void testUnreachableState() { StateModelDefinition stateModel = new StateModelDefinition.Builder("stateModel").initialState("OFFLINE").addState("OFFLINE") .addState("MASTER").addState("SLAVE").addState("DROPPED") .addTransition("OFFLINE", "SLAVE").addTransition("SLAVE", "OFFLINE") .addTransition("OFFLINE", "DROPPED").addTransition("MASTER", "SLAVE") .addTransition("MASTER", "DROPPED").build(); Assert.assertFalse(stateModel.isValid()); }
/** * Add a state transition with maximal priority value * @see #addTransition(String, String, int) * @param fromState * @param toState * @return Builder */ public Builder addTransition(String fromState, String toState) { addTransition(fromState, toState, Integer.MAX_VALUE); return this; }
/** * Add a state transition with maximal priority value * @see #addTransition(String, String, int) * @param fromState * @param toState * @return Builder */ public Builder addTransition(String fromState, String toState) { addTransition(fromState, toState, Integer.MAX_VALUE); return this; }
/** * 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(), 20); builder.addState(States.OFFLINE.name(), -1); for (HelixDefinedState state : HelixDefinedState.values()) { builder.addState(state.name(), -1); } // add transitions builder.addTransition(States.ONLINE.name(), States.OFFLINE.name(), 25); builder.addTransition(States.OFFLINE.name(), States.ONLINE.name(), 5); builder.addTransition(States.OFFLINE.name(), HelixDefinedState.DROPPED.name(), 0); // bounds builder.dynamicUpperBound(States.ONLINE.name(), "R"); return builder.build(); }
public static StateModelDefinition generatePinotStateModelDefinition() { StateModelDefinition.Builder builder = new StateModelDefinition.Builder(PINOT_SEGMENT_ONLINE_OFFLINE_STATE_MODEL); builder.initialState(OFFLINE_STATE); builder.addState(ONLINE_STATE); builder.addState(CONSUMING_STATE); builder.addState(OFFLINE_STATE); builder.addState(DROPPED_STATE); // Set the initial state when the node starts // Add transitions between the states. builder.addTransition(CONSUMING_STATE, ONLINE_STATE); builder.addTransition(OFFLINE_STATE, CONSUMING_STATE); builder.addTransition(OFFLINE_STATE, ONLINE_STATE); builder.addTransition(CONSUMING_STATE, OFFLINE_STATE); builder.addTransition(ONLINE_STATE, OFFLINE_STATE); builder.addTransition(OFFLINE_STATE, DROPPED_STATE); // set constraints on states. // static constraint builder.dynamicUpperBound(ONLINE_STATE, "R"); // dynamic constraint, R means it should be derived based on the replication // factor. builder.dynamicUpperBound(CONSUMING_STATE, "R"); StateModelDefinition statemodelDefinition = builder.build(); return statemodelDefinition; }