From 2c515636cba893f84616060232fd196a87fd12d2 Mon Sep 17 00:00:00 2001 From: David Schwartz Date: Wed, 26 Feb 2014 13:29:10 -0800 Subject: [PATCH] Release the InboundLedger lock during getMissingNodes --- src/ripple_app/ledger/InboundLedger.cpp | 72 ++++++++++++++----------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/src/ripple_app/ledger/InboundLedger.cpp b/src/ripple_app/ledger/InboundLedger.cpp index 207fff778..3f2e27b5b 100644 --- a/src/ripple_app/ledger/InboundLedger.cpp +++ b/src/ripple_app/ledger/InboundLedger.cpp @@ -546,47 +546,55 @@ void InboundLedger::trigger (Peer::ref peer) nodeIDs.reserve (256); nodeHashes.reserve (256); AccountStateSF filter (mSeq); + + // Release the lock while we process the large state map + sl.unlock(); mLedger->peekAccountStateMap ()->getMissingNodes ( nodeIDs, nodeHashes, 256, &filter); + sl.lock(); - if (nodeIDs.empty ()) + // Make sure nothing happened while we released the lock + if (!mFailed && !mComplete && !mHaveState) { - if (!mLedger->peekAccountStateMap ()->isValid ()) - mFailed = true; - else + if (nodeIDs.empty ()) { - mHaveState = true; - - if (mHaveTransactions) - mComplete = true; - } - } - else - { - // VFALCO Why 128? Make this a constant - if (!mAggressive) - filterNodes (nodeIDs, nodeHashes, mRecentASNodes, - 128, !isProgress ()); - - if (!nodeIDs.empty ()) - { - tmGL.set_itype (protocol::liAS_NODE); - BOOST_FOREACH (SHAMapNode const& it, nodeIDs) + if (!mLedger->peekAccountStateMap ()->isValid ()) + mFailed = true; + else { - * (tmGL.add_nodeids ()) = it.getRawString (); + mHaveState = true; + + if (mHaveTransactions) + mComplete = true; } - if (m_journal.trace) m_journal.trace << - "Sending AS node " << nodeIDs.size () << - " request to " << ( - peer ? "selected peer" : "all peers"); - if (nodeIDs.size () == 1 && m_journal.trace) m_journal.trace << - "AS node: " << nodeIDs[0]; - sendRequest (tmGL, peer); - return; } else - if (m_journal.trace) m_journal.trace << - "All AS nodes filtered"; + { + // VFALCO Why 128? Make this a constant + if (!mAggressive) + filterNodes (nodeIDs, nodeHashes, mRecentASNodes, + 128, !isProgress ()); + + if (!nodeIDs.empty ()) + { + tmGL.set_itype (protocol::liAS_NODE); + BOOST_FOREACH (SHAMapNode const& it, nodeIDs) + { + * (tmGL.add_nodeids ()) = it.getRawString (); + } + if (m_journal.trace) m_journal.trace << + "Sending AS node " << nodeIDs.size () << + " request to " << ( + peer ? "selected peer" : "all peers"); + if (nodeIDs.size () == 1 && m_journal.trace) m_journal.trace << + "AS node: " << nodeIDs[0]; + sendRequest (tmGL, peer); + return; + } + else + if (m_journal.trace) m_journal.trace << + "All AS nodes filtered"; + } } } }