Skip to content

Commit 587e968

Browse files
authored
Allow snapshot sequence retrieval from db iterator (#285)
This commit adds utility to DB to extract a sequence number from a passed in iterator, if possible.
1 parent 8dc6a23 commit 587e968

File tree

8 files changed

+55
-0
lines changed

8 files changed

+55
-0
lines changed

db/arena_wrapped_db_iter.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ class ArenaWrappedDBIter : public Iterator {
9999
expose_blob_index_ = expose_blob_index;
100100
}
101101

102+
SequenceNumber get_sequence() const {
103+
if (!db_iter_) {
104+
return SequenceNumber(0);
105+
}
106+
return db_iter_->get_sequence();
107+
}
108+
102109
private:
103110
DBIter* db_iter_ = nullptr;
104111
Arena arena_;

db/db_impl/db_impl.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4086,6 +4086,14 @@ Status DBImpl::NewIterators(
40864086
return Status::OK();
40874087
}
40884088

4089+
SequenceNumber DBImpl::GetIteratorSequenceNumber(Iterator* it) {
4090+
auto arena_wrapped = dynamic_cast<ArenaWrappedDBIter*>(it);
4091+
if (!arena_wrapped) {
4092+
return SequenceNumber(0);
4093+
}
4094+
return arena_wrapped->get_sequence();
4095+
}
4096+
40894097
const Snapshot* DBImpl::GetSnapshot() { return GetSnapshotImpl(false); }
40904098

40914099
#ifndef ROCKSDB_LITE

db/db_impl/db_impl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,8 @@ class DBImpl : public DB {
342342
const std::vector<ColumnFamilyHandle*>& column_families,
343343
std::vector<Iterator*>* iterators) override;
344344

345+
SequenceNumber GetIteratorSequenceNumber(Iterator* it) override;
346+
345347
virtual const Snapshot* GetSnapshot() override;
346348
virtual void ReleaseSnapshot(const Snapshot* snapshot) override;
347349
// Create a timestamped snapshot. This snapshot can be shared by multiple

db/db_iter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,8 @@ class DBIter final : public Iterator {
210210
read_callback_->Refresh(s);
211211
}
212212
}
213+
SequenceNumber get_sequence() const { return sequence_; }
214+
213215
void set_valid(bool v) { valid_ = v; }
214216

215217
private:

db/db_iterator_test.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,8 +815,28 @@ TEST_P(DBIteratorTest, IterWithSnapshot) {
815815
ASSERT_TRUE(!iter->Valid());
816816
}
817817
}
818+
819+
// Check that creating a new iterator snapshot has an increasing and
820+
// different sequence number.
821+
const Snapshot* snapshot2 = db_->GetSnapshot();
822+
ReadOptions options2;
823+
options.snapshot = snapshot2;
824+
Iterator* iter2 = NewIterator(options2, handles_[1]);
825+
ASSERT_GT(db_->GetIteratorSequenceNumber(iter2),
826+
db_->GetIteratorSequenceNumber(iter));
827+
828+
// Now check only the new iterator has the value added after the initial
829+
// snapshot.
830+
iter->Seek("key0");
831+
ASSERT_TRUE(!iter->Valid() || iter->key() != "key0");
832+
833+
iter2->Seek("key0");
834+
ASSERT_EQ(IterStatus(iter2), "key0->val0");
835+
818836
db_->ReleaseSnapshot(snapshot);
837+
db_->ReleaseSnapshot(snapshot2);
819838
delete iter;
839+
delete iter2;
820840
} while (ChangeOptions());
821841
}
822842

db/db_test.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3183,6 +3183,13 @@ class ModelDB : public DB {
31833183
std::vector<Iterator*>* /*iterators*/) override {
31843184
return Status::NotSupported("Not supported yet");
31853185
}
3186+
3187+
SequenceNumber GetIteratorSequenceNumber(Iterator*) override {
3188+
// No support yet.
3189+
assert(false);
3190+
return 0;
3191+
}
3192+
31863193
const Snapshot* GetSnapshot() override {
31873194
ModelSnapshot* snapshot = new ModelSnapshot;
31883195
snapshot->map_ = map_;

include/rocksdb/db.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,9 @@ class DB {
836836
const std::vector<ColumnFamilyHandle*>& column_families,
837837
std::vector<Iterator*>* iterators) = 0;
838838

839+
// Returns the iterator sequence number
840+
virtual SequenceNumber GetIteratorSequenceNumber(Iterator* it) = 0;
841+
839842
// Return a handle to the current DB state. Iterators created with
840843
// this handle will all observe a stable snapshot of the current DB
841844
// state. The caller must call ReleaseSnapshot(result) when the

include/rocksdb/utilities/stackable_db.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,12 @@ class StackableDB : public DB {
237237
return db_->NewIterators(options, column_families, iterators);
238238
}
239239

240+
using DB::GetIteratorSequenceNumber;
241+
virtual SequenceNumber GetIteratorSequenceNumber(
242+
Iterator* iterator) override {
243+
return db_->GetIteratorSequenceNumber(iterator);
244+
}
245+
240246
virtual const Snapshot* GetSnapshot() override { return db_->GetSnapshot(); }
241247

242248
virtual void ReleaseSnapshot(const Snapshot* snapshot) override {

0 commit comments

Comments
 (0)