Skip to content

Commit 43810fe

Browse files
authored
Support SuperSnapshots in one more variant of MultiGet (#296)
This PR contains a couple of improvements to SuperSnapshots implementation, the major one being support for one more variant of MultiGet (there are three total, we now support two).
1 parent 68c758a commit 43810fe

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

cloud/replication_test.cc

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,13 +1315,15 @@ TEST_F(ReplicationTest, SuperSnapshot) {
13151315
ASSERT_OK(follower->Get(ro, "k1", &val));
13161316
EXPECT_EQ(val, "v1");
13171317

1318-
auto iter = follower->NewIterator(ro, follower->DefaultColumnFamily());
1318+
auto iter = std::unique_ptr<rocksdb::Iterator>(
1319+
follower->NewIterator(ro, follower->DefaultColumnFamily()));
13191320
iter->SeekToFirst();
13201321
EXPECT_TRUE(iter->Valid());
13211322
EXPECT_EQ(iter->key(), "k1");
13221323
EXPECT_EQ(iter->value(), "v1");
13231324
iter->Next();
13241325
EXPECT_FALSE(iter->Valid());
1326+
iter.reset();
13251327

13261328
ro.snapshot = nullptr;
13271329
ASSERT_OK(follower->Get(ro, followerCF("cf1"), "cf1k1", &val));
@@ -1339,19 +1341,33 @@ TEST_F(ReplicationTest, SuperSnapshot) {
13391341
cfs.push_back(followerCF("cf1"));
13401342
std::vector<std::string> vals;
13411343

1344+
// Multiget on cf1, snapshot
1345+
ro.snapshot = snapshots[1];
13421346
auto statuses = follower->MultiGet(ro, cfs, keys, &vals);
13431347
ASSERT_OK(statuses[0]);
13441348
ASSERT_TRUE(statuses[1].IsNotFound());
13451349
ASSERT_EQ(vals[0], "cf1v1");
13461350

1351+
// Multiget on cf1, no snapshot
13471352
ro.snapshot = nullptr;
13481353
statuses = follower->MultiGet(ro, cfs, keys, &vals);
13491354
ASSERT_OK(statuses[0]);
13501355
ASSERT_TRUE(statuses[1].IsNotFound());
13511356
ASSERT_EQ(vals[0], "cf1v2");
13521357

1353-
// Column family <-> snapshot mismatch
1358+
// Multiget on default column family, snapshot, pinnable values
13541359
ro.snapshot = snapshots[0];
1360+
keys[0] = "k1";
1361+
std::vector<PinnableSlice> pinnableValues;
1362+
pinnableValues.resize(2);
1363+
follower->MultiGet(ro, follower->DefaultColumnFamily(), 2,
1364+
keys.data(), pinnableValues.data(), statuses.data(), true);
1365+
ASSERT_OK(statuses[0]);
1366+
ASSERT_TRUE(statuses[1].IsNotFound());
1367+
ASSERT_EQ(pinnableValues[0], "v1");
1368+
pinnableValues.clear();
1369+
1370+
// Column family <-> snapshot mismatch
13551371
ASSERT_FALSE(follower->Get(ro, followerCF("cf1"), "cf1k1", &val).ok());
13561372

13571373
follower->ReleaseSnapshot(snapshots[0]);

db/db_impl/db_impl.cc

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3139,8 +3139,9 @@ void DBImpl::MultiGet(const ReadOptions& read_options, const size_t num_keys,
31393139
if (dynamic_cast<const SuperSnapshotImpl*>(read_options.snapshot)) {
31403140
for (size_t i = 0; i < num_keys; ++i) {
31413141
statuses[i] = Status::NotSupported(
3142-
"MultiGet with timestamps does not support super snapshot");
3142+
"This variant of MultiGet does not yet support super snapshots");
31433143
}
3144+
return;
31443145
}
31453146
// RocksDB-Cloud contribution end
31463147

@@ -3400,8 +3401,12 @@ void DBImpl::MultiGetWithCallback(
34003401
multiget_cf_data[0].super_version, consistent_seqnum,
34013402
read_callback);
34023403
assert(s.ok() || s.IsTimedOut() || s.IsAborted());
3403-
ReturnAndCleanupSuperVersion(multiget_cf_data[0].cfd,
3404-
multiget_cf_data[0].super_version);
3404+
// RocksDB-Cloud contribution begin
3405+
if (!dynamic_cast<const SuperSnapshotImpl*>(read_options.snapshot)) {
3406+
ReturnAndCleanupSuperVersion(multiget_cf_data[0].cfd,
3407+
multiget_cf_data[0].super_version);
3408+
}
3409+
// RocksDB-Cloud contribution end
34053410
}
34063411

34073412
// The actual implementation of batched MultiGet. Parameters -
@@ -3844,10 +3849,12 @@ Iterator* DBImpl::NewIterator(const ReadOptions& read_options,
38443849
result = nullptr;
38453850

38463851
#else
3852+
// RocksDB-Cloud contribution begin
38473853
if (dynamic_cast<const SuperSnapshotImpl*>(read_options.snapshot)) {
38483854
return NewErrorIterator(Status::NotSupported(
38493855
"Tailing iterator not supported with super snapshot"));
38503856
}
3857+
// RocksDB-Cloud contribution end
38513858

38523859
SuperVersion* sv = cfd->GetReferencedSuperVersion(this);
38533860
auto iter = new ForwardIterator(this, read_options, cfd, sv,
@@ -4077,6 +4084,8 @@ Status DBImpl::GetSuperSnapshots(
40774084
return Status::InvalidArgument(
40784085
"GetSuperSnapshots only supported in RocksDB compiled with USE_RTTI=1");
40794086
#endif
4087+
InstrumentedMutexLock l(&mutex_);
4088+
40804089
if (!is_snapshot_supported_) {
40814090
return Status::InvalidArgument("Snapshot not supported");
40824091
}
@@ -4092,7 +4101,8 @@ Status DBImpl::GetSuperSnapshots(
40924101
for (auto& cf : column_families) {
40934102
auto cfh = static_cast_with_check<ColumnFamilyHandleImpl>(cf);
40944103
auto cfd = cfh->cfd();
4095-
auto sv = cfd->GetReferencedSuperVersion(this);
4104+
auto sv = cfd->GetSuperVersion();
4105+
sv->Ref();
40964106
auto ss = new SuperSnapshotImpl(cfd, sv);
40974107
snapshots_.New(ss, snapshot_seq, unix_time,
40984108
/*is_write_conflict_boundary=*/false);

0 commit comments

Comments
 (0)