/** * 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(); }
/** * 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) { } }
/** * 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 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(); }
/** * 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()); }
/** * 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()); }
/** * 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()); }
/** * Sets the priority to Integer.MAX_VALUE * @param state */ public Builder addState(String state) { addState(state, Integer.MAX_VALUE); return this; }
/** * Sets the priority to Integer.MAX_VALUE * @param state */ public Builder addState(String state) { addState(state, 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; }