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:
parent
d70f2507c3
commit
6ea89569fa
3 changed files with 87 additions and 1 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue