Skip to content

Commit

Permalink
Allow freezing bucketlist snapshots to be refreshed by callers manually
Browse files Browse the repository at this point in the history
  • Loading branch information
marta-lokhova committed Dec 20, 2024
1 parent 21f2b39 commit 8922ba5
Show file tree
Hide file tree
Showing 12 changed files with 73 additions and 30 deletions.
23 changes: 17 additions & 6 deletions src/bucket/BucketListSnapshotBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ LedgerHeader const&
SearchableBucketListSnapshotBase<BucketT>::getLedgerHeader()
{
releaseAssert(mSnapshot);
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
if (mAutoUpdate)
{
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
}
return mSnapshot->getLedgerHeader();
}

Expand All @@ -63,7 +66,10 @@ LastClosedLedger const&
SearchableBucketListSnapshotBase<BucketT>::getLastClosedLedger()
{
releaseAssert(mSnapshot);
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
if (mAutoUpdate)
{
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
}
return mSnapshot->getLastClosedLedger();
}

Expand Down Expand Up @@ -117,7 +123,10 @@ SearchableBucketListSnapshotBase<BucketT>::load(LedgerKey const& k)
}
};

mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
if (mAutoUpdate)
{
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
}
if (threadIsMain())
{
mSnapshotManager.startPointLoadTimer();
Expand Down Expand Up @@ -150,10 +159,12 @@ BucketLevelSnapshot<BucketT>::BucketLevelSnapshot(

template <class BucketT>
SearchableBucketListSnapshotBase<BucketT>::SearchableBucketListSnapshotBase(
BucketSnapshotManager const& snapshotManager)
: mSnapshotManager(snapshotManager), mHistoricalSnapshots()
BucketSnapshotManager const& snapshotManager, bool autoUpdate)
: mSnapshotManager(snapshotManager)
, mHistoricalSnapshots()
, mAutoUpdate(autoUpdate)
{

// Always create a snapshot based on the latest LCL state.
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
}

Expand Down
7 changes: 6 additions & 1 deletion src/bucket/BucketListSnapshotBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,15 +159,20 @@ class SearchableBucketListSnapshotBase : public NonMovableOrCopyable
// Snapshot managed by SnapshotManager
SnapshotPtrT<BucketT> mSnapshot{};
std::map<uint32_t, SnapshotPtrT<BucketT>> mHistoricalSnapshots;
bool const mAutoUpdate;

// Loops through all buckets, starting with curr at level 0, then snap at
// level 0, etc. Calls f on each bucket. Exits early if function
// returns Loop::COMPLETE.
void loopAllBuckets(std::function<Loop(BucketSnapshotT const&)> f,
BucketListSnapshot<BucketT> const& snapshot) const;

// If `autoUpdate` is true, the snapshot will keep itself consistent with
// LCL automatically. If not, callers are expected to refresh the snapshot
// manually (this is useful to use cases that a consistent view of the state
// for some arbitrary time)
SearchableBucketListSnapshotBase(
BucketSnapshotManager const& snapshotManager);
BucketSnapshotManager const& snapshotManager, bool autoUpdate);

std::optional<std::vector<typename BucketT::LoadT>>
loadKeysInternal(std::set<LedgerKey, LedgerEntryIdCmp> const& inKeys,
Expand Down
7 changes: 4 additions & 3 deletions src/bucket/BucketManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1054,8 +1054,8 @@ BucketManager::startBackgroundEvictionScan(uint32_t ledgerSeq)
releaseAssert(!mEvictionFuture.valid());
releaseAssert(mEvictionStatistics);

auto searchableBL =
mSnapshotManager->copySearchableLiveBucketListSnapshot();
auto searchableBL = mSnapshotManager->copySearchableLiveBucketListSnapshot(
/* autoUpdate */ true);
auto const& cfg = mApp.getLedgerManager().getSorobanNetworkConfig();
auto const& sas = cfg.stateArchivalSettings();

Expand Down Expand Up @@ -1588,7 +1588,8 @@ BucketManager::getSearchableLiveBucketListSnapshot()
if (!mSearchableBucketListSnapshot)
{
mSearchableBucketListSnapshot =
mSnapshotManager->copySearchableLiveBucketListSnapshot();
mSnapshotManager->copySearchableLiveBucketListSnapshot(
/* autoUpdate */ true);
}

return mSearchableBucketListSnapshot;
Expand Down
5 changes: 3 additions & 2 deletions src/bucket/BucketSnapshotManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,12 @@ BucketSnapshotManager::BucketSnapshotManager(
}

std::shared_ptr<SearchableLiveBucketListSnapshot>
BucketSnapshotManager::copySearchableLiveBucketListSnapshot() const
BucketSnapshotManager::copySearchableLiveBucketListSnapshot(
bool autoUpdate) const
{
// Can't use std::make_shared due to private constructor
return std::shared_ptr<SearchableLiveBucketListSnapshot>(
new SearchableLiveBucketListSnapshot(*this));
new SearchableLiveBucketListSnapshot(*this, autoUpdate));
}

