diff --git a/src/Ledger.cpp b/src/Ledger.cpp index ceabf60489..00f8864fc8 100644 --- a/src/Ledger.cpp +++ b/src/Ledger.cpp @@ -35,8 +35,7 @@ Ledger::Ledger(const NewcoinAddress& masterID, uint64 startAmount) : mTotCoins(s mAccountStateMap->armDirty(); writeBack(lepCREATE, startAccount->getSLE()); - mAccountStateMap->flushDirty(256, hotACCOUNT_NODE, mLedgerSeq); - mAccountStateMap->disarmDirty(); + SHAMap::flushDirty(*mAccountStateMap->disarmDirty(), 256, hotACCOUNT_NODE, mLedgerSeq); } Ledger::Ledger(const uint256 &parentHash, const uint256 &transHash, const uint256 &accountHash, @@ -329,11 +328,6 @@ bool Ledger::getTransaction(const uint256& txID, Transaction::pointer& txn, Tran return true; } -bool Ledger::unitTest() -{ - return true; -} - uint256 Ledger::getHash() { if (!mValidHash) @@ -367,14 +361,6 @@ void Ledger::saveAcceptedLedger() if (SQL_EXISTS(theApp->getLedgerDB()->getDB(), boost::str(ledgerExists % mLedgerSeq))) theApp->getLedgerDB()->getDB()->executeSQL(boost::str(deleteLedger % mLedgerSeq)); - // write out dirty nodes - int fc; - while ((fc = mTransactionMap->flushDirty(256, hotTRANSACTION_NODE, mLedgerSeq)) > 0) - { cLog(lsINFO) << "Flushed " << fc << " dirty transaction nodes"; } - while ((fc = mAccountStateMap->flushDirty(256, hotACCOUNT_NODE, mLedgerSeq)) > 0) - { cLog(lsINFO) << "Flushed " << fc << " dirty state nodes"; } - disarmDirty(); - SHAMap& txSet = *peekTransactionMap(); Database *db = theApp->getTxnDB()->getDB(); ScopedLock dbLock = theApp->getTxnDB()->getDBLock(); diff --git a/src/Ledger.h b/src/Ledger.h index 0c201d12fe..aa9cc9f142 100644 --- a/src/Ledger.h +++ b/src/Ledger.h @@ -109,8 +109,6 @@ public: bool isClosed() { return mClosed; } bool isAccepted() { return mAccepted; } bool isImmutable() { return mImmutable; } - void armDirty() { mTransactionMap->armDirty(); mAccountStateMap->armDirty(); } - void disarmDirty() { mTransactionMap->disarmDirty(); mAccountStateMap->disarmDirty(); } // ledger signature operations void addRaw(Serializer &s) const; @@ -283,8 +281,6 @@ public: bool walkLedger(); bool assertSane(); - - static bool unitTest(); }; inline LedgerStateParms operator|(const LedgerStateParms& l1, const LedgerStateParms& l2) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 6f4d0aac0e..f241934ed9 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -1098,12 +1098,23 @@ void LedgerConsensus::accept(SHAMap::ref set) cLog(lsINFO) << "CNF mode " << theApp->getOPs().getOperatingMode() << ", oldLCL " << mPrevLedgerHash; } - Ledger::pointer newLCL = boost::make_shared(false, boost::ref(*mPreviousLedger)); - newLCL->armDirty(); - CanonicalTXSet failedTransactions(set->getHash()); + + Ledger::pointer newLCL = boost::make_shared(false, boost::ref(*mPreviousLedger)); + + newLCL->peekTransactionMap()->armDirty(); + newLCL->peekAccountStateMap()->armDirty(); applyTransactions(set, newLCL, newLCL, failedTransactions, false); newLCL->setClosed(); + boost::shared_ptr acctNodes = newLCL->peekAccountStateMap()->disarmDirty(); + boost::shared_ptr txnNodes = newLCL->peekTransactionMap()->disarmDirty(); + + // write out dirty nodes (temporarily done here) Most come before setAccepted + int fc; + while ((fc = SHAMap::flushDirty(*acctNodes, 256, hotACCOUNT_NODE, newLCL->getLedgerSeq())) > 0) + { cLog(lsINFO) << "Flushed " << fc << " dirty state nodes"; } + while ((fc = SHAMap::flushDirty(*txnNodes, 256, hotTRANSACTION_NODE, newLCL->getLedgerSeq())) > 0) + { cLog(lsINFO) << "Flushed " << fc << " dirty transaction nodes"; } bool closeTimeCorrect = true; if (closeTime == 0) diff --git a/src/SHAMap.h b/src/SHAMap.h index 6d579a918d..f8afce826e 100644 --- a/src/SHAMap.h +++ b/src/SHAMap.h @@ -283,13 +283,14 @@ public: typedef const boost::shared_ptr& ref; typedef std::map > SHAMapDiff; + typedef boost::unordered_map SHADirtyMap; private: uint32 mSeq; mutable boost::recursive_mutex mLock; boost::unordered_map mTNByID; - boost::shared_ptr< boost::unordered_map > mDirtyNodes; + boost::shared_ptr mDirtyNodes; SHAMapTreeNode::pointer root; @@ -384,9 +385,9 @@ public: // return value: true=successfully completed, false=too different bool compare(SHAMap::ref otherMap, SHAMapDiff& differences, int maxCount); - void armDirty(); - int flushDirty(int maxNodes, HashedObjectType t, uint32 seq); - void disarmDirty(); + int armDirty(); + static int flushDirty(SHADirtyMap& dirtyMap, int maxNodes, HashedObjectType t, uint32 seq); + boost::shared_ptr disarmDirty(); void setSeq(uint32 seq) { mSeq = seq; } uint32 getSeq() { return mSeq; }