std::shared_ptr<Ledger> buildLedgerImpl( std::shared_ptr<Ledger const> const& parent, NetClock::time_point closeTime, const bool closeTimeCorrect, NetClock::duration closeResolution, Application& app, beast::Journal j, ApplyTxs&& applyTxs) { auto buildLCL = std::make_shared<Ledger>(*parent, closeTime); if (buildLCL->rules().enabled(featureSHAMapV2) && !buildLCL->stateMap().is_v2()) { buildLCL->make_v2(); } // Set up to write SHAMap changes to our database, // perform updates, extract changes { OpenView accum(&*buildLCL); assert(!accum.open()); applyTxs(accum, buildLCL); accum.apply(*buildLCL); } buildLCL->updateSkipList(); { // Write the final version of all modified SHAMap // nodes to the node store to preserve the new LCL int const asf = buildLCL->stateMap().flushDirty( hotACCOUNT_NODE, buildLCL->info().seq); int const tmf = buildLCL->txMap().flushDirty( hotTRANSACTION_NODE, buildLCL->info().seq); JLOG(j.debug()) << "Flushed " << asf << " accounts and " << tmf << " transaction nodes"; } buildLCL->unshare(); // Accept ledger buildLCL->setAccepted( closeTime, closeResolution, closeTimeCorrect, app.config()); return buildLCL; }
void Ledger::rawTxInsert (uint256 const& key, std::shared_ptr<Serializer const > const& txn, std::shared_ptr< Serializer const> const& metaData) { assert (metaData); // low-level - just add to table Serializer s(txn->getDataLength () + metaData->getDataLength () + 16); s.addVL (txn->peekData ()); s.addVL (metaData->peekData ()); auto item = std::make_shared< SHAMapItem const> (key, std::move(s)); if (! txMap().addGiveItem (std::move(item), true, true)) LogicError("duplicate_tx: " + to_string(key)); }