diff --git a/docker/telemetry/workload/expected_spans.json b/docker/telemetry/workload/expected_spans.json index 45cbad1867..6414b02d57 100644 --- a/docker/telemetry/workload/expected_spans.json +++ b/docker/telemetry/workload/expected_spans.json @@ -532,9 +532,7 @@ { "parent": "ledger.acquire", "child": "ledger.acquire.txtree", - "description": "Ledger acquire contains the transaction-tree fetch phase.", - "skip": true, - "skip_reason": "Asserted on 2026-08-26 alongside the header and astree phases and it FAILED on run 33002568549 -- \"ledger.acquire.txtree not found in ledger.acquire traces\", the single failure in 279 checks. Skipped rather than left red. Not a missing span: it reports 5 traces of its own on that same run, one per node. The three phases are NOT equally conditional, which is what the original entry got wrong by treating them as identical. InboundLedger.cpp opens each only when that piece is still needed -- header on !haveHeader_ (:672), astree in the else of haveState_ (:689), txtree in the else of haveTransactions_ (:698). A node acquiring a ledger in this cluster almost always lacks the account-state tree, so astree opens on essentially every acquire and its assertion holds; but it usually ALREADY HOLDS the transaction set, because every node sees the same relayed transactions and builds the same set, so haveTransactions_ is true and no txtree phase opens. It fires only on the minority of acquires where the set was genuinely missing. Combined with _validate_parent_child sampling the 3 newest parent traces (validate_telemetry.py:803), the sampled acquires carry header and astree but no txtree. Same shape as the txq.accept -> txq.accept_tx skip, and the same fix applies to both: prefer parent traces that CONTAIN the child over newest-N. That one change would retire this skip, txq.accept_tx and txq.batch_clear together, which is now the highest-value improvement left in this harness." + "description": "Ledger acquire contains the transaction-tree fetch phase. Un-skipped once the hierarchy check stopped sampling only the newest parent traces. This phase is the conditional one of the three: header opens on !haveHeader_ (InboundLedger.cpp:672) and astree in the else of haveState_ (:689), both of which hold on essentially every acquire, while txtree opens only in the else of haveTransactions_ (:698) -- and a node in this cluster usually already holds the transaction set, because every node sees the same relayed transactions and builds the same set. So the phase fires on a minority of acquires, which is precisely the case newest-N sampling of the parent got wrong; the child was always emitting, just not in the three most recent acquires." }, { "parent": "rpc.command.*",