mirror of
https://github.com/XRPLF/rippled.git
synced 2026-09-30 00:38:03 +00:00
`SHAMap::walkMap` and `walkMapParallel` treat a null `descendNoStore` result as "this node is missing" and record it in their `missingNodes` output, but `descendNoStore` used the throwing `fetchNode`, so that branch could never run for a backed map. `Ledger::walkLedger` therefore threw instead of returning false, its "N missing account node(s)" log never printed, and `LedgerCleaner` never reached the path that clears the ledger and re-acquires it. `descendNoStore` now uses `fetchNodeNT`, which makes all three behave as written. `visitNodes` has to cope with the null child that change allows, so it skips the subtree and returns false to say the walk did not cover the whole map. `visitLeaves` forwards that answer. Two callers act on it. The online-delete copy loop in `SHAMapStoreImp::run` abandons the rotation cycle, which is what its former `catch (SHAMapMissingNode)` did and what `clearPrior` plus the archive deletion in `rotate` require. `LedgerReplayMsgHandler::processReplayDeltaRequest` replies `reNO_LEDGER` rather than sending a transaction list it knows is short. Also drops the unreachable null check in `descend(SHAMapInnerNode&, unsigned)`, since `fetchNode` throws before it can return null.