From 67d7623794216462e50ec5f4a8eb8db0ef892a48 Mon Sep 17 00:00:00 2001 From: Siying Dong Date: Wed, 29 Mar 2017 11:42:56 -0700 Subject: [PATCH] Expose the stalling information through DB::GetProperty() Summary: Add two DB properties: rocksdb.actual_delayed_write_rate and rocksdb.is_write_stooped, for people to know whether current writes are being throttled. Closes https://github.com/facebook/rocksdb/pull/2043 Differential Revision: D4782975 Pulled By: siying fbshipit-source-id: 6b2f5cf --- db/column_family_test.cc | 159 +++++++++++++++++++++------------------ db/db_impl.h | 2 + db/internal_stats.cc | 29 +++++++ db/internal_stats.h | 3 + db/write_controller.h | 1 - include/rocksdb/db.h | 9 +++ 6 files changed, 128 insertions(+), 75 deletions(-) diff --git a/db/column_family_test.cc b/db/column_family_test.cc index 5b898aea4..c2d16b66c 100644 --- a/db/column_family_test.cc +++ b/db/column_family_test.cc @@ -213,6 +213,30 @@ class ColumnFamilyTest : public testing::Test { #endif } + bool IsDbWriteStopped() { +#ifndef ROCKSDB_LITE + uint64_t v; + EXPECT_TRUE(dbfull()->GetIntProperty("rocksdb.is-write-stopped", &v)); + return (v == 1); +#else + return dbfull()->TEST_write_controler().IsStopped(); +#endif // !ROCKSDB_LITE + } + + uint64_t GetDbDelayedWriteRate() { +#ifndef ROCKSDB_LITE + uint64_t v; + EXPECT_TRUE( + dbfull()->GetIntProperty("rocksdb.actual-delayed-write-rate", &v)); + return v; +#else + if (!dbfull()->TEST_write_controler().NeedsDelay()) { + return 0; + } + return dbfull()->TEST_write_controler().delayed_write_rate(); +#endif // !ROCKSDB_LITE + } + void Destroy() { Close(); ASSERT_OK(DestroyDB(dbname_, Options(db_options_, column_family_options_))); @@ -2453,173 +2477,165 @@ TEST_F(ColumnFamilyTest, WriteStallSingleColumnFamily) { vstorage->TEST_set_estimated_compaction_needed_bytes(50); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); vstorage->TEST_set_estimated_compaction_needed_bytes(201); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate()); ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed()); vstorage->TEST_set_estimated_compaction_needed_bytes(400); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate()); ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed()); vstorage->TEST_set_estimated_compaction_needed_bytes(500); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25 / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25 / 1.25, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(450); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(205); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(202); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(201); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(198); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); vstorage->TEST_set_estimated_compaction_needed_bytes(399); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(599); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(2001); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed()); vstorage->TEST_set_estimated_compaction_needed_bytes(3001); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); vstorage->TEST_set_estimated_compaction_needed_bytes(390); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(100); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); vstorage->set_l0_delay_trigger_count(100); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate()); ASSERT_EQ(6, dbfull()->TEST_BGCompactionsAllowed()); vstorage->set_l0_delay_trigger_count(101); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate()); vstorage->set_l0_delay_trigger_count(0); vstorage->TEST_set_estimated_compaction_needed_bytes(300); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25 / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25 / 1.25, GetDbDelayedWriteRate()); vstorage->set_l0_delay_trigger_count(101); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25 / 1.25 / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25 / 1.25 / 1.25, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(200); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25 / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25 / 1.25, GetDbDelayedWriteRate()); vstorage->set_l0_delay_trigger_count(0); vstorage->TEST_set_estimated_compaction_needed_bytes(0); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); mutable_cf_options.disable_auto_compactions = true; dbfull()->TEST_write_controler().set_delayed_write_rate(kBaseRate); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); vstorage->set_l0_delay_trigger_count(50); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); + ASSERT_EQ(0, GetDbDelayedWriteRate()); ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); vstorage->set_l0_delay_trigger_count(60); vstorage->TEST_set_estimated_compaction_needed_bytes(300); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); + ASSERT_EQ(0, GetDbDelayedWriteRate()); ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); mutable_cf_options.disable_auto_compactions = false; vstorage->set_l0_delay_trigger_count(70); vstorage->TEST_set_estimated_compaction_needed_bytes(500); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate()); vstorage->set_l0_delay_trigger_count(71); vstorage->TEST_set_estimated_compaction_needed_bytes(501); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate()); } TEST_F(ColumnFamilyTest, CompactionSpeedupSingleColumnFamily) { @@ -2711,60 +2727,55 @@ TEST_F(ColumnFamilyTest, WriteStallTwoColumnFamilies) { vstorage->TEST_set_estimated_compaction_needed_bytes(50); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); vstorage1->TEST_set_estimated_compaction_needed_bytes(201); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(!dbfull()->TEST_write_controler().NeedsDelay()); vstorage1->TEST_set_estimated_compaction_needed_bytes(600); cfd1->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(70); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate, dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate, GetDbDelayedWriteRate()); vstorage1->TEST_set_estimated_compaction_needed_bytes(800); cfd1->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(300); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25 / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25 / 1.25, GetDbDelayedWriteRate()); vstorage1->TEST_set_estimated_compaction_needed_bytes(700); cfd1->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate()); vstorage->TEST_set_estimated_compaction_needed_bytes(500); cfd->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25 / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25 / 1.25, GetDbDelayedWriteRate()); vstorage1->TEST_set_estimated_compaction_needed_bytes(600); cfd1->RecalculateWriteStallConditions(mutable_cf_options); - ASSERT_TRUE(!dbfull()->TEST_write_controler().IsStopped()); + ASSERT_TRUE(!IsDbWriteStopped()); ASSERT_TRUE(dbfull()->TEST_write_controler().NeedsDelay()); - ASSERT_EQ(kBaseRate / 1.25, - dbfull()->TEST_write_controler().delayed_write_rate()); + ASSERT_EQ(kBaseRate / 1.25, GetDbDelayedWriteRate()); } TEST_F(ColumnFamilyTest, CompactionSpeedupTwoColumnFamilies) { diff --git a/db/db_impl.h b/db/db_impl.h index 7348607ed..0fa231d07 100644 --- a/db/db_impl.h +++ b/db/db_impl.h @@ -465,6 +465,8 @@ class DBImpl : public DB { return num_running_compactions_; } + const WriteController& write_controller() { return write_controller_; } + // hollow transactions shell used for recovery. // these will then be passed to TransactionDB so that // locks can be reacquired before writing can resume. diff --git a/db/internal_stats.cc b/db/internal_stats.cc index 79d4420c0..747bc8ecf 100644 --- a/db/internal_stats.cc +++ b/db/internal_stats.cc @@ -232,6 +232,9 @@ static const std::string aggregated_table_properties_at_level = aggregated_table_properties + "-at-level"; static const std::string num_running_compactions = "num-running-compactions"; static const std::string num_running_flushes = "num-running-flushes"; +static const std::string actual_delayed_write_rate = + "actual-delayed-write-rate"; +static const std::string is_write_stopped = "is-write-stopped"; const std::string DB::Properties::kNumFilesAtLevelPrefix = rocksdb_prefix + num_files_at_level_prefix; @@ -297,6 +300,10 @@ const std::string DB::Properties::kAggregatedTableProperties = rocksdb_prefix + aggregated_table_properties; const std::string DB::Properties::kAggregatedTablePropertiesAtLevel = rocksdb_prefix + aggregated_table_properties_at_level; +const std::string DB::Properties::kActualDelayedWriteRate = + rocksdb_prefix + actual_delayed_write_rate; +const std::string DB::Properties::kIsWriteStopped = + rocksdb_prefix + is_write_stopped; const std::unordered_map InternalStats::ppt_name_to_info = { @@ -385,6 +392,11 @@ const std::unordered_map {DB::Properties::kNumRunningCompactions, {false, nullptr, &InternalStats::HandleNumRunningCompactions, nullptr}}, + {DB::Properties::kActualDelayedWriteRate, + {false, nullptr, &InternalStats::HandleActualDelayedWriteRate, + nullptr}}, + {DB::Properties::kIsWriteStopped, + {false, nullptr, &InternalStats::HandleIsWriteStopped, nullptr}}, }; const DBPropertyInfo* GetPropertyInfo(const Slice& property) { @@ -716,6 +728,23 @@ bool InternalStats::HandleMinLogNumberToKeep(uint64_t* value, DBImpl* db, return true; } +bool InternalStats::HandleActualDelayedWriteRate(uint64_t* value, DBImpl* db, + Version* version) { + const WriteController& wc = db->write_controller(); + if (!wc.NeedsDelay()) { + *value = 0; + } else { + *value = wc.delayed_write_rate(); + } + return true; +} + +bool InternalStats::HandleIsWriteStopped(uint64_t* value, DBImpl* db, + Version* version) { + *value = db->write_controller().IsStopped() ? 1 : 0; + return true; +} + void InternalStats::DumpDBStats(std::string* value) { char buf[1000]; // DB-level stats, only available from default column family diff --git a/db/internal_stats.h b/db/internal_stats.h index d97069e3f..92fccb0a0 100644 --- a/db/internal_stats.h +++ b/db/internal_stats.h @@ -402,6 +402,9 @@ class InternalStats { bool HandleEstimateLiveDataSize(uint64_t* value, DBImpl* db, Version* version); bool HandleMinLogNumberToKeep(uint64_t* value, DBImpl* db, Version* version); + bool HandleActualDelayedWriteRate(uint64_t* value, DBImpl* db, + Version* version); + bool HandleIsWriteStopped(uint64_t* value, DBImpl* db, Version* version); // Total number of background errors encountered. Every time a flush task // or compaction task fails, this counter is incremented. The failure can diff --git a/db/write_controller.h b/db/write_controller.h index b3f6ba8c7..43574de7d 100644 --- a/db/write_controller.h +++ b/db/write_controller.h @@ -81,7 +81,6 @@ class WriteController { private: uint64_t NowMicrosMonotonic(Env* env); - private: friend class WriteControllerToken; friend class StopWriteToken; friend class DelayWriteToken; diff --git a/include/rocksdb/db.h b/include/rocksdb/db.h index e5791fbc6..550b35135 100644 --- a/include/rocksdb/db.h +++ b/include/rocksdb/db.h @@ -539,6 +539,13 @@ class DB { // one but only returns the aggregated table properties of the // specified level "N" at the target column family. static const std::string kAggregatedTablePropertiesAtLevel; + + // "rocksdb.actual-delayed-write-rate" - returns the current actual delayed + // write rate. 0 means no delay. + static const std::string kActualDelayedWriteRate; + + // "rocksdb.is-write-stopped" - Return 1 if write has been stopped. + static const std::string kIsWriteStopped; }; #endif /* ROCKSDB_LITE */ @@ -587,6 +594,8 @@ class DB { // "rocksdb.estimate-pending-compaction-bytes" // "rocksdb.num-running-compactions" // "rocksdb.num-running-flushes" + // "rocksdb.actual-delayed-write-rate" + // "rocksdb.is-write-stopped" virtual bool GetIntProperty(ColumnFamilyHandle* column_family, const Slice& property, uint64_t* value) = 0; virtual bool GetIntProperty(const Slice& property, uint64_t* value) {