mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-26 22:55:53 +00:00
@@ -20,6 +20,7 @@
|
||||
#include "data/LedgerCache.hpp"
|
||||
|
||||
#include "data/Types.hpp"
|
||||
#include "data/impl/LedgerCacheFile.hpp"
|
||||
#include "etl/Models.hpp"
|
||||
#include "util/Assert.hpp"
|
||||
|
||||
@@ -27,9 +28,14 @@
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
#include <shared_mutex>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace data {
|
||||
@@ -251,4 +257,34 @@ LedgerCache::getSuccessorHitRate() const
|
||||
return static_cast<float>(successorHitCounter_.get().value()) / successorReqCounter_.get().value();
|
||||
}
|
||||
|
||||
std::expected<void, std::string>
|
||||
LedgerCache::saveToFile(std::string const& path) const
|
||||
{
|
||||
if (not isFull()) {
|
||||
return std::unexpected{"Ledger cache is not full"};
|
||||
}
|
||||
|
||||
impl::LedgerCacheFile file{path};
|
||||
std::unique_lock lock{mtx_};
|
||||
impl::LedgerCacheFile::DataView data{.latestSeq = latestSeq_, .map = map_, .deleted = deleted_};
|
||||
return file.write(data);
|
||||
}
|
||||
|
||||
std::expected<void, std::string>
|
||||
LedgerCache::loadFromFile(std::string const& path, uint32_t minLatestSequence)
|
||||
{
|
||||
impl::LedgerCacheFile file{path};
|
||||
auto data = file.read(minLatestSequence);
|
||||
if (not data.has_value()) {
|
||||
return std::unexpected(std::move(data).error());
|
||||
}
|
||||
auto [latestSeq, map, deleted] = std::move(data).value();
|
||||
std::unique_lock lock{mtx_};
|
||||
latestSeq_ = latestSeq;
|
||||
map_ = std::move(map);
|
||||
deleted_ = std::move(deleted);
|
||||
full_ = true;
|
||||
return {};
|
||||
}
|
||||
|
||||
} // namespace data
|
||||
|
||||
Reference in New Issue
Block a user