[
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17902189#comment-17902189
]
Kirill Sizov commented on IGNITE-23780:
----------------------------------------
The condition should be simplified to
{noformat}
pending.contains(node) || (stable.contains(node) && !pending.isForce())
{noformat}
> Node restart behaviour for HA mode
> ----------------------------------
>
> Key: IGNITE-23780
> URL: https://issues.apache.org/jira/browse/IGNITE-23780
> Project: Ignite
> Issue Type: Improvement
> Reporter: Mirza Aliev
> Assignee: Kirill Sizov
> Priority: Major
> Labels: ignite-3
>
> h3. Motivation
> According to
> [IEP-131|https://cwiki.apache.org/confluence/display/IGNITE/IEP-131%3A+Partition+Majority+Unavailability+Handling]
> when node is going to start/restart, for HA partitions we must decide if we
> start or do not not start raft group on this node based on the info about
> stable, pending assignments received from recovered metastorage.
> Below you can see combinations of stable, pending (forced or not), info if
> node is presented in stable, pending, or both, and acton on restart (start
> raft group or not)
> Full table with all combinations and repetitions
> || # ||stable||pending||in stable||in pending||in both||action||
> |1|empty|empty|no|no|no|nothing|
> |2|empty|exists|no|no|no|nothing|
> |3|empty|forced|no|no|no|nothing|
> |4|exists|empty|yes|no|no|nothing|
> |5|exists|exists|yes|no|no|nothing|
> |6|exists|forced|yes|no|no|nothing|
> |7|empty|empty|no|no|no|nothing|
> |8|empty|exists|no|yes|no|start|
> |9|empty|forced|no|yes|no|start|
> |10|exists|empty|no|no|no|stop|
> |11|exists|exists|no|yes|no|start|
> |12|exists|forced|no|yes|no|start|
> |13|empty|empty|no|no|no|nothing|
> |14|empty|exists|no|no|no|nothing|
> |15|empty|forced|no|no|no|nothing|
> |16|exists|empty|no|no|no|nothing|
> |17|exists|exists|yes|yes|yes|nothing|
> |18|exists|forced|yes|yes|yes|nothing|
> |19|empty|empty|no|no|no|nothing|
> |20|empty|exists|no|no|no|nothing|
> |21|empty|forced|no|no|no|nothing|
> |22|exists|empty|no|no|no|nothing|
> |23|exists|exists|no|no|no|stop|
> |24|exists|forced|no|no|no|stop|
> Improved table, without repetitions:
> ||0||stable||pending||in stable||in pending||in both||on restart||
> |1|empty|empty|no|no|no|nothing|
> |2|empty|exists|no|no|no|nothing|
> |3|empty|forced|no|no|no|nothing|
> |4|exists|empty|yes|no|no|start|
> |5|exists|exists|yes|no|no|start|
> |6|exists|forced|yes|no|no|nothing|
> |7|empty|exists|no|yes|no|start|
> |8|empty|forced|no|yes|no|start|
> |9|exists|empty|no|no|no|nothing|
> |10|exists|exists|no|yes|no|start|
> |11|exists|forced|no|yes|no|start|
> |12|exists|exists|yes|yes|yes|start|
> |13|exists|forced|yes|yes|yes|start|
> |14|exists|exists|no|no|no|nothing|
> |15|exists|forced|no|no|no|nothing|
> We have an invariant, that if the node is in a stable, but not in a forced
> pending, raft on that node should not be started. This is because of this
> example:
> 1) stable = [A, B, C]
> 2) pending = [A, force = true]
> 3) Rebalance happened, but stable switch is not happened, and user has
> entered some data to A
> 4) full restart
> 5) we cannot start raft nodes on B and C based on stable, because we will
> lose data on A on the step 3
> Me wth [~jakutenshi] independently formulated conditions for a node to
> decide, should it start raft group or not, developer of this ticket is
> responsible to choose more appropriate condition:
> {code:java}
> if (
> (stable.contains(node) && (force && pending.contains(node))) ||
> (stable.contains(node) && (!force)) ||
> pending.contains(node)
> ) {
> start node
> }
> {code}
> {code:java}
> stable.contains(node)
> && !(pending.contains(node) || peinding.isForce())
> || pending.contains(node)
> {code}
> h3. Implementation notes
> Aforementioned condition must be integrated to
> {{TableManager#startPartitionAndStartClient}} in case {{boolean isRecovery ==
> true}}
> h3. Definition of done
> * Node correctly decide should it start raft group or not based on MS
> assignments keys
--
This message was sent by Atlassian Jira
(v8.20.10#820010)