diff --git a/src/Ledger.h b/src/Ledger.h index 64ae24a6d5..1f9c8b6c60 100644 --- a/src/Ledger.h +++ b/src/Ledger.h @@ -99,6 +99,7 @@ public: void setImmutable() { updateHash(); mImmutable = true; } bool isClosed() { return mClosed; } bool isAccepted() { return mAccepted; } + bool isImmutable() { return mImmutable; } // This ledger has closed, will never be accepted, and is accepting // new transactions to be re-repocessed when do accept a new last-closed ledger diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 1742148129..dcead92135 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -256,7 +256,7 @@ void LedgerConsensus::mapComplete(const uint256& hash, SHAMap::pointer map, bool if (mComplete.find(hash) != mComplete.end()) { - Log(lsERROR) << "Which we already had"; + Log(lsERROR) << "Got TXS we already had " << hash.GetHex(); return; // we already have this map } diff --git a/src/LedgerHistory.cpp b/src/LedgerHistory.cpp index ad357139ab..f20a7ae53a 100644 --- a/src/LedgerHistory.cpp +++ b/src/LedgerHistory.cpp @@ -32,6 +32,7 @@ void LedgerHistory::addAcceptedLedger(Ledger::pointer ledger) uint256 h(ledger->getHash()); boost::recursive_mutex::scoped_lock sl(mLedgersByHash.peekMutex()); mLedgersByHash.canonicalize(h, ledger); + assert(ledger && ledger->isAccepted() && ledger->isImmutable()); mLedgersByIndex.insert(std::make_pair(ledger->getLedgerSeq(), ledger)); boost::thread thread(boost::bind(&Ledger::saveAcceptedLedger, ledger)); thread.detach(); @@ -71,6 +72,7 @@ Ledger::pointer LedgerHistory::getLedgerByHash(const uint256& hash) Ledger::pointer LedgerHistory::canonicalizeLedger(Ledger::pointer ledger, bool save) { + assert(ledger->isImmutable()); uint256 h(ledger->getHash()); if (!save) @@ -83,7 +85,7 @@ Ledger::pointer LedgerHistory::canonicalizeLedger(Ledger::pointer ledger, bool s // save input ledger in map if not in map, otherwise return corresponding map ledger boost::recursive_mutex::scoped_lock sl(mLedgersByHash.peekMutex()); mLedgersByHash.canonicalize(h, ledger); - if (ledger->isAccepted()) mLedgersByIndex[ledger->getLedgerSeq()]=ledger; + if (ledger->isAccepted()) mLedgersByIndex[ledger->getLedgerSeq()] = ledger; return ledger; } // vim:ts=4 diff --git a/src/LedgerMaster.cpp b/src/LedgerMaster.cpp index 3d1f1858c3..ea1b4bdce7 100644 --- a/src/LedgerMaster.cpp +++ b/src/LedgerMaster.cpp @@ -40,13 +40,14 @@ void LedgerMaster::pushLedger(Ledger::pointer newLCL, Ledger::pointer newOL) assert(newLCL->isClosed() && newLCL->isAccepted()); assert(!newOL->isClosed() && !newOL->isAccepted()); - ScopedLock sl(mLock); - if (mFinalizedLedger && mFinalizedLedger->isAccepted()) + if (newLCL->isAccepted()) { mLedgerHistory.addAcceptedLedger(mFinalizedLedger); Log(lsINFO) << "StashAccepted: " << mFinalizedLedger->getHash().GetHex(); } + mFinalizedLedger = newLCL; + ScopedLock sl(mLock); mCurrentLedger = newOL; mEngine.setLedger(newOL); }