AcceptedLedger::pointer AcceptedLedger::makeAcceptedLedger (Ledger::ref ledger) { AcceptedLedger::pointer ret = s_cache.fetch (ledger->getHash ()); if (ret) return ret; ret = AcceptedLedger::pointer (new AcceptedLedger (ledger)); s_cache.canonicalize (ledger->getHash (), ret); return ret; }
void LedgerHistory::validatedLedger (Ledger::ref ledger) { LedgerIndex index = ledger->getLedgerSeq(); LedgerHash hash = ledger->getHash(); assert (!hash.isZero()); ConsensusValidated::ScopedLockType sl ( m_consensus_validated.peekMutex()); std::shared_ptr< std::pair< LedgerHash, LedgerHash > > entry = std::make_shared<std::pair< LedgerHash, LedgerHash >>(); m_consensus_validated.canonicalize(index, entry, false); if (entry->second != hash) { bool mismatch (false); if (entry->second.isNonZero() && (entry->second != hash)) { WriteLog (lsERROR, LedgerMaster) << "MISMATCH: seq=" << index << " validated:" << entry->second << " then:" << hash; mismatch = true; } if (entry->first.isNonZero() && (entry->first != hash)) { WriteLog (lsERROR, LedgerMaster) << "MISMATCH: seq=" << index << " built:" << entry->first << " validated:" << hash; mismatch = true; } if (mismatch) handleMismatch (entry->second, hash); entry->second = hash; } }
void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL, bool fromConsensus) { assert(newLCL->isClosed() && newLCL->isAccepted()); assert(!newOL->isClosed() && !newOL->isAccepted()); if (newLCL->isAccepted()) { assert(newLCL->isClosed()); assert(newLCL->isImmutable()); mLedgerHistory.addAcceptedLedger(newLCL, fromConsensus); cLog(lsINFO) << "StashAccepted: " << newLCL->getHash(); } { boost::recursive_mutex::scoped_lock ml(mLock); mFinalizedLedger = newLCL; mCurrentLedger = newOL; mEngine.setLedger(newOL); } checkAccept(newLCL->getHash(), newLCL->getLedgerSeq()); }
void LedgerMaster::pushLedger(Ledger::ref newLedger) { // Caller should already have properly assembled this ledger into "ready-to-close" form -- // all candidate transactions must already be applied cLog(lsINFO) << "PushLedger: " << newLedger->getHash(); boost::recursive_mutex::scoped_lock ml(mLock); if (!!mFinalizedLedger) { mFinalizedLedger->setClosed(); cLog(lsTRACE) << "Finalizes: " << mFinalizedLedger->getHash(); } mFinalizedLedger = mCurrentLedger; mCurrentLedger = newLedger; mEngine.setLedger(newLedger); }
void LedgerMaster::switchLedgers(Ledger::ref lastClosed, Ledger::ref current) { assert(lastClosed && current); { boost::recursive_mutex::scoped_lock ml(mLock); mFinalizedLedger = lastClosed; mFinalizedLedger->setClosed(); mFinalizedLedger->setAccepted(); mCurrentLedger = current; } assert(!mCurrentLedger->isClosed()); mEngine.setLedger(mCurrentLedger); checkAccept(lastClosed->getHash(), lastClosed->getLedgerSeq()); }
void LedgerHistory::validatedLedger (Ledger::ref ledger) { LedgerIndex index = ledger->getLedgerSeq(); LedgerHash hash = ledger->getHash(); assert (!hash.isZero()); TaggedCache::ScopedLockType sl(mConsensusValidated.peekMutex(), __FILE__, __LINE__); boost::shared_ptr< std::pair< LedgerHash, LedgerHash > > entry = boost::make_shared<std::pair< LedgerHash, LedgerHash >>(); mConsensusValidated.canonicalize(index, entry, false); if (entry->second != hash) { if (entry->second.isNonZero() && (entry->second != hash)) { WriteLog (lsERROR, LedgerMaster) << "MISMATCH: seq=" << index << " validated:" << entry->second << " then:" << hash; } if (entry->first.isNonZero() && (entry->first != hash)) { WriteLog (lsERROR, LedgerMaster) << "MISMATCH: seq=" << index << " built:" << entry->first << " validated:" << hash; } entry->second = hash; } }