feat(raft-log-replication): init leader progress on becoming leader (task 2.2)

next_index[j]=log_len+1, match_index[j]=0 for every peer at both win paths
(single-node RAFT_ELECTED_IMMEDIATELY in raft_start_election; multi-node
RAFT_BECAME_LEADER in raft_on_vote_reply) via shared raft_init_leader_progress
helper (raft.tla BecomeLeader, Req 3.1). Suite green under ASAN.
This commit is contained in:
Rongsong Shen 2026-06-21 15:40:26 +00:00
parent d70f2507c3
commit 6ea89569fa
3 changed files with 87 additions and 1 deletions

View file

@ -74,6 +74,16 @@ int raft_init(raft_state_t *s, const raft_config_t *cfg)
return 0;
}
/* Initialize per-peer leader progress on becoming leader (raft.tla BecomeLeader,
* Req 3.1): next_index[j] = log_len + 1, match_index[j] = 0 for every peer j. */
static void raft_init_leader_progress(raft_state_t *s)
{
for (int j = 0; j < s->n_peers; j++) {
s->next_index[j] = s->log_len + 1;
s->match_index[j] = 0;
}
}
int raft_start_election(raft_state_t *s)
{
/* Guard: reject if already CANDIDATE or LEADER */
@ -103,6 +113,7 @@ int raft_start_election(raft_state_t *s)
if (s->n_peers == 1) {
s->role = RAFT_LEADER;
s->election_decided = 1;
raft_init_leader_progress(s);
s->cbs->on_become_leader(s->ctx, s->term);
return RAFT_ELECTED_IMMEDIATELY;
}
@ -389,6 +400,7 @@ int raft_on_vote_reply(raft_state_t *s, int from_idx, int granted, uint64_t term
if (s->votes_granted >= quorum) {
s->role = RAFT_LEADER;
s->election_decided = 1;
raft_init_leader_progress(s);
s->cbs->on_become_leader(s->ctx, s->term);
s->cbs->on_cancel_timeout(s->ctx);
if (s->cbs->on_trace)