fix(ha): fix config replication to standbys; add replConfigPush handler
- config_repl.c: add handle_repl_config_push — standby handler for OPCode_replConfigPush. Verifies SHA-256, saves blob to disk via conf_save_config, reloads via load_primary_config, ACKs primary. - config_repl.h: declare handle_repl_config_push. - cluster.c: dispatch OPCode_replConfigPush to handle_repl_config_push; populate c->myhost_info.name from myconf->name (ctrl-1/ctrl-2/ctrl-3) instead of the static "controller" placeholder. - ha.c: fix raft_cb_become_leader push_config_to_standbys call to pass real config bytes and tag read from disk (was NULL/0 — standbys got empty push and never saved config). - typemap.h: add raw_sha256/raw_bytes/raw_bytes_len fields to repl_config_push_req_t (mirrors upgrade_config_req_t pattern). - request.c: pre-extract List(UInt8) sha256/bytes from OPCode_replConfigPush before capn_free() in xce_decode(); free them in xce_free_request(). - helper.c: add all HA/replication opcode names to xce_request_op_name so "unknown opcode 30" becomes "replConfigPush" in logs. - cluster_def.h: add embedded myhost_info field to cluster_t struct. - ha.h: declare ha_start_primary_heartbeat; remove dead ha_find_and_connect_to_primary declaration.
This commit is contained in:
parent
d00d3bb051
commit
3d076ccda6
8 changed files with 191 additions and 8 deletions
|
|
@ -675,6 +675,72 @@ int handle_config_request(cluster_t *c, endpoint_t *ep, xce_request_t *req)
|
|||
return rc2;
|
||||
}
|
||||
|
||||
/* ── handle_repl_config_push ────────────────────────────────────────────────
|
||||
*
|
||||
* Standby handler for OPCode_replConfigPush sent by the primary.
|
||||
*
|
||||
* Steps:
|
||||
* 1. Extract raw bytes + sha256 from the pre-decoded request
|
||||
* 2. Verify SHA-256 integrity
|
||||
* 3. Save to disk via conf_save_config
|
||||
* 4. Reload cluster_config in memory via load_primary_config
|
||||
* 5. Send ReplConfigPushReply with accepted=1
|
||||
*/
|
||||
int handle_repl_config_push(cluster_t *c, endpoint_t *ep, xce_request_t *req)
|
||||
{
|
||||
if (req->body_which != Request_body_replconfigpushrequestmsg
|
||||
|| !req->body.replconfigpushrequestmsg) {
|
||||
WARN("handle_repl_config_push: malformed request");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
repl_config_push_req_t *rcpr = req->body.replconfigpushrequestmsg;
|
||||
|
||||
if (!rcpr->raw_bytes || rcpr->raw_bytes_len == 0 || !rcpr->raw_sha256) {
|
||||
WARN("handle_repl_config_push: missing bytes or sha256 (tag=%016" PRIx64 ")",
|
||||
rcpr->version_tag);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Verify transit SHA-256 */
|
||||
uint8_t computed[32];
|
||||
SHA256(rcpr->raw_bytes, rcpr->raw_bytes_len, computed);
|
||||
if (memcmp(computed, rcpr->raw_sha256, 32) != 0) {
|
||||
WARN("handle_repl_config_push: SHA-256 mismatch — rejecting push");
|
||||
return -EBADMSG;
|
||||
}
|
||||
|
||||
/* Save to disk and reload */
|
||||
int rc = conf_save_config(c->myconf, rcpr->raw_bytes, rcpr->raw_bytes_len,
|
||||
rcpr->raw_sha256);
|
||||
if (rc != 0) {
|
||||
WARN("handle_repl_config_push: conf_save_config failed: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = load_primary_config(c);
|
||||
if (rc != 0) {
|
||||
WARN("handle_repl_config_push: load_primary_config failed: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
INFO("handle_repl_config_push: config saved and loaded (tag=%016" PRIx64 ")",
|
||||
c->myconf->config_version_tag);
|
||||
|
||||
/* ACK the primary */
|
||||
repl_config_push_reply_t reply_body = {
|
||||
.accepted = 1,
|
||||
.version_tag = c->myconf->config_version_tag,
|
||||
};
|
||||
xce_reply_t reply;
|
||||
init_reply_by_req(&reply, req);
|
||||
reply.status = 0;
|
||||
reply.data_which = RequestReply_data_replconfigpushreplymsg;
|
||||
reply.data.replconfigpushreplymsg = &reply_body;
|
||||
xce_reply(ep, c->myhost, &reply);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ── send_upgrade_error ─────────────────────────── */
|
||||
|
||||
static void send_upgrade_error(endpoint_t *ep, xce_request_t *req,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue