fix(ha-bootstrap): register listener with iomgr epoll before election

vote_request_thread connects to peers via SSL. iomgr was started before
election but c->ep was only registered with epoll inside cluster_start(),
which runs after election. The TCP connect succeeded (kernel accepts it)
but SSL_accept was never called server-side, so SSL_connect failed
immediately — both vote threads went to deny in <1ms and ctrl-a could
never win a quorum.

Fix: add cluster_register_listener() that wires c->ep into iomgr's
epoll watch. Call it from myapp_run() right after iomgr_start/vtaskmgr_start,
before election. cluster_start() still calls iomgr_monitor again
(idempotent via EPOLL_CTL_MOD).
This commit is contained in:
Rongsong Shen 2026-05-30 00:10:23 +00:00
parent 6753b364c8
commit fe37f4d692
3 changed files with 30 additions and 0 deletions

View file

@ -1095,6 +1095,22 @@ static int check_workers_timeout(void* args)
return rc;
}
/*
* cluster_register_listener: wire c->ep into iomgr's epoll watch.
*
* Called before election from myapp_run() so that incoming OP_requestVote
* SSL connections are accepted and dispatched during the election phase.
* cluster_start() is idempotent — it calls iomgr_monitor again but
* iomgr_monitor is safe to call twice (epoll EPOLL_CTL_MOD handles it).
*/
int cluster_register_listener(cluster_t *c)
{
endpoint_set_owner(&(c->ep), c);
endpoint_set_conn_handler(&(c->ep), (conn_handler_t)handle_connection);
c->ep.iomgr = &(c->iomgr);
return iomgr_monitor(&(c->ep));
}
int cluster_start(cluster_t* c)
{
int rc;