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

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

In a single-node Raft group, NodeImpl.init() calls stepDown() and then acquires 
the write-lock to call electSelf() (fast-path election). However, between 
stepDown() and the write-lock acquisition, the election timer can fire on a 
separate thread and complete a full election cycle — transitioning the node to 
STATE_LEADER and setting confCtx to BUSY via confCtx.flush().

When init() then acquires the write-lock and calls electSelf() a second time, 
it calls becomeLeader() again, which tries to call confCtx.flush() while 
confCtx is still BUSY — resulting in an IllegalStateException.

*Fix:* Guard the electSelf() call in init() with a state != STATE_LEADER check. 
   

  was:
h3. Motivation

In a single-node Raft group, NodeImpl.init() calls stepDown() and then acquires 
the write-lock to call electSelf() (fast-path election). However, between 
stepDown() and the write-lock acquisition, the election timer can fire on a 
separate thread and complete a full election cycle — transitioning the node to 
STATE_LEADER and setting confCtx to BUSY via confCtx.flush(). 

                                                                                
                                                                              
When init() then acquires the write-lock and calls electSelf() a second time, 
it calls becomeLeader() again, which tries to call confCtx.flush() while 
confCtx is still BUSY — resulting in an IllegalStateException.

*Fix:* Guard the electSelf() call in init() with a state != STATE_LEADER check. 
   


> Race condition in NodeImpl.init() causes double electSelf() for single-node 
> Raft groups        
> -----------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-28456
>                 URL: https://issues.apache.org/jira/browse/IGNITE-28456
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Mirza Aliev
>            Assignee: Mirza Aliev
>            Priority: Major
>              Labels: ignite-3
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> h3. Motivation
> In a single-node Raft group, NodeImpl.init() calls stepDown() and then 
> acquires the write-lock to call electSelf() (fast-path election). However, 
> between stepDown() and the write-lock acquisition, the election timer can 
> fire on a separate thread and complete a full election cycle — transitioning 
> the node to STATE_LEADER and setting confCtx to BUSY via confCtx.flush().
> When init() then acquires the write-lock and calls electSelf() a second time, 
> it calls becomeLeader() again, which tries to call confCtx.flush() while 
> confCtx is still BUSY — resulting in an IllegalStateException.
> *Fix:* Guard the electSelf() call in init() with a state != STATE_LEADER 
> check.    



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

Reply via email to