zpinto commented on code in PR #2772:
URL: https://github.com/apache/helix/pull/2772#discussion_r1548991400
##########
helix-core/src/main/java/org/apache/helix/controller/stages/BestPossibleStateCalcStage.java:
##########
@@ -161,49 +162,47 @@ private void
addSwapInInstancesToBestPossibleState(Map<String, Resource> resourc
return;
}
- // If the corresponding swap-in instance is not enabled,
assign replicas with
- // initial state.
- if (!enabledSwapInInstances.contains(
- swapOutToSwapInInstancePairs.get(swapOutInstance))) {
-
stateMap.put(swapOutToSwapInInstancePairs.get(swapOutInstance),
- stateModelDef.getInitialState());
- return;
- }
-
- // If the swap-in node is live and enabled, do assignment with
the following logic:
- // 1. If the swap-out instance's replica is a secondTopState,
set the swap-in instance's replica
- // to the same secondTopState.
- // 2. If the swap-out instance's replica is any other state
and is in the preferenceList,
- // set the swap-in instance's replica to the topState if the
StateModel allows another to be added.
- // If not, set the swap-in instance's replica to the
secondTopState.
- // We can make this assumption because if there is assignment
to the swapOutInstance, it must be either
- // a topState or a secondTopState.
- if (stateMap.containsKey(swapOutInstance) &&
stateModelDef.getSecondTopStates()
- .contains(stateMap.get(swapOutInstance))) {
- // If the swap-out instance's replica is a secondTopState,
set the swap-in instance's replica
- // to the same secondTopState.
-
stateMap.put(swapOutToSwapInInstancePairs.get(swapOutInstance),
- stateMap.get(swapOutInstance));
- } else {
- // If the swap-out instance's replica is any other state in
the stateMap or not present in the
- // stateMap, set the swap-in instance's replica to the
topState if the StateModel allows another
- // to be added. If not, set the swap-in to the
secondTopState.
- String topStateCount =
-
stateModelDef.getNumInstancesPerState(stateModelDef.getTopState());
- if (topStateCount.equals(
-
StateModelDefinition.STATE_REPLICA_COUNT_ALL_CANDIDATE_NODES)
- || topStateCount.equals(
- StateModelDefinition.STATE_REPLICA_COUNT_ALL_REPLICAS)) {
- // If the StateModel allows for another replica with the
topState to be added,
- // set the swap-in instance's replica to the topState.
-
stateMap.put(swapOutToSwapInInstancePairs.get(swapOutInstance),
- stateModelDef.getTopState());
+ // If the swap-in node is live, do assignment with the
following logic:
+ // 1. If the swap-out instance's replica is in the stateMap:
+ // - if the swap-out instance's replica is a topState, set the
swap-in instance's replica to the topState.
+ // if another is allowed to be added, otherwise set the
swap-in instance's replica to a secondTopState.
+ // - if the swap-out instance's replica is not a topState or
ERROR, set the swap-in instance's replica to the same state.
+ // - if the swap-out instance's replica is ERROR, set the
swap-in instance's replica to the initialState.
+ // 2. If the swap-out instance's replica is not in the
stateMap, set the swap-in instance's replica to the initialState.
+ // This happens when the swap-out node is offline.
+ if (stateMap.containsKey(swapOutInstance)) {
+ if
(stateMap.get(swapOutInstance).equals(stateModelDef.getTopState())
+ ||
stateMap.get(swapOutInstance).equals(HelixDefinedState.ERROR.name())) {
+ // If the swap-out instance's replica is a topState, set
the swap-in instance's replica
+ // to the topState if the StateModel allows another to be
added. If not, set the swap-in
+ // to the secondTopState.
+ String topStateCount =
+
stateModelDef.getNumInstancesPerState(stateModelDef.getTopState());
+ if (topStateCount.equals(
+
StateModelDefinition.STATE_REPLICA_COUNT_ALL_CANDIDATE_NODES)
+ || topStateCount.equals(
+
StateModelDefinition.STATE_REPLICA_COUNT_ALL_REPLICAS)) {
+ // If the StateModel allows for another replica with the
topState to be added,
+ // set the swap-in instance's replica to the topState.
+
stateMap.put(swapOutToSwapInInstancePairs.get(swapOutInstance),
+ stateModelDef.getTopState());
+ } else {
+ // If StateModel does not allow another topState replica
to be
+ // added, set the swap-in instance's replica to the
secondTopState.
+
stateMap.put(swapOutToSwapInInstancePairs.get(swapOutInstance),
+
stateModelDef.getSecondTopStates().iterator().next());
+ }
} else {
- // If StateModel does not allow another topState replica
to be
- // added, set the swap-in instance's replica to the
secondTopState.
+ // If the swap-out instance's replica is not a topState or
ERROR, set the swap-in instance's replica
+ // to the same state
stateMap.put(swapOutToSwapInInstancePairs.get(swapOutInstance),
- stateModelDef.getSecondTopStates().iterator().next());
+ stateMap.get(swapOutInstance));
}
+ } else {
+ // If the swap-out instance's replica is not in the
stateMap, set the swap-in instance's replica
+ // to the initialState. This happens when the swap-out node
is offline.
+
stateMap.put(swapOutToSwapInInstancePairs.get(swapOutInstance),
+ stateModelDef.getInitialState());
}
});
});
Review Comment:
I have separated assignment and and state selection into two steps to make
it more debuggable.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]