mirror of
https://github.com/XRPLF/rippled.git
synced 2026-07-29 10:00:30 +00:00
A saturated ledgerData lane makes TimeoutCounter re-arm its timer without running the timer body, so timeouts_ never advances and the six-timeout give-up can never fire. Acquisitions then neither finish nor fail until the one-minute sweep destroys their partial maps, and the work restarts. Every step of that chain was debug-log-only, so a node at warning level could not be diagnosed after the fact. The counters are separate on purpose: deferrals rising while timeouts stay flat is the signature, and no single counter shows it. Completions are recorded in done() rather than at the "Done: complete" log line, because that line also fires for failures and misses the checkLocal and receiveNode paths; done() is the one funnel every outcome passes through and its signaled_ guard makes it idempotent. AcquireStats is only forward-declared in ServiceRegistry so libxrpl still includes nothing from xrpld. The src/ include path for the test binary moves out of the telemetry guard, since a header-only type under src/xrpld/ is testable in every build. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>