Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 17a26e5

Browse files
committed
Make a new leader remember the 'tosend' value for the previous leader from its prior update messages.
1 parent 8ead24b commit 17a26e5

File tree

3 files changed

+17
-1
lines changed

3 files changed

+17
-1
lines changed

contrib/pg_dtm/dtmd/include/raft.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,5 +140,6 @@ void raft_tick(raft_t *r, int msec);
140140
void raft_handle_message(raft_t *r, raft_msg_t *m);
141141
raft_msg_t *raft_recv_message(raft_t *r);
142142
int raft_create_udp_socket(raft_t *r);
143+
void raft_start_next_term(raft_t *r);
143144

144145
#endif

contrib/pg_dtm/dtmd/src/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ static void set_next_gxid(xid_t value) {
141141
assert(value <= last_gxid);
142142
if (inrange(next_gxid + 1, threshold_gxid, value)) {
143143
// Time to worry has come.
144-
raft.term++;
144+
raft_start_next_term(&raft);
145145
} else {
146146
// It is either too early to worry,
147147
// or we have already increased the term.

contrib/pg_dtm/dtmd/src/raft.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,8 @@ static void raft_handle_update(raft_t *r, raft_msg_update_t *m) {
458458
r->log.first + r->log.size,
459459
m->acked
460460
);
461+
raft_server_t *s = r->servers + sender;
462+
s->acked = s->tosend = r->log.acked;
461463
}
462464

463465
if (m->empty) {
@@ -537,6 +539,14 @@ static void raft_handle_done(raft_t *r, raft_msg_done_t *m) {
537539
debug("[from %d] ============= refused\n", sender);
538540
if (server->tosend > 0) {
539541
// the client should have specified the last index it had gotten
542+
if (server->tosend == m->index + 1) {
543+
shout(
544+
"[from %d] the last index I have is %d, but"
545+
" I still refuse, this should not happen\n",
546+
sender, m->index
547+
);
548+
assert(false);
549+
}
540550
server->tosend = m->index + 1;
541551
}
542552
assert(server->tosend >= server->acked); // FIXME: remove this, because 'tosend' is actually allowed to be less than 'acked' if the follower has restarted
@@ -555,6 +565,11 @@ static void raft_set_term(raft_t *r, int term) {
555565
r->votes = 0;
556566
}
557567

568+
void raft_start_next_term(raft_t *r) {
569+
assert(r->role == ROLE_LEADER);
570+
r->term++;
571+
}
572+
558573
static void raft_handle_claim(raft_t *r, raft_msg_claim_t *m) {
559574
int candidate = m->msg.from;
560575

0 commit comments

Comments
 (0)