xcecli_joblist/reslist/workerlist/resval/jobinfo return a non-negative ROW COUNT on success (rc = getreply.nrows), not a 0/status code. They were wrapped in XCECLI_FAILOVER_CALL, which unconditionally classifies the raw return value against fixed constants (E_XCE_* and POSIX errno magnitudes accepted in either sign) — a row count that happens to equal one of those constants (e.g. exactly 111 jobs == ECONNREFUSED) was silently misclassified as a transport failure, forcing a spurious xce_failover_rotate() on every call with that exact count. In /xce-test-ha's arithmetic progression (3 + 3*round) this hit at round 36, burning the retry budget on self-inflicted churn until it coincided with a genuine transient and surfaced a real ECONNRESET to the caller. Add XCECLI_FAILOVER_CALL_COUNT: only enters the retry/classify loop when EXPR's raw result is negative; any non-negative result (0 or a genuine row count of any magnitude) is unconditionally success. Switch the five xce_get-family wrappers to it. Verified via 40-round sequential and 40-round chaotic HA soak past round 36, zero committed-job loss. |
||
|---|---|---|
| .. | ||
| autoscaler | ||
| controller | ||
| docs | ||
| frontend | ||
| include | ||
| lib | ||
| nixSupport | ||
| scheduler | ||
| schema | ||
| tools | ||
| worker | ||
| flake.lock | ||
| flake.nix | ||
| meson.build | ||
| meson.options | ||