diff --git a/src/Ledger.h b/src/Ledger.h index ea7b297fd6..d4fe92f460 100644 --- a/src/Ledger.h +++ b/src/Ledger.h @@ -85,11 +85,13 @@ public: uint64 totCoins, uint64 timeStamp, uint32 ledgerSeq); // used for database ledgers Ledger(const std::vector& rawLedger); Ledger(const std::string& rawLedger); - Ledger(Ledger::pointer previous); // ledger after this one + Ledger(bool fromAccepted, Ledger& previous); // ledger after this one + Ledger(Ledger& target, bool isMutable); // snapshot void updateHash(); void setClosed() { mClosed = true; } void setAccepted() { mAccepted = true; } + void setImmutable() { mImmutable = true; } bool isClosed() { return mClosed; } bool isAccepted() { return mAccepted; } @@ -118,6 +120,7 @@ public: // low level functions SHAMap::pointer peekTransactionMap() { return mTransactionMap; } SHAMap::pointer peekAccountStateMap() { return mAccountStateMap; } + Ledger::pointer snapShot(bool isMutable); // ledger sync functions void setAcquiring(void); @@ -129,8 +132,6 @@ public: bool hasTransaction(const uint256& TransID) const; Transaction::pointer getTransaction(const uint256& transID) const; - Ledger::pointer switchPreviousLedger(Ledger::pointer oldPrevious, Ledger::pointer newPrevious, int limit); - // high-level functions AccountState::pointer getAccountState(const NewcoinAddress& acctID); LedgerStateParms writeBack(LedgerStateParms parms, SLE::pointer); diff --git a/src/LedgerMaster.cpp b/src/LedgerMaster.cpp index 0dca9c5489..3d1f1858c3 100644 --- a/src/LedgerMaster.cpp +++ b/src/LedgerMaster.cpp @@ -39,7 +39,6 @@ void LedgerMaster::pushLedger(Ledger::pointer newLCL, Ledger::pointer newOL) { assert(newLCL->isClosed() && newLCL->isAccepted()); assert(!newOL->isClosed() && !newOL->isAccepted()); - Log(lsINFO) << "PushAccept: " << newLCL->getHash().GetHex(); ScopedLock sl(mLock); if (mFinalizedLedger && mFinalizedLedger->isAccepted()) @@ -63,24 +62,22 @@ void LedgerMaster::switchLedgers(Ledger::pointer lastClosed, Ledger::pointer cur mEngine.setLedger(mCurrentLedger); } -Ledger::pointer LedgerMaster::closeTime() -{ - boost::recursive_mutex::scoped_lock sl(mLock); - assert(mCurrentLedger && mWobbleLedger); - Ledger::pointer ret = mCurrentLedger; - mCurrentLedger = mWobbleLedger; - mEngine.setLedger(mCurrentLedger); - mWobbleLedger = ret; - return ret; -} - void LedgerMaster::beginWobble() { boost::recursive_mutex::scoped_lock sl(mLock); assert(!mWobbleLedger); - mWobbleLedger = mCurrentLedger; - mCurrentLedger = boost::make_shared(mCurrentLedger); - mEngine.setLedger(mCurrentLedger); + mWobbleLedger = boost::make_shared(boost::ref(*mCurrentLedger), true); + mEngine.setDefaultLedger(mCurrentLedger); + mEngine.setAlternateLedger(mWobbleLedger); +} + +void LedgerMaster::closeTime() +{ // swap current and wobble ledgers + boost::recursive_mutex::scoped_lock sl(mLock); + assert(mCurrentLedger && mWobbleLedger); + std::swap(mCurrentLedger, mWobbleLedger); + mEngine.setDefaultLedger(mCurrentLedger); + mEngine.setAlternateLedger(mWobbleLedger); } Ledger::pointer LedgerMaster::endWobble() @@ -89,6 +86,7 @@ Ledger::pointer LedgerMaster::endWobble() assert(mWobbleLedger && mCurrentLedger); Ledger::pointer ret = mWobbleLedger; mWobbleLedger = Ledger::pointer(); + mEngine.setAlternateLedger(Ledger::pointer()); return ret; }