[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-12-02 Thread Mirza Aliev (Jira)


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-23780:
-
Description: 
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 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

  was:
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|

[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-12-02 Thread Jira


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

 Kirill Sizov updated IGNITE-23780:
---
Description: 
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

  was:
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 |

[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-11-28 Thread Mirza Aliev (Jira)


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-23780:
-
Description: 
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: 

|| # || 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 


  was:
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 |
| 

[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-11-26 Thread Mirza Aliev (Jira)


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-23780:
-
Description: 
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: 

|| # || 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 


  was:
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 

[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-11-26 Thread Mirza Aliev (Jira)


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-23780:
-
Description: 
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: 

|| # || 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}}

There is a chance that the current code base already has all needed logic, in 
that case we just need to approve that this logic conform the table above.

h3. Definition of done

* Node correctly decide should it start raft group or not based on MS 
assignments keys 


  was:
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 | 

[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-11-26 Thread Mirza Aliev (Jira)


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-23780:
-
Description: 
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: 

|| # || 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}






  was:
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 | n

[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-11-26 Thread Mirza Aliev (Jira)


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-23780:
-
Description: 
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: 

|| # || 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 condition 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}






  was:
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

[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-11-26 Thread Mirza Aliev (Jira)


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-23780:
-
Description: 
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: 

|| # || 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 |


If the node is in a stable, but not in a forced pending, it should not be 
started.


{code:java}

if ( (stable.contains(node) && !(force && pending.contains(node))) || 
pending.contains(node) ) \{   //   node should be started }

if (stable.contains(node) && force && !pending.contains(node)) \{ //   node 
should not be started }

!(stable.contains(node) && force && !pending.contains(node)) == 
!stable.contains(node) || !force ||  pending.contains(node)

{code}






  was:
h3. Motivation

Full table with all combinations and repetitions 
|| # || stable || pending || in S || in P || 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: 

|| # || 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 |
| 

[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-11-26 Thread Mirza Aliev (Jira)


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-23780:
-
Description: 
h3. Motivation

Full table with all combinations and repetitions 
|| # || stable || pending || in S || in P || 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: 

|| # || 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 |


If the node is in a stable, but not in a forced pending, it should not be 
started.


{code:java}

if ( (stable.contains(node) && !(force && pending.contains(node))) || 
pending.contains(node) ) \{   //   node should be started }

if (stable.contains(node) && force && !pending.contains(node)) \{ //   node 
should not be started }

!(stable.contains(node) && force && !pending.contains(node)) == 
!stable.contains(node) || !force ||  pending.contains(node)

{code}






  was:
h1. Action table
|| # || stable || pending || in S || in P || 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 |

h1. Reasons
# NIA
# NIA
# NIA
# already should be started
# already started and in use now
# -Will be rewritten after force reset => stop- already started and in use now
# NIA
# Wasn't started before => start
# Wasn't started before => start
# 
# Wasn't started before => start
# Wasn't started before => start
# NIA
# NIA
# NIA
# NIA
# already should be started
# already should be started
# NIA
# NIA
# NIA
# 
# 

h1. Abbreviations
* *NS*: Node start
* *NIA*: Not in assignments

h1. Improved table
|| # || 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 |

[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-11-26 Thread Mirza Aliev (Jira)


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-23780:
-
Description: 
h1. Action table
|| # || stable || pending || in S || in P || 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 |

h1. Reasons
# NIA
# NIA
# NIA
# already should be started
# already started and in use now
# -Will be rewritten after force reset => stop- already started and in use now
# NIA
# Wasn't started before => start
# Wasn't started before => start
# 
# Wasn't started before => start
# Wasn't started before => start
# NIA
# NIA
# NIA
# NIA
# already should be started
# already should be started
# NIA
# NIA
# NIA
# 
# 

h1. Abbreviations
* *NS*: Node start
* *NIA*: Not in assignments

h1. Improved table
|| # || 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 |

{quote}
If the node is in a stable, but not in a forced pending, it should not be 
started.

if ( (stable.contains(node) && !(force && pending.contains(node))) || 
pending.contains(node) ) \{   //   node should be started }

if (stable.contains(node) && force && !pending.contains(node)) \{ //   node 
should not be started }

!(stable.contains(node) && force && !pending.contains(node)) == 
!stable.contains(node) || !force ||  pending.contains(node)
{quote}


|| # || A=inStable || B=inPending || C=isForce || start? || STMT ||
| 1 | F | F | F | F | - |
| 2 | F | F | F | F | - |
| 3 | F | F | T | F | - |
| 4 | T | F | F | T | A * !B * !C |
| 5 | T | F | F | T | the same as 4 |
| 6 | T | F | T | F | - |
| 8 | F | T | F | T | !A * B * !C |
| 9 | F | T | T | T | !A * B * C |
| 10 | F | F | F | F | - |
| 11 | F | T | F | T | the same as 8 |
| 12 | F | T | T | T | the same as 9 |
| 17 | T | T | F | T | A * B * !C |
| 18 | T | T | T | T | A * B * C |
| 23 | F | F | F | F | - |
| 24 | F | F | T | F | - |


  A * !B * !C + !A * B * !C + !A * B * C + A * B * !C + A * B * C = = A * !B * 
!C + !A * B * (!C + C) + A * B * (!C + C) = = A * !B * !C + !A * B + A * B = = 
A * !B * !C + B * (!A + A) = = A * !B * !C + B = = A * !(B + C) + B = = 
stable.contains(node)   && !(pending.contains(node) || peinding.isForce())

|  | pending.contains(node) |

A * B * C + A *!C + B

A * !C {{=  A * !B * !C + !A * B * !C + !A * B * C + A * B * !C =  A * !C + !A 
* B * !C + !A * B * C =  A * !C + !A * B  =}}  A * !B * !C

1 == !A * B + !B A = T B = T

> 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
>Priority: Major
>  Labels: ignite-3
>
> h1. Action table
> || # || stable || pending || in S || in P || 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 | exist

[jira] [Updated] (IGNITE-23780) Node restart behaviour for HA mode

2024-11-26 Thread Mirza Aliev (Jira)


 [ 
https://issues.apache.org/jira/browse/IGNITE-23780?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-23780:
-
Description: (was: h1. Action table
|| # || stable || pending || in S || in P || 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 |

h1. Reasons
# NIA
# NIA
# NIA
# already should be started
# already started and in use now
# -Will be rewritten after force reset => stop- already started and in use now
# NIA
# Wasn't started before => start
# Wasn't started before => start
# 
# Wasn't started before => start
# Wasn't started before => start
# NIA
# NIA
# NIA
# NIA
# already should be started
# already should be started
# NIA
# NIA
# NIA
# 
# 

h1. Abbreviations
* *NS*: Node start
* *NIA*: Not in assignments

h1. Improved table
|| # || stable || pending || in S || in P || 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 |
| 8 | empty | exists | no | yes | no | start |
| 9 | empty | forced | no | yes | no | start |
| 10 | exists | empty | no | no | no | nothing |
| 11 | exists | exists | no | yes | no | start |
| 12 | exists | forced | no | yes | no | start |
| 17 | exists | exists | yes | yes | yes | start |
| 18 | exists | forced | yes | yes | yes | start |
| 23 | exists | exists | no | no | no | nothing |
| 24 | exists | forced | no | no | no | nothing |

{quote}
If the node is in a stable, but not in a forced pending, it should not be 
started.

if ( (stable.contains(node) && !(force && pending.contains(node))) || 
pending.contains(node) ) \{   //   node should be started }

if (stable.contains(node) && force && !pending.contains(node)) \{ //   node 
should not be started }

!(stable.contains(node) && force && !pending.contains(node)) == 
!stable.contains(node) || !force ||  pending.contains(node)
{quote}


|| # || A=inStable || B=inPending || C=isForce || start? || STMT ||
| 1 | F | F | F | F | - |
| 2 | F | F | F | F | - |
| 3 | F | F | T | F | - |
| 4 | T | F | F | T | A * !B * !C |
| 5 | T | F | F | T | the same as 4 |
| 6 | T | F | T | F | - |
| 8 | F | T | F | T | !A * B * !C |
| 9 | F | T | T | T | !A * B * C |
| 10 | F | F | F | F | - |
| 11 | F | T | F | T | the same as 8 |
| 12 | F | T | T | T | the same as 9 |
| 17 | T | T | F | T | A * B * !C |
| 18 | T | T | T | T | A * B * C |
| 23 | F | F | F | F | - |
| 24 | F | F | T | F | - |


  A * !B * !C + !A * B * !C + !A * B * C + A * B * !C + A * B * C = = A * !B * 
!C + !A * B * (!C + C) + A * B * (!C + C) = = A * !B * !C + !A * B + A * B = = 
A * !B * !C + B * (!A + A) = = A * !B * !C + B = = A * !(B + C) + B = = 
stable.contains(node)   && !(pending.contains(node) || peinding.isForce())

|  | pending.contains(node) |

A * B * C + A *!C + B

A * !C {{=  A * !B * !C + !A * B * !C + !A * B * C + A * B * !C =  A * !C + !A 
* B * !C + !A * B * C =  A * !C + !A * B  =}}  A * !B * !C

1 == !A * B + !B A = T B = T)

> 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
>Priority: Major
>  Labels: ignite-3
>




--
This message was sent by Atlassian Jira
(v8.20.10#820010)