Skip to content

Commit 712f3f3

Browse files
committed
Fix undefined behavior in BucketSnapshotManager
1 parent 90ba4a6 commit 712f3f3

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

src/bucket/BucketSnapshotManager.cpp

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,24 @@ BucketSnapshotManager::BucketSnapshotManager(
5555
SearchableSnapshotConstPtr
5656
BucketSnapshotManager::copySearchableLiveBucketListSnapshot() const
5757
{
58-
// SharedLockShared guard(mSnapshotMutex);
58+
SharedLockShared guard(mSnapshotMutex);
59+
// Can't use std::make_shared due to private constructor
60+
return copySearchableLiveBucketListSnapshot(guard);
61+
}
62+
63+
SearchableHotArchiveSnapshotConstPtr
64+
BucketSnapshotManager::copySearchableHotArchiveBucketListSnapshot() const
65+
{
66+
SharedLockShared guard(mSnapshotMutex);
67+
releaseAssert(mCurrHotArchiveSnapshot);
68+
// Can't use std::make_shared due to private constructor
69+
return copySearchableHotArchiveBucketListSnapshot(guard);
70+
}
71+
72+
SearchableSnapshotConstPtr
73+
BucketSnapshotManager::copySearchableLiveBucketListSnapshot(
74+
SharedLockShared const& guard) const
75+
{
5976
// Can't use std::make_shared due to private constructor
6077
return std::shared_ptr<SearchableLiveBucketListSnapshot>(
6178
new SearchableLiveBucketListSnapshot(
@@ -66,9 +83,9 @@ BucketSnapshotManager::copySearchableLiveBucketListSnapshot() const
6683
}
6784

6885
SearchableHotArchiveSnapshotConstPtr
69-
BucketSnapshotManager::copySearchableHotArchiveBucketListSnapshot() const
86+
BucketSnapshotManager::copySearchableHotArchiveBucketListSnapshot(
87+
SharedLockShared const& guard) const
7088
{
71-
// SharedLockShared guard(mSnapshotMutex);
7289
releaseAssert(mCurrHotArchiveSnapshot);
7390
// Can't use std::make_shared due to private constructor
7491
return std::shared_ptr<SearchableHotArchiveBucketListSnapshot>(
@@ -90,7 +107,7 @@ BucketSnapshotManager::maybeCopySearchableBucketListSnapshot(
90107
if (!snapshot ||
91108
snapshot->getLedgerSeq() < mCurrLiveSnapshot->getLedgerSeq())
92109
{
93-
snapshot = copySearchableLiveBucketListSnapshot();
110+
snapshot = copySearchableLiveBucketListSnapshot(guard);
94111
}
95112
}
96113

@@ -106,7 +123,7 @@ BucketSnapshotManager::maybeCopySearchableHotArchiveBucketListSnapshot(
106123
if (!snapshot ||
107124
snapshot->getLedgerSeq() < mCurrHotArchiveSnapshot->getLedgerSeq())
108125
{
109-
snapshot = copySearchableHotArchiveBucketListSnapshot();
126+
snapshot = copySearchableHotArchiveBucketListSnapshot(guard);
110127
}
111128
}
112129

src/bucket/BucketSnapshotManager.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,18 @@ class BucketSnapshotManager : NonMovableOrCopyable
8888
copySearchableHotArchiveBucketListSnapshot() const
8989
LOCKS_EXCLUDED(mSnapshotMutex);
9090

91+
// Copy the most recent snapshot for the live bucket list, while holding the
92+
// lock
93+
SearchableSnapshotConstPtr
94+
copySearchableLiveBucketListSnapshot(SharedLockShared const& guard) const
95+
REQUIRES_SHARED(mSnapshotMutex);
96+
97+
// Copy the most recent snapshot for the hot archive bucket list, while
98+
// holding the lock
99+
SearchableHotArchiveSnapshotConstPtr
100+
copySearchableHotArchiveBucketListSnapshot(
101+
SharedLockShared const& guard) const REQUIRES_SHARED(mSnapshotMutex);
102+
91103
// `maybeCopy` interface refreshes `snapshot` if a newer snapshot is
92104
// available. It's a no-op otherwise. This is useful to avoid unnecessary
93105
// copying.

src/bucket/SearchableBucketList.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ class SearchableLiveBucketListSnapshot
3636
StateArchivalSettings const& sas, uint32_t ledgerVers) const;
3737

3838
friend SearchableSnapshotConstPtr
39-
BucketSnapshotManager::copySearchableLiveBucketListSnapshot() const;
39+
BucketSnapshotManager::copySearchableLiveBucketListSnapshot(
40+
SharedLockShared const& guard) const;
4041
};
4142

4243
class SearchableHotArchiveBucketListSnapshot
@@ -54,6 +55,7 @@ class SearchableHotArchiveBucketListSnapshot
5455
loadKeys(std::set<LedgerKey, LedgerEntryIdCmp> const& inKeys) const;
5556

5657
friend SearchableHotArchiveSnapshotConstPtr
57-
BucketSnapshotManager::copySearchableHotArchiveBucketListSnapshot() const;
58+
BucketSnapshotManager::copySearchableHotArchiveBucketListSnapshot(
59+
SharedLockShared const& guard) const;
5860
};
5961
}

0 commit comments

Comments
 (0)