From 9322233b37bc7c2401e68022830050501cc99d43 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 13 Nov 2013 11:04:17 -0800 Subject: [PATCH] Allow the SHAMap visitLeaves functions to sanely handle a missing map node. --- src/ripple_app/ledger/Ledger.cpp | 13 +++++++++++-- src/ripple_app/ledger/OrderBookDB.cpp | 15 +++++++++++++-- src/ripple_app/shamap/SHAMapSync.cpp | 2 +- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/ripple_app/ledger/Ledger.cpp b/src/ripple_app/ledger/Ledger.cpp index 62076fe83..d4686a697 100644 --- a/src/ripple_app/ledger/Ledger.cpp +++ b/src/ripple_app/ledger/Ledger.cpp @@ -1241,8 +1241,17 @@ static void visitHelper (FUNCTION_TYPE& function, SHAMapItem::r void Ledger::visitStateItems (FUNCTION_TYPE function) { - if (mAccountStateMap) - mAccountStateMap->visitLeaves(BIND_TYPE(&visitHelper, beast::ref(function), P_1)); + try + { + if (mAccountStateMap) + mAccountStateMap->visitLeaves(BIND_TYPE(&visitHelper, beast::ref(function), P_1)); + } + catch (SHAMapMissingNode& sn) + { + if (mHash.isNonZero ()) + getApp().getInboundLedgers().findCreate(mHash, mLedgerSeq, false); + throw; + } } /* diff --git a/src/ripple_app/ledger/OrderBookDB.cpp b/src/ripple_app/ledger/OrderBookDB.cpp index 11705efd7..a2cffda14 100644 --- a/src/ripple_app/ledger/OrderBookDB.cpp +++ b/src/ripple_app/ledger/OrderBookDB.cpp @@ -105,8 +105,19 @@ void OrderBookDB::update (Ledger::pointer ledger) // walk through the entire ledger looking for orderbook entries int books = 0; - ledger->visitStateItems(BIND_TYPE(&updateHelper, P_1, boost::ref(seen), boost::ref(destMap), - boost::ref(sourceMap), boost::ref(XRPBooks), boost::ref(books))); + + try + { + ledger->visitStateItems(BIND_TYPE(&updateHelper, P_1, boost::ref(seen), boost::ref(destMap), + boost::ref(sourceMap), boost::ref(XRPBooks), boost::ref(books))); + } + catch (const SHAMapMissingNode&) + { + WriteLog (lsINFO, OrderBookDB) << "OrderBookDB::update encountered a missing node"; + ScopedLockType sl (mLock, __FILE__, __LINE__); + mSeq = 0; + return; + } WriteLog (lsDEBUG, OrderBookDB) << "OrderBookDB::update< " << books << " books found"; { diff --git a/src/ripple_app/shamap/SHAMapSync.cpp b/src/ripple_app/shamap/SHAMapSync.cpp index 9e83f3eaf..aafc280f6 100644 --- a/src/ripple_app/shamap/SHAMapSync.cpp +++ b/src/ripple_app/shamap/SHAMapSync.cpp @@ -53,7 +53,7 @@ void SHAMap::visitLeaves (FUNCTION_TYPE function) ++pos; else { - SHAMapTreeNode* child = getNodePointerNT (node->getChildNodeID (pos), node->getChildHash (pos)); + SHAMapTreeNode* child = getNodePointer (node->getChildNodeID (pos), node->getChildHash (pos)); if (child->isLeaf ()) { function (child->peekItem ());