fix(ha-config-bootstrap): wire ha_restore_term in cluster_init_phase1 and store last_known_committed_lsn from CtrlHelloReply (validation fixes)
This commit is contained in:
parent
0d5f2cb1bb
commit
b6c8aca458
1 changed files with 29 additions and 0 deletions
|
|
@ -215,6 +215,21 @@ static int myreq_handler(vtask_t* task)
|
||||||
if (request.body_which == Request_body_ctrlhellomsg) {
|
if (request.body_which == Request_body_ctrlhellomsg) {
|
||||||
/* Extended OP_ctrlHello with CtrlHelloRequest body — state sync (Req 6.5–6.7) */
|
/* Extended OP_ctrlHello with CtrlHelloRequest body — state sync (Req 6.5–6.7) */
|
||||||
rc = handle_ctrlhello(c, ep, &request);
|
rc = handle_ctrlhello(c, ep, &request);
|
||||||
|
} else if (request.body_which == Request_body_replymsg
|
||||||
|
&& request.body.replymsg
|
||||||
|
&& request.body.replymsg->data_which
|
||||||
|
== RequestReply_data_ctrlhelloreplymsg) {
|
||||||
|
/* Standby receives CtrlHelloReply from primary — update last known
|
||||||
|
* committed LSN and config tag for use in RDHUP failover path. */
|
||||||
|
ctrl_hello_reply_t *chrep = request.body.replymsg->data.ctrlhelloreplymsg;
|
||||||
|
if (chrep) {
|
||||||
|
atomic_store_explicit(&c->ha.last_known_committed_lsn,
|
||||||
|
chrep->committed_lsn, memory_order_release);
|
||||||
|
c->ha.last_known_committed_config_tag = chrep->config_tag;
|
||||||
|
INFO("HA: CtrlHelloReply from primary: committed_lsn=%lu config_tag=%lu",
|
||||||
|
(unsigned long)chrep->committed_lsn,
|
||||||
|
(unsigned long)chrep->config_tag);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Legacy plain OP_hello (nop path) */
|
/* Legacy plain OP_hello (nop path) */
|
||||||
reply.status = 0;
|
reply.status = 0;
|
||||||
|
|
@ -651,6 +666,20 @@ int cluster_init_phase1(cluster_t* c)
|
||||||
ERROR("ha_init failed: %d", rc);
|
ERROR("ha_init failed: %d", rc);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Restore persisted election term + voted_for from ha-term.bin (Req 9.2).
|
||||||
|
* ha_persist_term() already writes on vote grant; this reads it back at
|
||||||
|
* startup so the restarted node remembers its last term. */
|
||||||
|
if (c->myconf->workdir) {
|
||||||
|
rc = ha_restore_term(&c->ha, c->myconf->workdir);
|
||||||
|
if (rc == 0) {
|
||||||
|
INFO("HA: restored term=%lu from %s/ha-term.bin",
|
||||||
|
(unsigned long)atomic_load(&c->ha.term), c->myconf->workdir);
|
||||||
|
} else if (rc != -ENOENT) {
|
||||||
|
WARN("HA: ha_restore_term failed: %d", rc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ha_install_sigusr1(&c->ha);
|
ha_install_sigusr1(&c->ha);
|
||||||
|
|
||||||
/* Initialize standby endpoint tracking */
|
/* Initialize standby endpoint tracking */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue