Hi guys,
I have the following states for my instances
StateModelDefinition.Builder builder = new StateModelDefinition.Builder(
NODE_STATE_MODEL);
builder.initialState(NodeState.OFFLINE.label());
builder.addState(NodeState.LEADER.label(), 1);
builder.addState(NodeState.FOLLOWER.label(), 2);
builder.addState(NodeState.OFFLINE.label());
builder.addState(NodeState.DROPPED.label());
//State transitions
builder.addTransition(NodeState.OFFLINE.label(),NodeState.FOLLOWER.label());
builder.addTransition(NodeState.FOLLOWER.label(),NodeState.OFFLINE.label());
builder.addTransition(NodeState.FOLLOWER.label(), NodeState.LEADER.label());
builder.addTransition(NodeState.LEADER.label(), NodeState.FOLLOWER.label());
builder.addTransition(NodeState.OFFLINE.label(), NodeState.DROPPED.label());
builder.upperBound(NodeState.LEADER.label(), 1);
builder.dynamicUpperBound(NodeState.FOLLOWER.label(), "R");
stateModelDefinition = builder.build();
if(admin.getStateModelDef(clusterName, stateModelDefinition.getId()) ==
null){
admin.addStateModelDef(clusterName, NODE_STATE_MODEL,
stateModelDefinition);
}
The addStateModelDef fails with the following exception
ERROR org.apache.helix.model.util.StateModelDefinitionValidator - Defined
states does not include the DROPPED state, state model: Node-State-Model
org.apache.helix.HelixException: The ZNRecord for STATEMODELDEFS is not
valid.
at org.apache.helix.manager.zk.ZKHelixDataAccessor.setProperty(
ZKHelixDataAccessor.java:97)
at org.apache.helix.manager.zk.ZKHelixAdmin.addStateModelDef(
ZKHelixAdmin.java:698)
Any idea what I am doing wrong?
On a separate note a few things to note
(1) we should have symmetry on the APIs, the getStateModelDef does return
null and does not throw an exception like the getInstanceConfig if it does
not find the state model def.
(2) Should the validation happen in the builder? So that it fails early?
Thanks,
Sandeep