From 28a7e58fd4fdc427489df12cd074dbd2a8bd9300 Mon Sep 17 00:00:00 2001 From: David Schwartz Date: Thu, 25 Jul 2013 13:34:20 -0700 Subject: [PATCH] Don't save unvalidated transactions to any transaction database. --- modules/ripple_app/ledger/Ledger.cpp | 49 ++++++++----------- modules/ripple_app/ledger/Ledger.h | 14 ++++-- modules/ripple_app/ledger/LedgerMaster.cpp | 40 ++++++--------- modules/ripple_app/ledger/LedgerMaster.h | 2 +- .../ledger/ripple_LedgerHistory.cpp | 13 ++--- .../ripple_app/ledger/ripple_LedgerHistory.h | 2 +- modules/ripple_app/misc/NetworkOPs.cpp | 2 +- 7 files changed, 53 insertions(+), 69 deletions(-) diff --git a/modules/ripple_app/ledger/Ledger.cpp b/modules/ripple_app/ledger/Ledger.cpp index 21281b654..236562f58 100644 --- a/modules/ripple_app/ledger/Ledger.cpp +++ b/modules/ripple_app/ledger/Ledger.cpp @@ -15,7 +15,7 @@ Ledger::Ledger (const RippleAddress& masterID, uint64 startAmount) , mCloseFlags (0) , mClosed (false) , mValidHash (false) - , mAccepted (false) + , mValidated (false) , mImmutable (false) , mTransactionMap (boost::make_shared (smtTRANSACTION)) , mAccountStateMap (boost::make_shared (smtSTATE)) @@ -59,7 +59,7 @@ Ledger::Ledger (uint256 const& parentHash, , mCloseFlags (closeFlags) , mClosed (false) , mValidHash (false) - , mAccepted (false) + , mValidated (false) , mImmutable (true) , mTransactionMap (boost::make_shared (smtTRANSACTION, transHash)) , mAccountStateMap (boost::make_shared (smtSTATE, accountHash)) @@ -98,7 +98,7 @@ Ledger::Ledger (Ledger& ledger, , mCloseFlags (ledger.mCloseFlags) , mClosed (ledger.mClosed) , mValidHash (false) - , mAccepted (ledger.mAccepted) + , mValidated (ledger.mValidated) , mImmutable (!isMutable) , mTransactionMap (ledger.mTransactionMap->snapShot (isMutable)) , mAccountStateMap (ledger.mAccountStateMap->snapShot (isMutable)) @@ -117,7 +117,7 @@ Ledger::Ledger (bool /* dummy */, , mCloseFlags (0) , mClosed (false) , mValidHash (false) - , mAccepted (false) + , mValidated (true) , mImmutable (false) , mTransactionMap (boost::make_shared (smtTRANSACTION)) , mAccountStateMap (prevLedger.mAccountStateMap->snapShot (true)) @@ -149,7 +149,7 @@ Ledger::Ledger (Blob const& rawLedger, bool hasPrefix) : mClosed (false) , mValidHash (false) - , mAccepted (false) + , mValidated (false) , mImmutable (true) { Serializer s (rawLedger); @@ -160,7 +160,7 @@ Ledger::Ledger (Blob const& rawLedger, } Ledger::Ledger (const std::string& rawLedger, bool hasPrefix) : - mClosed (false), mValidHash (false), mAccepted (false), mImmutable (true) + mClosed (false), mValidHash (false), mValidated (false), mImmutable (true) { Serializer s (rawLedger); setRaw (s, hasPrefix); @@ -243,11 +243,10 @@ void Ledger::addRaw (Serializer& s) const void Ledger::setAccepted (uint32 closeTime, int closeResolution, bool correctCloseTime) { // used when we witnessed the consensus - assert (mClosed && !mAccepted); + assert (mClosed); mCloseTime = correctCloseTime ? roundCloseTime (closeTime, closeResolution) : closeTime; mCloseResolution = closeResolution; mCloseFlags = correctCloseTime ? 0 : sLCF_NoConsensusTime; - mAccepted = true; setImmutable (); } @@ -258,7 +257,6 @@ void Ledger::setAccepted () if ((mCloseFlags & sLCF_NoConsensusTime) == 0) mCloseTime = roundCloseTime (mCloseTime, mCloseResolution); - mAccepted = true; setImmutable (); } @@ -499,9 +497,9 @@ uint256 Ledger::getHash () return mHash; } -void Ledger::saveAcceptedLedger (Job&, bool fromConsensus) +void Ledger::saveValidatedLedger (Job&) { - WriteLog (lsTRACE, Ledger) << "saveAcceptedLedger " << (fromConsensus ? "fromConsensus " : "fromAcquire ") << getLedgerSeq (); + WriteLog (lsTRACE, Ledger) << "saveValidatedLedger "; static boost::format deleteLedger ("DELETE FROM Ledgers WHERE LedgerSeq = %u;"); static boost::format deleteTrans1 ("DELETE FROM Transactions WHERE LedgerSeq = %u;"); static boost::format deleteTrans2 ("DELETE FROM AccountTransactions WHERE LedgerSeq = %u;"); @@ -522,7 +520,7 @@ void Ledger::saveAcceptedLedger (Job&, bool fromConsensus) if (getAccountHash () != mAccountStateMap->getHash ()) { WriteLog (lsFATAL, Ledger) << "sAL: " << getAccountHash () << " != " << mAccountStateMap->getHash (); - WriteLog (lsFATAL, Ledger) << "saveAcceptedLedger: seq=" << mLedgerSeq << ", fromcons=" << fromConsensus; + WriteLog (lsFATAL, Ledger) << "saveValidatedLedger: seq=" << mLedgerSeq; assert (false); } @@ -607,9 +605,6 @@ void Ledger::saveAcceptedLedger (Job&, bool fromConsensus) mCloseResolution % mCloseFlags % mAccountHash.GetHex () % mTransHash.GetHex ())); } - if (!fromConsensus && (getConfig ().NODE_SIZE < 2)) // tiny or small - dropCache (); - if (getApp().getJobQueue ().getJobCountTotal (jtPUBOLDLEDGER) < 2) getApp().getLedgerMaster ().resumeAcquiring (); else @@ -733,11 +728,9 @@ Ledger::pointer Ledger::getSQL (const std::string& sql) if (!loaded) return Ledger::pointer (); + ret->setValidated (); ret->setClosed (); - if (getApp().getOPs ().haveLedger (ledgerSeq)) - ret->setAccepted (); - if (ret->getHash () != ledgerHash) { if (ShouldLog (lsERROR, Ledger)) @@ -801,9 +794,7 @@ void Ledger::getSQL2 (Ledger::ref ret) { ret->setClosed (); ret->setImmutable (); - - if (getApp().getOPs ().haveLedger (ret->getLedgerSeq ())) - ret->setAccepted (); + ret->setValidated (); WriteLog (lsTRACE, Ledger) << "Loaded ledger: " << ret->getHash ().GetHex (); } @@ -960,7 +951,7 @@ Json::Value Ledger::getJson (int options) ledger["ledger_hash"] = mHash.GetHex (); ledger["transaction_hash"] = mTransHash.GetHex (); ledger["account_hash"] = mAccountHash.GetHex (); - ledger["accepted"] = mAccepted; + ledger["validated"] = mValidated; ledger["total_coins"] = boost::lexical_cast (mTotCoins); if (mCloseTime != 0) @@ -1804,17 +1795,19 @@ uint32 Ledger::roundCloseTime (uint32 closeTime, uint32 closeResolution) return closeTime - (closeTime % closeResolution); } -void Ledger::pendSave (bool fromConsensus) +void Ledger::pendSaveValidated () { - if (!fromConsensus && !getApp().getHashRouter ().setFlag (getHash (), SF_SAVED)) + if (getApp().getHashRouter ().setFlag (getHash (), SF_SAVED)) return; - assert (isImmutable ()); + assert (isImmutable() && isValidated()); + + bool isNew = getLedgerSeq() > getApp().getLedgerMaster().getPublishedLedger()->getLedgerSeq(); getApp().getJobQueue ().addJob ( - fromConsensus ? jtPUBLEDGER : jtPUBOLDLEDGER, - fromConsensus ? "Ledger::pendSave" : "Ledger::pendOldSave", - BIND_TYPE (&Ledger::saveAcceptedLedger, shared_from_this (), P_1, fromConsensus)); + isNew ? jtPUBLEDGER : jtPUBOLDLEDGER, + isNew ? "Ledger::pendSave" : "Ledger::pendOldSave", + BIND_TYPE (&Ledger::saveValidatedLedger, shared_from_this (), P_1)); } diff --git a/modules/ripple_app/ledger/Ledger.h b/modules/ripple_app/ledger/Ledger.h index 6d0ddc686..b58171608 100644 --- a/modules/ripple_app/ledger/Ledger.h +++ b/modules/ripple_app/ledger/Ledger.h @@ -93,14 +93,18 @@ public: } void setAccepted (uint32 closeTime, int closeResolution, bool correctCloseTime); void setAccepted (); + void setValidated () + { + mValidated = mClosed = true; + } void setImmutable (); bool isClosed () { return mClosed; } - bool isAccepted () + bool isValidated () { - return mAccepted; + return mValidated; } bool isImmutable () { @@ -228,7 +232,7 @@ public: static uint256 getHashByIndex (uint32 index); static bool getHashesByIndex (uint32 index, uint256 & ledgerHash, uint256 & parentHash); static std::map< uint32, std::pair > getHashesByIndex (uint32 minSeq, uint32 maxSeq); - void pendSave (bool fromConsensus); + void pendSaveValidated (); // next/prev function SLE::pointer getSLE (uint256 const & uHash); // SLE is mutable @@ -426,7 +430,7 @@ protected: // returned SLE is immutable SLE::pointer getASNodeI (uint256 const & nodeID, LedgerEntryType let); - void saveAcceptedLedger (Job&, bool fromConsensus); + void saveValidatedLedger (Job&); void updateFees (); @@ -449,7 +453,7 @@ private: uint32 mParentCloseTime; // when the previous ledger closed int mCloseResolution; // the resolution for this ledger close time (2-120 seconds) uint32 mCloseFlags; // flags indicating how this ledger close took place - bool mClosed, mValidHash, mAccepted, mImmutable; + bool mClosed, mValidHash, mValidated, mImmutable; uint32 mReferenceFeeUnits; // Fee units for the reference transaction uint32 mReserveBase, mReserveIncrement; // Reserve basse and increment in fee units diff --git a/modules/ripple_app/ledger/LedgerMaster.cpp b/modules/ripple_app/ledger/LedgerMaster.cpp index fa85521d9..df981ed92 100644 --- a/modules/ripple_app/ledger/LedgerMaster.cpp +++ b/modules/ripple_app/ledger/LedgerMaster.cpp @@ -105,23 +105,16 @@ void LedgerMaster::pushLedger (Ledger::pointer newLedger) mFinalizedLedger = mCurrentLedger; mCurrentLedger = newLedger; mEngine.setLedger (newLedger); + mLedgerHistory.addLedger (newLedger); } void LedgerMaster::pushLedger (Ledger::pointer newLCL, Ledger::pointer newOL, bool fromConsensus) { - assert (newLCL->isClosed () && newLCL->isAccepted ()); - assert (!newOL->isClosed () && !newOL->isAccepted ()); + assert (newLCL->isClosed () && newLCL->isImmutable()); + assert (!newOL->isClosed ()); boost::recursive_mutex::scoped_lock ml (mLock); - if (newLCL->isAccepted ()) - { - assert (newLCL->isClosed ()); - assert (newLCL->isImmutable ()); - mLedgerHistory.addAcceptedLedger (newLCL, fromConsensus); - WriteLog (lsINFO, LedgerMaster) << "StashAccepted: " << newLCL->getHash (); - } - { boost::recursive_mutex::scoped_lock ml (mLock); mFinalizedLedger = newLCL; @@ -152,9 +145,6 @@ void LedgerMaster::switchLedgers (Ledger::pointer lastClosed, Ledger::pointer cu void LedgerMaster::storeLedger (Ledger::pointer ledger) { mLedgerHistory.addLedger (ledger); - - if (ledger->isAccepted ()) - mLedgerHistory.addAcceptedLedger (ledger, false); } void LedgerMaster::forceValid (Ledger::pointer ledger) @@ -338,7 +328,10 @@ bool LedgerMaster::acquireMissingLedger (Ledger::ref origLedger, uint256 const& Ledger::pointer lgr = mMissingLedger->getLedger (); if (lgr && (lgr->getLedgerSeq () == ledgerSeq)) + { + lgr->setValidated(); missingAcquireComplete (mMissingLedger); + } mMissingLedger.reset (); return true; @@ -381,8 +374,8 @@ bool LedgerMaster::acquireMissingLedger (Ledger::ref origLedger, uint256 const& if (acq && acq->isComplete ()) { acq->getLedger ()->setAccepted (); - setFullLedger (acq->getLedger ()); - mLedgerHistory.addAcceptedLedger (acq->getLedger (), false); + setValidatedLedger (acq->getLedger ()); + mLedgerHistory.addValidatedLedger (acq->getLedger ()); } else ++fetchCount; @@ -446,9 +439,8 @@ void LedgerMaster::missingAcquireComplete (InboundLedger::pointer acq) if (acq->isComplete ()) { - acq->getLedger ()->setAccepted (); - setFullLedger (acq->getLedger ()); - mLedgerHistory.addAcceptedLedger (acq->getLedger (), false); + setValidatedLedger (acq->getLedger ()); + mLedgerHistory.addValidatedLedger (acq->getLedger ()); } } @@ -541,7 +533,7 @@ void LedgerMaster::fixMismatch (Ledger::ref ledger) CondLog (invalidate != 0, lsWARNING, LedgerMaster) << "All " << invalidate << " prior ledgers invalidated"; } -void LedgerMaster::setFullLedger (Ledger::pointer ledger) +void LedgerMaster::setValidatedLedger (Ledger::pointer ledger) { // A new ledger has been accepted as part of the trusted chain WriteLog (lsDEBUG, LedgerMaster) << "Ledger " << ledger->getLedgerSeq () << " accepted :" << ledger->getHash (); @@ -552,13 +544,11 @@ void LedgerMaster::setFullLedger (Ledger::pointer ledger) boost::recursive_mutex::scoped_lock ml (mLock); + ledger->setValidated(); + mCompleteLedgers.setValue (ledger->getLedgerSeq ()); - if (Ledger::getHashByIndex (ledger->getLedgerSeq ()) != ledger->getHash ()) - { - ledger->pendSave (false); - return; - } + ledger->pendSaveValidated (); if ((ledger->getLedgerSeq () != 0) && mCompleteLedgers.hasValue (ledger->getLedgerSeq () - 1)) { @@ -824,7 +814,7 @@ void LedgerMaster::pubThread () BOOST_FOREACH (Ledger::ref l, ledgers) { WriteLog (lsDEBUG, LedgerMaster) << "Publishing ledger " << l->getLedgerSeq (); - setFullLedger (l); // OPTIMIZEME: This is actually more work than we need to do + setValidatedLedger (l); getApp().getOPs ().pubLedger (l); published = true; } diff --git a/modules/ripple_app/ledger/LedgerMaster.h b/modules/ripple_app/ledger/LedgerMaster.h index 847d62e6e..4aa9686d4 100644 --- a/modules/ripple_app/ledger/LedgerMaster.h +++ b/modules/ripple_app/ledger/LedgerMaster.h @@ -90,7 +90,7 @@ public: void storeLedger (Ledger::pointer); void forceValid (Ledger::pointer); - void setFullLedger (Ledger::pointer ledger); + void setValidatedLedger (Ledger::pointer ledger); void switchLedgers (Ledger::pointer lastClosed, Ledger::pointer newCurrent); diff --git a/modules/ripple_app/ledger/ripple_LedgerHistory.cpp b/modules/ripple_app/ledger/ripple_LedgerHistory.cpp index f15fd67bd..25ed41b5d 100644 --- a/modules/ripple_app/ledger/ripple_LedgerHistory.cpp +++ b/modules/ripple_app/ledger/ripple_LedgerHistory.cpp @@ -27,19 +27,16 @@ void LedgerHistory::addLedger (Ledger::pointer ledger) mLedgersByHash.canonicalize (ledger->getHash (), ledger, true); } -void LedgerHistory::addAcceptedLedger (Ledger::pointer ledger, bool fromConsensus) +void LedgerHistory::addValidatedLedger (Ledger::pointer ledger) { - assert (ledger && ledger->isAccepted () && ledger->isImmutable ()); + assert (ledger && ledger->isValidated () && ledger->isImmutable ()); assert (ledger->peekAccountStateMap ()->getHash ().isNonZero ()); uint256 h (ledger->getHash ()); boost::recursive_mutex::scoped_lock sl (mLedgersByHash.peekMutex ()); - mLedgersByHash.canonicalize (h, ledger, true); - assert (ledger); - assert (ledger->isAccepted ()); - assert (ledger->isImmutable ()); + mLedgersByHash.canonicalize (h, ledger); mLedgersByIndex[ledger->getLedgerSeq ()] = ledger->getHash (); - ledger->pendSave (fromConsensus); + ledger->pendSaveValidated (); } uint256 LedgerHistory::getLedgerHash (uint32 index) @@ -126,7 +123,7 @@ Ledger::pointer LedgerHistory::canonicalizeLedger (Ledger::pointer ledger, bool boost::recursive_mutex::scoped_lock sl (mLedgersByHash.peekMutex ()); mLedgersByHash.canonicalize (h, ledger); - if (ledger->isAccepted ()) + if (ledger->isValidated ()) mLedgersByIndex[ledger->getLedgerSeq ()] = ledger->getHash (); return ledger; diff --git a/modules/ripple_app/ledger/ripple_LedgerHistory.h b/modules/ripple_app/ledger/ripple_LedgerHistory.h index a0629a79f..8e756004e 100644 --- a/modules/ripple_app/ledger/ripple_LedgerHistory.h +++ b/modules/ripple_app/ledger/ripple_LedgerHistory.h @@ -15,7 +15,7 @@ public: void addLedger (Ledger::pointer ledger); - void addAcceptedLedger (Ledger::pointer ledger, bool fromConsensus); + void addValidatedLedger (Ledger::pointer ledger); float getCacheHitRate () { diff --git a/modules/ripple_app/misc/NetworkOPs.cpp b/modules/ripple_app/misc/NetworkOPs.cpp index 2d90644d8..1e3f69ee2 100644 --- a/modules/ripple_app/misc/NetworkOPs.cpp +++ b/modules/ripple_app/misc/NetworkOPs.cpp @@ -1272,7 +1272,7 @@ NetworkOPs::getAccountTxs (const RippleAddress& account, int32 minLedger, int32 WriteLog(lsWARNING, NetworkOPs) << "Recovering ledger " << seq << ", txn " << txn->getID(); Ledger::pointer ledger = getLedgerBySeq(seq); if (ledger) - ledger->pendSave(false); + ledger->pendSaveValidated(); } TransactionMetaSet::pointer meta = boost::make_shared (txn->getID (), txn->getLedger (), rawMeta.getData ());