From 1b18e16d1fb8e78a58bdae353171e890e097c2eb Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 9 Sep 2013 18:27:05 -0700 Subject: [PATCH] Track consensus versus validated ledgers and log discrepancies. --- modules/ripple_app/ledger/LedgerMaster.cpp | 4 ++ .../ledger/ripple_LedgerHistory.cpp | 52 ++++++++++++++++++- .../ripple_app/ledger/ripple_LedgerHistory.h | 6 +++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/modules/ripple_app/ledger/LedgerMaster.cpp b/modules/ripple_app/ledger/LedgerMaster.cpp index d00b842f4..2ece7c47f 100644 --- a/modules/ripple_app/ledger/LedgerMaster.cpp +++ b/modules/ripple_app/ledger/LedgerMaster.cpp @@ -133,7 +133,10 @@ void LedgerMaster::pushLedger (Ledger::pointer newLCL, Ledger::pointer newOL) tryAdvance(); } else + { + mLedgerHistory.builtLedger (newLCL); checkAccept (newLCL); + } } void LedgerMaster::switchLedgers (Ledger::pointer lastClosed, Ledger::pointer current) @@ -449,6 +452,7 @@ void LedgerMaster::setFullLedger (Ledger::pointer ledger, bool isSynchronous, bo ledger->setValidated(); mLedgerHistory.addLedger(ledger); + ScopedLockType ml (mLock, __FILE__, __LINE__); mCompleteLedgers.setValue (ledger->getLedgerSeq ()); diff --git a/modules/ripple_app/ledger/ripple_LedgerHistory.cpp b/modules/ripple_app/ledger/ripple_LedgerHistory.cpp index d0287dcc0..429c007ab 100644 --- a/modules/ripple_app/ledger/ripple_LedgerHistory.cpp +++ b/modules/ripple_app/ledger/ripple_LedgerHistory.cpp @@ -16,7 +16,9 @@ // FIXME: Need to clean up ledgers by index at some point -LedgerHistory::LedgerHistory () : mLedgersByHash ("LedgerCache", CACHED_LEDGER_NUM, CACHED_LEDGER_AGE) +LedgerHistory::LedgerHistory () + : mLedgersByHash ("LedgerCache", CACHED_LEDGER_NUM, CACHED_LEDGER_AGE) + , mConsensusValidated ("ConsensusValidated", 64, 300) { ; } @@ -123,6 +125,54 @@ Ledger::pointer LedgerHistory::canonicalizeLedger (Ledger::pointer ledger, bool return ledger; } +void LedgerHistory::builtLedger (Ledger::ref ledger) +{ + LedgerIndex index = ledger->getLedgerSeq(); + LedgerHash hash = ledger->getHash(); + assert (!hash.isZero()); + TaggedCache::ScopedLockType sl(mConsensusValidated.peekMutex(), __FILE__, __LINE__); + + boost::shared_ptr< std::pair< LedgerHash, LedgerHash > > entry = boost::make_shared>(); + mConsensusValidated.canonicalize(index, entry, false); + + if (entry->first != hash) + { + if (entry->first.isNonZero() && (entry->first != hash)) + { + WriteLog (lsERROR, LedgerMaster) << "MISMATCH: seq=" << index << " built:" << entry->first << " then:" << hash; + } + if (entry->second.isNonZero() && (entry->second != hash)) + { + WriteLog (lsERROR, LedgerMaster) << "MISMATCH: seq=" << index << " validated:" << entry->second << " accepted:" << hash; + } + entry->first = hash; + } +} + +void LedgerHistory::validatedLedger (Ledger::ref ledger) +{ + LedgerIndex index = ledger->getLedgerSeq(); + LedgerHash hash = ledger->getHash(); + assert (!hash.isZero()); + TaggedCache::ScopedLockType sl(mConsensusValidated.peekMutex(), __FILE__, __LINE__); + + boost::shared_ptr< std::pair< LedgerHash, LedgerHash > > entry = boost::make_shared>(); + mConsensusValidated.canonicalize(index, entry, false); + + if (entry->second != hash) + { + if (entry->second.isNonZero() && (entry->second != hash)) + { + WriteLog (lsERROR, LedgerMaster) << "MISMATCH: seq=" << index << " validated:" << entry->second << " then:" << hash; + } + if (entry->first.isNonZero() && (entry->first != hash)) + { + WriteLog (lsERROR, LedgerMaster) << "MISMATCH: seq=" << index << " built:" << entry->first << " validated:" << hash; + } + entry->second = hash; + } +} + void LedgerHistory::tune (int size, int age) { mLedgersByHash.setTargetSize (size); diff --git a/modules/ripple_app/ledger/ripple_LedgerHistory.h b/modules/ripple_app/ledger/ripple_LedgerHistory.h index df448a6d9..9c487b885 100644 --- a/modules/ripple_app/ledger/ripple_LedgerHistory.h +++ b/modules/ripple_app/ledger/ripple_LedgerHistory.h @@ -34,10 +34,16 @@ public: void sweep () { mLedgersByHash.sweep (); + mConsensusValidated.sweep (); } + void builtLedger (Ledger::ref); + void validatedLedger (Ledger::ref); + private: TaggedCacheType mLedgersByHash; + TaggedCacheType , UptimeTimerAdapter> mConsensusValidated; + // Maps ledger indexes to the corresponding hash. std::map mLedgersByIndex; // validated ledgers