feat(ha): reference-counted ha_elect_ctx_t lifecycle (ha-elect-ctx-lifecycle)
Replace the deliberate election-carrier leak with an atomic refcount: a bias reference held by ha->elect_ctx plus one reference per captured vote endpoint, released via a new endpoint_t.on_fini teardown-completion hook (fired once, before ep->data is freed). Both real-election and PreVote capture sites (raft_cb_send_vote_request, raft_cb_send_pre_vote_request) increment on capture; both publish sites (ha_start_election_async, ha_start_prevote_async) now atomic_exchange the outgoing carrier and release it instead of leaking or freeing outright, so a still-outstanding vote endpoint keeps the superseded carrier alive until its own teardown completes. Verified: 758+ controller tests green, isolated LeakSanitizer run shows zero ha_elect_ctx_t leaks across many election/PreVote rounds, no premature-free/UAF under supersession, and a live 10-round HA soak (36 jobs, zero loss, all 3 nodes served as primary).
This commit is contained in:
parent
58e047f533
commit
6529dcf08f
14 changed files with 879 additions and 22 deletions
|
|
@ -37,6 +37,7 @@ extern void test_config_repl(void);
|
|||
extern void test_worker_join(void);
|
||||
extern void test_ha_startup(void);
|
||||
extern void test_ha_election(void);
|
||||
extern void test_ha_elect_ctx_lifecycle(void);
|
||||
extern void test_ha_bootstrap(void);
|
||||
extern void test_ha_durability(void);
|
||||
extern void test_repl_majority(void);
|
||||
|
|
@ -190,6 +191,7 @@ int main(int argc, char* argv[])
|
|||
TEST(test_worker_join);
|
||||
TEST(test_ha_startup);
|
||||
TEST(test_ha_election);
|
||||
TEST(test_ha_elect_ctx_lifecycle);
|
||||
TEST(test_ha_bootstrap);
|
||||
TEST(test_ha_durability);
|
||||
TEST(test_repl_majority);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue