From 1e24721a98a86cf178bac02754da2e3630f16f59 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 1 Jan 2013 16:11:30 -0800 Subject: [PATCH] First part of the fix to stop us from publishing ledgers that don't get validated. --- src/cpp/ripple/Ledger.cpp | 1 + src/cpp/ripple/LedgerMaster.cpp | 27 +++++++++++++++++++++---- src/cpp/ripple/LedgerMaster.h | 18 ++++++++++++++++- src/cpp/ripple/ValidationCollection.cpp | 2 ++ 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index dd82714fd8..fb9fd3d28a 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -467,6 +467,7 @@ void Ledger::saveAcceptedLedger(bool fromConsensus, LoadEvent::pointer event) theApp->getLedgerMaster().setFullLedger(shared_from_this()); event->stop(); + // FIXME: Need to put on hold until the ledger acquires sufficient validations theApp->getOPs().pubLedger(shared_from_this()); decPendingSaves(); diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index edf6dfd049..438b632714 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -49,10 +49,13 @@ void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL, bool fromCo cLog(lsINFO) << "StashAccepted: " << newLCL->getHash(); } - boost::recursive_mutex::scoped_lock ml(mLock); - mFinalizedLedger = newLCL; - mCurrentLedger = newOL; - mEngine.setLedger(newOL); + { + boost::recursive_mutex::scoped_lock ml(mLock); + mFinalizedLedger = newLCL; + mCurrentLedger = newOL; + mEngine.setLedger(newOL); + } + checkPublish(newLCL->getHash(), newLCL->getLedgerSeq()); } void LedgerMaster::switchLedgers(Ledger::ref lastClosed, Ledger::ref current) @@ -69,6 +72,7 @@ void LedgerMaster::switchLedgers(Ledger::ref lastClosed, Ledger::ref current) assert(!mCurrentLedger->isClosed()); mEngine.setLedger(mCurrentLedger); + checkPublish(lastClosed->getHash(), lastClosed->getLedgerSeq()); } void LedgerMaster::storeLedger(Ledger::ref ledger) @@ -306,4 +310,19 @@ void LedgerMaster::setFullLedger(Ledger::ref ledger) } } +void LedgerMaster::checkPublish(const uint256& hash) +{ + Ledger::pointer ledger = mLedgerHistory.getLedgerByHash(hash); + if (ledger) + checkPublish(hash, ledger->getLedgerSeq()); +} + +void LedgerMaster::checkPublish(const uint256& hash, uint32 seq) +{ // check if we need to publish any held ledgers + boost::recursive_mutex::scoped_lock ml(mLock); + + if (seq <= mLastValidateSeq) + return; +} + // vim:ts=4 diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index 7f22d81145..770db1bfbb 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -17,6 +17,10 @@ class LedgerMaster { +public: + typedef boost::function callback; + +protected: boost::recursive_mutex mLock; TransactionEngine mEngine; @@ -33,6 +37,11 @@ class LedgerMaster uint32 mMissingSeq; bool mTooFast; // We are acquiring faster than we're writing + int mMinValidations; // The minimum validations to publish a ledger + uint256 mLastValidateHash; + uint32 mLastValidateSeq; + std::list mOnValidate; // Called when a ledger has enough validations + void applyFutureTransactions(uint32 ledgerIndex); bool isValidTransaction(const Transaction::pointer& trans); bool isTransactionOnFutureList(const Transaction::pointer& trans); @@ -42,7 +51,9 @@ class LedgerMaster public: - LedgerMaster() : mHeldTransactions(uint256()), mMissingSeq(0), mTooFast(false) { ; } + LedgerMaster() : mHeldTransactions(uint256()), mMissingSeq(0), mTooFast(false), + mMinValidations(0), mLastValidateSeq(0) + { ; } uint32 getCurrentLedgerIndex(); @@ -100,6 +111,11 @@ public: void resumeAcquiring(); void sweep(void) { mLedgerHistory.sweep(); } + + void addValidateCallback(callback& c) { mOnValidate.push_back(c); } + + void checkPublish(const uint256& hash); + void checkPublish(const uint256& hash, uint32 seq); }; #endif diff --git a/src/cpp/ripple/ValidationCollection.cpp b/src/cpp/ripple/ValidationCollection.cpp index 173dc3d65a..0eaf810344 100644 --- a/src/cpp/ripple/ValidationCollection.cpp +++ b/src/cpp/ripple/ValidationCollection.cpp @@ -75,6 +75,8 @@ bool ValidationCollection::addValidation(const SerializedValidation::pointer& va cLog(lsINFO) << "Val for " << hash << " from " << signer.humanNodePublic() << " added " << (val->isTrusted() ? "trusted/" : "UNtrusted/") << (isCurrent ? "current" : "stale"); + if (val->isTrusted()) + theApp->getLedgerMaster().checkPublish(hash); return isCurrent; }