[
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)