myxce/src/lib
Rongsong Shen 25e741d8c7 fix(libxce): break ABBA iomgr deadlock — make endpoint busy flag lockless (bug-1282)
Root-caused via gdb (all-thread backtrace on two independently-wedged controllers
during chaotic failover): an ABBA lock-order deadlock in the async dispatch path.

  io_worker (netio.c): holds ep->lock, blocks on q->lock (vtask_enq -> dataq_enq)
  vdispatcher: dataq_deq holds q->lock, blocks on ep->lock via the
    vtask_eligible -> endpoint_is_task_blocked match callback

endpoint_is_task_blocked took ep->lock while the caller (dataq_deq) held the dataq
q->lock, inverting io_worker's ep->lock -> q->lock order. Under churn the two
orders collide and the iomgr wedges (no more accepts / vote replies).

Fix (mirrors the dispatch_inflight precedent, bug-1197): promote endpoint_t.busy
from a 1-bit bitfield to _Atomic int and make endpoint_block_tasks /
endpoint_unblock_tasks / endpoint_is_task_blocked lockless (release/acquire). The
ep->lock that wrapped each access protected nothing else (busy only gates the
vtask queue), so removing it is safe; the inherent set-then-check TOCTOU is
unchanged (the lock never prevented it — the decision is advisory).

Verified: post-fix gdb soak shows ZERO threads in __lll_lock_wait and
endpoint_is_task_blocked no longer appears in any lock path (deadlock gone);
controller_unit_test all green (no regression). NOTE: a SEPARATE release-only
restart segfault remains and still blocks the raft-ha-core-safety 7.2 gate
(tracked separately) — deadlocks hang, they do not SIGSEGV, so it is a distinct
memory bug.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019dbTHR9CsEYK9RsqmQpQpC
2026-06-30 08:22:15 +00:00
..
raft docs(raft-sim-conformance): cosmetic cleanups (LOW review nits) 2026-06-25 04:38:43 +00:00
testsuite feat(raft-drive-async): LivenessAdmission pool reservation + commit fold (tasks 1.6/1.7) 2026-06-26 07:43:19 +00:00
bitset.c - introduce bitset 2026-02-13 11:01:33 +08:00
CLAUDE.md enhance xce-build skill 2026-05-30 08:13:59 +08:00
client.c feat(raft-drive-async): bound peer connect (O_NONBLOCK+poll), close tasks 1.3/1.4/1.5 2026-06-26 07:10:53 +00:00
client_failover.c fix(libxce-failover): correct endpoint reconnect on rotate — re-bind iomgr + re-arm handlers (fixes endpoint_connect SEGV during live failover) 2026-06-17 06:53:46 +00:00
client_internal.h feat(libxce-failover): best-effort single-shot reconnect for fire-and-forget ops (notify/heartbeat/nop) (task 5.2) 2026-06-17 04:08:58 +00:00
cluster.c refactor: consolidate parse_peers into xce_parse_peers in libxce 2026-05-08 07:06:57 +00:00
configobj.c save works 2026-03-04 18:18:53 +08:00
dataq.c reformat code and job array 2025-11-07 16:14:27 +08:00
delay.c chore: baseline snapshot — prior-session work + ha-consistency-invariants spec family 2026-06-11 13:21:50 +00:00
group.c save works 2026-03-04 18:18:53 +08:00
helper.c fix(ha): fix config replication to standbys; add replConfigPush handler 2026-06-01 05:56:16 +00:00
hook.c fix bug-1060 bug-1067 2026-06-24 17:05:43 +08:00
htab.c docs: mark Phase 6 complete in phase6-scheduler-integration-plan 2026-04-30 07:17:32 +00:00
idgen.c jobid generate 2025-11-07 18:17:34 +08:00
jobj.c save works 2026-03-06 18:20:30 +08:00
kv.c feat: implement kvmgr_capture_keys for lock-free checkpoint serialization (P0-14a) 2026-05-07 11:07:41 +00:00
kvmgr.c feat: implement kvmgr_capture_keys for lock-free checkpoint serialization (P0-14a) 2026-05-07 11:07:41 +00:00
meson.build feat(raft-drive-async): LivenessAdmission pool reservation + commit fold (tasks 1.6/1.7) 2026-06-26 07:43:19 +00:00
misc.c 1st workable scheduler with resource from controller 2025-12-31 15:50:52 +08:00
mylock.c - use librtti 2026-02-05 17:21:27 +08:00
netio.c fix(libxce): break ABBA iomgr deadlock — make endpoint busy flag lockless (bug-1282) 2026-06-30 08:22:15 +00:00
ordq.c pass pend reason back to controller 2025-12-23 15:29:26 +08:00
preason.c support limit 2026-01-12 15:27:54 +08:00
qobj.c save works 2026-03-05 16:03:37 +08:00
request.c fix bug-1060 bug-1067 2026-06-24 17:05:43 +08:00
resobj.c minor improve 2026-04-14 12:52:40 +08:00
resreq.c fix front end issues 2026-05-01 21:22:45 +08:00
rusage.peg fix typo of perflag && reformat .peg 2026-02-09 10:58:30 +08:00
section.peg docs: mark Phase 6 complete in phase6-scheduler-integration-plan 2026-04-30 07:17:32 +00:00
threshold.c reformat code and job array 2025-11-07 16:14:27 +08:00
utils.c fix(libxce): xce_strerror_r global-buffer-overflow on HA error codes (utils.c) 2026-06-20 10:13:21 +00:00
vtaskmgr.c feat(raft-drive-async): peer-control vtask dispatch shim, dormant (task 3.1) 2026-06-26 11:12:04 +00:00
window.c reformat code and job array 2025-11-07 16:14:27 +08:00
wobj.c add kiro skills 2026-05-21 03:41:57 +00:00
wrap.c reformat code and job array 2025-11-07 16:14:27 +08:00
xce_resreq.peg docs: mark Phase 6 complete in phase6-scheduler-integration-plan 2026-04-30 07:17:32 +00:00
xce_select.c fix: sel_key_cmp_fn padding-byte mismatch in kvtab lookups 2026-05-12 09:53:59 +00:00
xce_select.peg docs: mark Phase 6 complete in phase6-scheduler-integration-plan 2026-04-30 07:17:32 +00:00
xcealloc.c 1st workable scheduler with resource from controller 2025-12-31 15:50:52 +08:00
xceapi.c fix(libxce): bug-1077 ctrlstatus crash from shared reply-union type confusion 2026-06-24 09:44:43 +00:00
xcectx.c feat(raft-drive-async): bound peer connect (O_NONBLOCK+poll), close tasks 1.3/1.4/1.5 2026-06-26 07:10:53 +00:00
xcelimit.c minor improve 2026-04-14 12:52:40 +08:00
xlist.c support limit 2026-01-12 15:27:54 +08:00
xstring.c docs: mark Phase 6 complete in phase6-scheduler-integration-plan 2026-04-30 07:17:32 +00:00
xvec.c using xvec related api in scheduler 2026-01-16 18:21:37 +08:00
zarray.c fix: use acquire/release ordering for inuse atomic ops in xzarray (P0-2) 2026-05-07 09:51:37 +00:00