diff --git a/db/db_impl.cc b/db/db_impl.cc index dc90ccec2..6dd77447f 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -877,6 +877,10 @@ Status DBImpl::Flush(const FlushOptions& options) { return status; } +SequenceNumber DBImpl::GetLatestSequenceNumber() { + return versions_->LastSequence(); +} + Status DBImpl::GetUpdatesSince(SequenceNumber seq, TransactionLogIterator** iter) { diff --git a/db/db_impl.h b/db/db_impl.h index 78bb0f699..efbf5ef64 100644 --- a/db/db_impl.h +++ b/db/db_impl.h @@ -55,6 +55,7 @@ class DBImpl : public DB { virtual Status EnableFileDeletions(); virtual Status GetLiveFiles(std::vector&, uint64_t* manifest_file_size); + virtual SequenceNumber GetLatestSequenceNumber(); virtual Status GetUpdatesSince(SequenceNumber seq_number, TransactionLogIterator ** iter); diff --git a/db/db_test.cc b/db/db_test.cc index d67e84827..e3e5ccd5e 100644 --- a/db/db_test.cc +++ b/db/db_test.cc @@ -2273,6 +2273,7 @@ TEST(DBTest, TransactionLogIterator) { Put("key1", value); Put("key2", value); Put("key2", value); + ASSERT_EQ(dbfull()->GetLatestSequenceNumber(), 3U); { TransactionLogIterator* iter; Status status = dbfull()->GetUpdatesSince(0, &iter); @@ -2583,6 +2584,9 @@ class ModelDB: public DB { return Status::OK(); } + virtual SequenceNumber GetLatestSequenceNumber() { + return 0; + } virtual Status GetUpdatesSince(leveldb::SequenceNumber, leveldb::TransactionLogIterator**) { return Status::NotSupported("Not supported in Model DB"); diff --git a/include/leveldb/db.h b/include/leveldb/db.h index fb691b49b..2cfa53718 100644 --- a/include/leveldb/db.h +++ b/include/leveldb/db.h @@ -182,6 +182,9 @@ class DB { virtual Status GetLiveFiles(std::vector&, uint64_t* manifest_file_size) = 0; + // The sequence number of the most recent transaction. + virtual SequenceNumber GetLatestSequenceNumber() = 0; + // Return's an iterator for all writes since the sequence number // Status::ok if iterator is valid. // The iterator internally holds references to the available log files.