From e25863207a95a3e1d9505ad19b325cc29d8e620b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 23 Jan 2013 10:14:20 -0800 Subject: [PATCH] An assert in NetworkOPs.cpp line 850 was reported. This suggests a mutable ledger came from the ledger master's "ledger by hash" table. This fixes an obvious way that this can happen (that seems incredibly rare and requires a transaction / ledger acquire race with a very narrow window) and adds some extra asserts to try to catch this earlier. --- src/cpp/ripple/LedgerHistory.cpp | 5 +++++ src/cpp/ripple/LedgerMaster.h | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/LedgerHistory.cpp b/src/cpp/ripple/LedgerHistory.cpp index 34a0d05d8d..dc30e87e3e 100644 --- a/src/cpp/ripple/LedgerHistory.cpp +++ b/src/cpp/ripple/LedgerHistory.cpp @@ -24,6 +24,7 @@ LedgerHistory::LedgerHistory() : mLedgersByHash("LedgerCache", CACHED_LEDGER_NUM void LedgerHistory::addLedger(Ledger::pointer ledger) { + assert(ledger->isImmutable()); mLedgersByHash.canonicalize(ledger->getHash(), ledger, true); } @@ -78,13 +79,17 @@ Ledger::pointer LedgerHistory::getLedgerByHash(const uint256& hash) { Ledger::pointer ret = mLedgersByHash.fetch(hash); if (ret) + { + assert(ret->getHash() == hash); return ret; + } ret = Ledger::loadByHash(hash); if (!ret) return ret; assert(ret->getHash() == hash); mLedgersByHash.canonicalize(ret->getHash(), ret); + assert(ret->getHash() == hash); return ret; } diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index 514b055517..dac64c862e 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -105,10 +105,11 @@ public: Ledger::pointer getLedgerByHash(const uint256& hash) { if (hash.isZero()) - return mCurrentLedger; + return boost::make_shared(boost::ref(*mCurrentLedger), false); if (mCurrentLedger && (mCurrentLedger->getHash() == hash)) - return mCurrentLedger; + return boost::make_shared(boost::ref(*mCurrentLedger), false); + if (mFinalizedLedger && (mFinalizedLedger->getHash() == hash)) return mFinalizedLedger;