diff --git a/src/ripple/app/ledger/Ledger.cpp b/src/ripple/app/ledger/Ledger.cpp index 813a7acd7..345c3bb28 100644 --- a/src/ripple/app/ledger/Ledger.cpp +++ b/src/ripple/app/ledger/Ledger.cpp @@ -305,6 +305,20 @@ Ledger::Ledger( } } +Ledger::Ledger( + LedgerInfo& info, + Config const& config, + Family& family, + SHAMap const& baseState) + : mImmutable(false) + , info_(info) + , txMap_(SHAMapType::TRANSACTION, family) + , stateMap_(baseState, true) + , rules_{config.features} + , j_(beast::Journal(beast::Journal::getNullSink())) +{ +} + // Create a new ledger that follows this one Ledger::Ledger(Ledger const& prevLedger, NetClock::time_point closeTime) : mImmutable(false) diff --git a/src/ripple/app/ledger/Ledger.h b/src/ripple/app/ledger/Ledger.h index 1afe3a3f5..bf2d64ffd 100644 --- a/src/ripple/app/ledger/Ledger.h +++ b/src/ripple/app/ledger/Ledger.h @@ -121,6 +121,13 @@ public: Family& family, beast::Journal j); + // used when loading ledgers from catalogue files + Ledger( + LedgerInfo& info, + Config const& config, + Family& family, + SHAMap const& baseState); + /** Create a new ledger following a previous ledger The ledger will have the sequence number that diff --git a/src/ripple/rpc/handlers/Catalogue.cpp b/src/ripple/rpc/handlers/Catalogue.cpp index 4566c81fb..c935891ee 100644 --- a/src/ripple/rpc/handlers/Catalogue.cpp +++ b/src/ripple/rpc/handlers/Catalogue.cpp @@ -112,10 +112,9 @@ private: auto const& info = ledger->info(); - uint64_t closeTime = - 0xCAFED00DCAFEBABEULL; // info.closeTime.time_since_epoch().count(); - uint64_t parentCloseTime = 0xDEADBEEFC001D00D; - // info.parentCloseTime.time_since_epoch().count(); + uint64_t closeTime = info.closeTime.time_since_epoch().count(); + uint64_t parentCloseTime = + info.parentCloseTime.time_since_epoch().count(); uint32_t closeTimeResolution = info.closeTimeResolution.count(); uint64_t drops = info.drops.drops(); @@ -432,16 +431,23 @@ doCatalogueLoad(RPC::JsonContext& context) return rpcError(rpcINTERNAL, "Missing previous ledger"); } - // Create ledger from previous + auto snapshot = prevLedger->stateMap().snapShot(true); + ledger = std::make_shared( - *prevLedger, context.app.timeKeeper().closeTime()); - - ledger->setLedgerInfo(info); + info, + context.app.config(), + context.app.getNodeFamily(), + *snapshot); + /* + // Create ledger from previous + ledger = std::make_shared( + *prevLedger, context.app.timeKeeper().closeTime()); + ledger->setLedgerInfo(info); + */ // Apply delta (only leaf-node changes) - SHAMap const& prevMap = prevLedger->stateMap(); - if (!ledger->stateMap().deserializeFromStream(infile, prevMap)) + if (!ledger->stateMap().deserializeFromStream(infile)) { JLOG(context.j.error()) << "Failed to apply delta to ledger " << info.seq; diff --git a/src/ripple/shamap/SHAMap.h b/src/ripple/shamap/SHAMap.h index ed28ec154..d82ed898a 100644 --- a/src/ripple/shamap/SHAMap.h +++ b/src/ripple/shamap/SHAMap.h @@ -394,10 +394,9 @@ public: * @return True if deserialization succeeded */ bool - deserializeFromStream( - std::istream& stream, - std::optional> baseSHAMap = - std::nullopt); + deserializeFromStream(std::istream& stream); + // std::optional> baseSHAMap = + // std::nullopt); private: using SharedPtrNodeStack = diff --git a/src/ripple/shamap/impl/SHAMap.cpp b/src/ripple/shamap/impl/SHAMap.cpp index 8f0a5f4cc..3bfa7c79d 100644 --- a/src/ripple/shamap/impl/SHAMap.cpp +++ b/src/ripple/shamap/impl/SHAMap.cpp @@ -1300,8 +1300,8 @@ SHAMap::serializeToStream( // Process each difference for (auto const& [key, deltaItem] : differences) { - auto const& oldItem = deltaItem.first; - auto const& newItem = deltaItem.second; + auto const& newItem = deltaItem.first; + auto const& oldItem = deltaItem.second; if (!oldItem && newItem) { @@ -1392,9 +1392,8 @@ SHAMap::serializeToStream( } bool -SHAMap::deserializeFromStream( - std::istream& stream, - std::optional> baseSHAMap) +SHAMap::deserializeFromStream(std::istream& stream) +//, std::optional> baseSHAMap) { try { @@ -1405,18 +1404,22 @@ SHAMap::deserializeFromStream( if (state_ != SHAMapState::Modifying && state_ != SHAMapState::Synching) return false; - // If we have a base map, start with a copy of it - if (baseSHAMap) - { - root_ = baseSHAMap->get().root_; - if (root_) - unshare(); - } - else - { - // Start with a fresh empty root + if (!root_) root_ = std::make_shared(cowid_); - } + /* + // If we have a base map, start with a copy of it + if (baseSHAMap.has_value()) + { + root_ = baseSHAMap->get().root_; + if (root_) + unshare(); + } + else + { + // Start with a fresh empty root + root_ = std::make_shared(cowid_); + } + */ // Define a lambda to deserialize a leaf node auto deserializeLeaf = [this]( @@ -1498,9 +1501,15 @@ SHAMap::deserializeFromStream( auto item = make_shamapitem(key, makeSlice(data)); if (hasItem(key)) + { + std::cout << "Modifying item: " << to_string(key) << "\n"; return updateGiveItem(nodeType, std::move(item)); - - return addGiveItem(nodeType, std::move(item)); + } + else + { + std::cout << "Adding item: " << to_string(key) << "\n"; + return addGiveItem(nodeType, std::move(item)); + } }; SHAMapNodeType lastParsed;