std::shared_ptr<SearchableHotArchiveBucketListSnapshot>
Expand Down
2 changes: 1 addition & 1 deletion src/bucket/BucketSnapshotManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ class BucketSnapshotManager : NonMovableOrCopyable
uint32_t numHistoricalLedgers);

std::shared_ptr<SearchableLiveBucketListSnapshot>
copySearchableLiveBucketListSnapshot() const;
copySearchableLiveBucketListSnapshot(bool autoUpdate) const;

std::shared_ptr<SearchableHotArchiveBucketListSnapshot>
copySearchableHotArchiveBucketListSnapshot() const;
Expand Down
28 changes: 22 additions & 6 deletions src/bucket/SearchableBucketList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,12 @@ SearchableLiveBucketListSnapshot::scanForEviction(
return result;
}

void
SearchableLiveBucketListSnapshot::updateSnapshotToLatest()
{
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
}

template <class BucketT>
std::optional<std::vector<typename BucketT::LoadT>>
SearchableBucketListSnapshotBase<BucketT>::loadKeysInternal(
Expand All @@ -77,7 +83,10 @@ SearchableBucketListSnapshotBase<BucketT>::loadKeysInternal(
return keys.empty() ? Loop::COMPLETE : Loop::INCOMPLETE;
};

mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
if (mAutoUpdate)
{
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
}

if (!ledgerSeq || *ledgerSeq == mSnapshot->getLedgerSeq())
{
Expand Down Expand Up @@ -111,7 +120,10 @@ SearchableLiveBucketListSnapshot::loadPoolShareTrustLinesByAccountAndAsset(

// This query should only be called during TX apply
releaseAssert(threadIsMain());
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
if (mAutoUpdate)
{
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
}
releaseAssert(mSnapshot);

LedgerKeySet trustlinesToLoad;
Expand Down Expand Up @@ -152,7 +164,10 @@ SearchableLiveBucketListSnapshot::loadInflationWinners(size_t maxWinners,
int64_t minBalance)
{
ZoneScoped;
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
if (mAutoUpdate)
{
mSnapshotManager.maybeUpdateSnapshot(mSnapshot, mHistoricalSnapshots);
}
releaseAssert(mSnapshot);

// This is a legacy query, should only be called by main thread during
Expand Down Expand Up @@ -261,14 +276,15 @@ SearchableLiveBucketListSnapshot::loadKeysWithLimits(
}

SearchableLiveBucketListSnapshot::SearchableLiveBucketListSnapshot(
BucketSnapshotManager const& snapshotManager)
: SearchableBucketListSnapshotBase<LiveBucket>(snapshotManager)
BucketSnapshotManager const& snapshotManager, bool autoUpdate)
: SearchableBucketListSnapshotBase<LiveBucket>(snapshotManager, autoUpdate)
{
}

SearchableHotArchiveBucketListSnapshot::SearchableHotArchiveBucketListSnapshot(
BucketSnapshotManager const& snapshotManager)
: SearchableBucketListSnapshotBase<HotArchiveBucket>(snapshotManager)
: SearchableBucketListSnapshotBase<HotArchiveBucket>(snapshotManager,
/* autoUpdate */ true)
{
}

Expand Down
6 changes: 4 additions & 2 deletions src/bucket/SearchableBucketList.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class SearchableLiveBucketListSnapshot
: public SearchableBucketListSnapshotBase<LiveBucket>
{
SearchableLiveBucketListSnapshot(
BucketSnapshotManager const& snapshotManager);
BucketSnapshotManager const& snapshotManager, bool autoUpdate);

public:
std::vector<LedgerEntry>
Expand All @@ -35,7 +35,9 @@ class SearchableLiveBucketListSnapshot
StateArchivalSettings const& sas);

friend std::shared_ptr<SearchableLiveBucketListSnapshot>
BucketSnapshotManager::copySearchableLiveBucketListSnapshot() const;
BucketSnapshotManager::copySearchableLiveBucketListSnapshot(
bool autoUpdate) const;
void updateSnapshotToLatest();
};

class SearchableHotArchiveBucketListSnapshot
Expand Down
10 changes: 5 additions & 5 deletions src/bucket/test/BucketIndexTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ class BucketIndexTest

auto searchableBL = getBM()
.getBucketSnapshotManager()
.copySearchableLiveBucketListSnapshot();
.copySearchableLiveBucketListSnapshot(true);
auto lk = LedgerEntryKey(canonicalEntry);

auto currentLoadedEntry = searchableBL->load(lk);
Expand Down Expand Up @@ -252,7 +252,7 @@ class BucketIndexTest
{
auto searchableBL = getBM()
.getBucketSnapshotManager()
.copySearchableLiveBucketListSnapshot();
.copySearchableLiveBucketListSnapshot(true);

// Test bulk load lookup
auto loadResult =
Expand All @@ -279,7 +279,7 @@ class BucketIndexTest
{
auto searchableBL = getBM()
.getBucketSnapshotManager()
.copySearchableLiveBucketListSnapshot();
.copySearchableLiveBucketListSnapshot(true);
for (size_t i = 0; i < n; ++i)
{
LedgerKeySet searchSubset;
Expand Down Expand Up @@ -319,7 +319,7 @@ class BucketIndexTest
{
auto searchableBL = getBM()
.getBucketSnapshotManager()
.copySearchableLiveBucketListSnapshot();
.copySearchableLiveBucketListSnapshot(true);

// Load should return empty vector for keys not in bucket list
auto keysNotInBL =
Expand Down Expand Up @@ -496,7 +496,7 @@ class BucketIndexPoolShareTest : public BucketIndexTest
{
auto searchableBL = getBM()
.getBucketSnapshotManager()
.copySearchableLiveBucketListSnapshot();
.copySearchableLiveBucketListSnapshot(true);
auto loadResult =
searchableBL->loadPoolShareTrustLinesByAccountAndAsset(
mAccountToSearch.accountID, mAssetToSearch);
Expand Down
3 changes: 2 additions & 1 deletion src/bucket/test/BucketListTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1405,7 +1405,8 @@ TEST_CASE_VERSIONS("Searchable BucketListDB snapshots", "[bucketlist]")
entry.data.claimableBalance().amount = 0;

auto searchableBL =
bm.getBucketSnapshotManager().copySearchableLiveBucketListSnapshot();
bm.getBucketSnapshotManager().copySearchableLiveBucketListSnapshot(
true);

// Update entry every 5 ledgers so we can see bucket merge events
for (auto ledgerSeq = 1; ledgerSeq < 101; ++ledgerSeq)
Expand Down
7 changes: 6 additions & 1 deletion src/ledger/LedgerManagerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1258,10 +1258,12 @@ LedgerManagerImpl::getCurrentLedgerStateSnaphot()
{
if (!mReadOnlyLedgerStateSnapshot)
{
// Set autoUpdate to false to "freeze" the snapshot
// Update manually at the end of ledger close
mReadOnlyLedgerStateSnapshot =
mApp.getBucketManager()
.getBucketSnapshotManager()
.copySearchableLiveBucketListSnapshot();
.copySearchableLiveBucketListSnapshot(/* autoUpdate */ false);
}
return mReadOnlyLedgerStateSnapshot;
}
Expand Down Expand Up @@ -1296,6 +1298,9 @@ LedgerManagerImpl::advanceLedgerPointers(LedgerHeader const& header,
bm.getBucketSnapshotManager().updateCurrentSnapshot(
std::move(liveSnapshot), std::move(hotArchiveSnapshot));
}
// Manually refresh the snapshot now that apply is done
// This has to be done *after* snapshot manager updates current snapshot
getCurrentLedgerStateSnaphot()->updateSnapshotToLatest();
}

void
Expand Down
2 changes: 1 addition & 1 deletion src/ledger/LedgerTxn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3062,7 +3062,7 @@ LedgerTxnRoot::Impl::getSearchableLiveBucketListSnapshot() const
mSearchableBucketListSnapshot =
mApp.getBucketManager()
.getBucketSnapshotManager()
.copySearchableLiveBucketListSnapshot();
.copySearchableLiveBucketListSnapshot(/* autoUpdate */ true);
}

return *mSearchableBucketListSnapshot;
Expand Down
3 changes: 2 additions & 1 deletion src/main/QueryServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ QueryServer::QueryServer(const std::string& address, unsigned short port,
for (auto pid : workerPids)
{
mBucketListSnapshots[pid] = std::move(
bucketSnapshotManager.copySearchableLiveBucketListSnapshot());
bucketSnapshotManager.copySearchableLiveBucketListSnapshot(
/* autoUpdate */ true));
}
}

Expand Down

0 comments on commit 8922ba5

Please sign in to comment.