Add oldest snapshot sequence property (#6228)

Summary:
Add oldest snapshot sequence property, so we can use `db.GetProperty("rocksdb.oldest-snapshot-sequence")` to get the sequence number of the oldest snapshot.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6228

Differential Revision: D19264145

Pulled By: maysamyabandeh

fbshipit-source-id: 67fbe5304d89cbc475bd404e30d1299f7b11c010
main
Connor1996 5 years ago committed by Facebook Github Bot
parent 1aaa145877
commit 3e26a94ba1
  1. 6
      db/db_basic_test.cc
  2. 6
      db/db_test.cc
  3. 7
      db/db_test_util.cc
  4. 2
      db/db_test_util.h
  5. 12
      db/internal_stats.cc
  6. 2
      db/internal_stats.h
  7. 8
      db/snapshot_impl.h
  8. 4
      include/rocksdb/db.h

@ -524,6 +524,7 @@ TEST_F(DBBasicTest, Snapshot) {
ASSERT_EQ(1U, GetNumSnapshots()); ASSERT_EQ(1U, GetNumSnapshots());
uint64_t time_snap1 = GetTimeOldestSnapshots(); uint64_t time_snap1 = GetTimeOldestSnapshots();
ASSERT_GT(time_snap1, 0U); ASSERT_GT(time_snap1, 0U);
ASSERT_EQ(GetSequenceOldestSnapshots(), s1->GetSequenceNumber());
Put(0, "foo", "0v2"); Put(0, "foo", "0v2");
Put(1, "foo", "1v2"); Put(1, "foo", "1v2");
@ -532,6 +533,7 @@ TEST_F(DBBasicTest, Snapshot) {
const Snapshot* s2 = db_->GetSnapshot(); const Snapshot* s2 = db_->GetSnapshot();
ASSERT_EQ(2U, GetNumSnapshots()); ASSERT_EQ(2U, GetNumSnapshots());
ASSERT_EQ(time_snap1, GetTimeOldestSnapshots()); ASSERT_EQ(time_snap1, GetTimeOldestSnapshots());
ASSERT_EQ(GetSequenceOldestSnapshots(), s1->GetSequenceNumber());
Put(0, "foo", "0v3"); Put(0, "foo", "0v3");
Put(1, "foo", "1v3"); Put(1, "foo", "1v3");
@ -539,6 +541,7 @@ TEST_F(DBBasicTest, Snapshot) {
ManagedSnapshot s3(db_); ManagedSnapshot s3(db_);
ASSERT_EQ(3U, GetNumSnapshots()); ASSERT_EQ(3U, GetNumSnapshots());
ASSERT_EQ(time_snap1, GetTimeOldestSnapshots()); ASSERT_EQ(time_snap1, GetTimeOldestSnapshots());
ASSERT_EQ(GetSequenceOldestSnapshots(), s1->GetSequenceNumber());
Put(0, "foo", "0v4"); Put(0, "foo", "0v4");
Put(1, "foo", "1v4"); Put(1, "foo", "1v4");
@ -554,6 +557,7 @@ TEST_F(DBBasicTest, Snapshot) {
ASSERT_EQ(2U, GetNumSnapshots()); ASSERT_EQ(2U, GetNumSnapshots());
ASSERT_EQ(time_snap1, GetTimeOldestSnapshots()); ASSERT_EQ(time_snap1, GetTimeOldestSnapshots());
ASSERT_EQ(GetSequenceOldestSnapshots(), s1->GetSequenceNumber());
ASSERT_EQ("0v1", Get(0, "foo", s1)); ASSERT_EQ("0v1", Get(0, "foo", s1));
ASSERT_EQ("1v1", Get(1, "foo", s1)); ASSERT_EQ("1v1", Get(1, "foo", s1));
ASSERT_EQ("0v2", Get(0, "foo", s2)); ASSERT_EQ("0v2", Get(0, "foo", s2));
@ -568,9 +572,11 @@ TEST_F(DBBasicTest, Snapshot) {
ASSERT_EQ("1v4", Get(1, "foo")); ASSERT_EQ("1v4", Get(1, "foo"));
ASSERT_EQ(1U, GetNumSnapshots()); ASSERT_EQ(1U, GetNumSnapshots());
ASSERT_LT(time_snap1, GetTimeOldestSnapshots()); ASSERT_LT(time_snap1, GetTimeOldestSnapshots());
ASSERT_EQ(GetSequenceOldestSnapshots(), s2->GetSequenceNumber());
db_->ReleaseSnapshot(s2); db_->ReleaseSnapshot(s2);
ASSERT_EQ(0U, GetNumSnapshots()); ASSERT_EQ(0U, GetNumSnapshots());
ASSERT_EQ(GetSequenceOldestSnapshots(), 0);
ASSERT_EQ("0v4", Get(0, "foo")); ASSERT_EQ("0v4", Get(0, "foo"));
ASSERT_EQ("1v4", Get(1, "foo")); ASSERT_EQ("1v4", Get(1, "foo"));
} while (ChangeOptions()); } while (ChangeOptions());

@ -1705,6 +1705,7 @@ TEST_F(DBTest, Snapshot) {
ASSERT_EQ(1U, GetNumSnapshots()); ASSERT_EQ(1U, GetNumSnapshots());
uint64_t time_snap1 = GetTimeOldestSnapshots(); uint64_t time_snap1 = GetTimeOldestSnapshots();
ASSERT_GT(time_snap1, 0U); ASSERT_GT(time_snap1, 0U);
ASSERT_EQ(GetSequenceOldestSnapshots(), s1->GetSequenceNumber());
Put(0, "foo", "0v2"); Put(0, "foo", "0v2");
Put(1, "foo", "1v2"); Put(1, "foo", "1v2");
@ -1713,6 +1714,7 @@ TEST_F(DBTest, Snapshot) {
const Snapshot* s2 = db_->GetSnapshot(); const Snapshot* s2 = db_->GetSnapshot();
ASSERT_EQ(2U, GetNumSnapshots()); ASSERT_EQ(2U, GetNumSnapshots());
ASSERT_EQ(time_snap1, GetTimeOldestSnapshots()); ASSERT_EQ(time_snap1, GetTimeOldestSnapshots());
ASSERT_EQ(GetSequenceOldestSnapshots(), s1->GetSequenceNumber());
Put(0, "foo", "0v3"); Put(0, "foo", "0v3");
Put(1, "foo", "1v3"); Put(1, "foo", "1v3");
@ -1720,6 +1722,7 @@ TEST_F(DBTest, Snapshot) {
ManagedSnapshot s3(db_); ManagedSnapshot s3(db_);
ASSERT_EQ(3U, GetNumSnapshots()); ASSERT_EQ(3U, GetNumSnapshots());
ASSERT_EQ(time_snap1, GetTimeOldestSnapshots()); ASSERT_EQ(time_snap1, GetTimeOldestSnapshots());
ASSERT_EQ(GetSequenceOldestSnapshots(), s1->GetSequenceNumber());
Put(0, "foo", "0v4"); Put(0, "foo", "0v4");
Put(1, "foo", "1v4"); Put(1, "foo", "1v4");
@ -1735,6 +1738,7 @@ TEST_F(DBTest, Snapshot) {
ASSERT_EQ(2U, GetNumSnapshots()); ASSERT_EQ(2U, GetNumSnapshots());
ASSERT_EQ(time_snap1, GetTimeOldestSnapshots()); ASSERT_EQ(time_snap1, GetTimeOldestSnapshots());
ASSERT_EQ(GetSequenceOldestSnapshots(), s1->GetSequenceNumber());
ASSERT_EQ("0v1", Get(0, "foo", s1)); ASSERT_EQ("0v1", Get(0, "foo", s1));
ASSERT_EQ("1v1", Get(1, "foo", s1)); ASSERT_EQ("1v1", Get(1, "foo", s1));
ASSERT_EQ("0v2", Get(0, "foo", s2)); ASSERT_EQ("0v2", Get(0, "foo", s2));
@ -1749,9 +1753,11 @@ TEST_F(DBTest, Snapshot) {
ASSERT_EQ("1v4", Get(1, "foo")); ASSERT_EQ("1v4", Get(1, "foo"));
ASSERT_EQ(1U, GetNumSnapshots()); ASSERT_EQ(1U, GetNumSnapshots());
ASSERT_LT(time_snap1, GetTimeOldestSnapshots()); ASSERT_LT(time_snap1, GetTimeOldestSnapshots());
ASSERT_EQ(GetSequenceOldestSnapshots(), s2->GetSequenceNumber());
db_->ReleaseSnapshot(s2); db_->ReleaseSnapshot(s2);
ASSERT_EQ(0U, GetNumSnapshots()); ASSERT_EQ(0U, GetNumSnapshots());
ASSERT_EQ(GetSequenceOldestSnapshots(), 0);
ASSERT_EQ("0v4", Get(0, "foo")); ASSERT_EQ("0v4", Get(0, "foo"));
ASSERT_EQ("1v4", Get(1, "foo")); ASSERT_EQ("1v4", Get(1, "foo"));
} while (ChangeOptions()); } while (ChangeOptions());

@ -867,6 +867,13 @@ uint64_t DBTestBase::GetTimeOldestSnapshots() {
return int_num; return int_num;
} }
uint64_t DBTestBase::GetSequenceOldestSnapshots() {
uint64_t int_num;
EXPECT_TRUE(
dbfull()->GetIntProperty("rocksdb.oldest-snapshot-sequence", &int_num));
return int_num;
}
// Return a string that contains all key,value pairs in order, // Return a string that contains all key,value pairs in order,
// formatted like "(k1->v1)(k2->v2)". // formatted like "(k1->v1)(k2->v2)".
std::string DBTestBase::Contents(int cf) { std::string DBTestBase::Contents(int cf) {

@ -860,6 +860,8 @@ class DBTestBase : public testing::Test {
uint64_t GetTimeOldestSnapshots(); uint64_t GetTimeOldestSnapshots();
uint64_t GetSequenceOldestSnapshots();
// Return a string that contains all key,value pairs in order, // Return a string that contains all key,value pairs in order,
// formatted like "(k1->v1)(k2->v2)". // formatted like "(k1->v1)(k2->v2)".
std::string Contents(int cf = 0); std::string Contents(int cf = 0);

@ -231,6 +231,7 @@ static const std::string is_file_deletions_enabled =
"is-file-deletions-enabled"; "is-file-deletions-enabled";
static const std::string num_snapshots = "num-snapshots"; static const std::string num_snapshots = "num-snapshots";
static const std::string oldest_snapshot_time = "oldest-snapshot-time"; static const std::string oldest_snapshot_time = "oldest-snapshot-time";
static const std::string oldest_snapshot_sequence = "oldest-snapshot-sequence";
static const std::string num_live_versions = "num-live-versions"; static const std::string num_live_versions = "num-live-versions";
static const std::string current_version_number = static const std::string current_version_number =
"current-super-version-number"; "current-super-version-number";
@ -309,6 +310,8 @@ const std::string DB::Properties::kNumSnapshots =
rocksdb_prefix + num_snapshots; rocksdb_prefix + num_snapshots;
const std::string DB::Properties::kOldestSnapshotTime = const std::string DB::Properties::kOldestSnapshotTime =
rocksdb_prefix + oldest_snapshot_time; rocksdb_prefix + oldest_snapshot_time;
const std::string DB::Properties::kOldestSnapshotSequence =
rocksdb_prefix + oldest_snapshot_sequence;
const std::string DB::Properties::kNumLiveVersions = const std::string DB::Properties::kNumLiveVersions =
rocksdb_prefix + num_live_versions; rocksdb_prefix + num_live_versions;
const std::string DB::Properties::kCurrentSuperVersionNumber = const std::string DB::Properties::kCurrentSuperVersionNumber =
@ -427,6 +430,9 @@ const std::unordered_map<std::string, DBPropertyInfo>
{DB::Properties::kOldestSnapshotTime, {DB::Properties::kOldestSnapshotTime,
{false, nullptr, &InternalStats::HandleOldestSnapshotTime, nullptr, {false, nullptr, &InternalStats::HandleOldestSnapshotTime, nullptr,
nullptr}}, nullptr}},
{DB::Properties::kOldestSnapshotSequence,
{false, nullptr, &InternalStats::HandleOldestSnapshotSequence, nullptr,
nullptr}},
{DB::Properties::kNumLiveVersions, {DB::Properties::kNumLiveVersions,
{false, nullptr, &InternalStats::HandleNumLiveVersions, nullptr, {false, nullptr, &InternalStats::HandleNumLiveVersions, nullptr,
nullptr}}, nullptr}},
@ -772,6 +778,12 @@ bool InternalStats::HandleOldestSnapshotTime(uint64_t* value, DBImpl* db,
return true; return true;
} }
bool InternalStats::HandleOldestSnapshotSequence(uint64_t* value, DBImpl* db,
Version* /*version*/) {
*value = static_cast<uint64_t>(db->snapshots().GetOldestSnapshotSequence());
return true;
}
bool InternalStats::HandleNumLiveVersions(uint64_t* value, DBImpl* /*db*/, bool InternalStats::HandleNumLiveVersions(uint64_t* value, DBImpl* /*db*/,
Version* /*version*/) { Version* /*version*/) {
*value = cfd_->GetNumLiveVersions(); *value = cfd_->GetNumLiveVersions();

@ -553,6 +553,8 @@ class InternalStats {
bool HandleEstimateNumKeys(uint64_t* value, DBImpl* db, Version* version); bool HandleEstimateNumKeys(uint64_t* value, DBImpl* db, Version* version);
bool HandleNumSnapshots(uint64_t* value, DBImpl* db, Version* version); bool HandleNumSnapshots(uint64_t* value, DBImpl* db, Version* version);
bool HandleOldestSnapshotTime(uint64_t* value, DBImpl* db, Version* version); bool HandleOldestSnapshotTime(uint64_t* value, DBImpl* db, Version* version);
bool HandleOldestSnapshotSequence(uint64_t* value, DBImpl* db,
Version* version);
bool HandleNumLiveVersions(uint64_t* value, DBImpl* db, Version* version); bool HandleNumLiveVersions(uint64_t* value, DBImpl* db, Version* version);
bool HandleCurrentSuperVersionNumber(uint64_t* value, DBImpl* db, bool HandleCurrentSuperVersionNumber(uint64_t* value, DBImpl* db,
Version* version); Version* version);

@ -148,6 +148,14 @@ class SnapshotList {
} }
} }
int64_t GetOldestSnapshotSequence() const {
if (empty()) {
return 0;
} else {
return oldest()->GetSequenceNumber();
}
}
uint64_t count() const { return count_; } uint64_t count() const { return count_; }
private: private:

@ -716,6 +716,10 @@ class DB {
// timestamp of oldest unreleased snapshot. // timestamp of oldest unreleased snapshot.
static const std::string kOldestSnapshotTime; static const std::string kOldestSnapshotTime;
// "rocksdb.oldest-snapshot-sequence" - returns number representing
// sequence number of oldest unreleased snapshot.
static const std::string kOldestSnapshotSequence;
// "rocksdb.num-live-versions" - returns number of live versions. `Version` // "rocksdb.num-live-versions" - returns number of live versions. `Version`
// is an internal data structure. See version_set.h for details. More // is an internal data structure. See version_set.h for details. More
// live versions often mean more SST files are held from being deleted, // live versions often mean more SST files are held from being deleted,

Loading…
Cancel
Save