Add DB:ResetStats()
Summary: Add a function to allow users to reset internal stats without restarting the DB. Closes https://github.com/facebook/rocksdb/pull/2167 Differential Revision: D4907939 Pulled By: siying fbshipit-source-id: ab2dd85b88aabe9380da7485320a1d460d3e1f68
This commit is contained in:
parent
0fcdccc33e
commit
c49d704656
@ -1,5 +1,7 @@
|
|||||||
# Rocksdb Change Log
|
# Rocksdb Change Log
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
### New Features
|
||||||
|
* DB::ResetStats() to reset internal stats.
|
||||||
|
|
||||||
## 5.4.0 (04/11/2017)
|
## 5.4.0 (04/11/2017)
|
||||||
### Public API Change
|
### Public API Change
|
||||||
|
@ -1666,6 +1666,16 @@ bool DBImpl::GetIntPropertyInternal(ColumnFamilyData* cfd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ROCKSDB_LITE
|
||||||
|
Status DBImpl::ResetStats() {
|
||||||
|
InstrumentedMutexLock l(&mutex_);
|
||||||
|
for (auto* cfd : *versions_->GetColumnFamilySet()) {
|
||||||
|
cfd->internal_stats()->Clear();
|
||||||
|
}
|
||||||
|
return Status::OK();
|
||||||
|
}
|
||||||
|
#endif // ROCKSDB_LITE
|
||||||
|
|
||||||
bool DBImpl::GetAggregatedIntProperty(const Slice& property,
|
bool DBImpl::GetAggregatedIntProperty(const Slice& property,
|
||||||
uint64_t* aggregated_value) {
|
uint64_t* aggregated_value) {
|
||||||
const DBPropertyInfo* property_info = GetPropertyInfo(property);
|
const DBPropertyInfo* property_info = GetPropertyInfo(property);
|
||||||
|
@ -193,6 +193,8 @@ class DBImpl : public DB {
|
|||||||
virtual SequenceNumber GetLatestSequenceNumber() const override;
|
virtual SequenceNumber GetLatestSequenceNumber() const override;
|
||||||
|
|
||||||
#ifndef ROCKSDB_LITE
|
#ifndef ROCKSDB_LITE
|
||||||
|
using DB::ResetStats;
|
||||||
|
virtual Status ResetStats() override;
|
||||||
virtual Status DisableFileDeletions() override;
|
virtual Status DisableFileDeletions() override;
|
||||||
virtual Status EnableFileDeletions(bool force) override;
|
virtual Status EnableFileDeletions(bool force) override;
|
||||||
virtual int IsFileDeletionsEnabled() const;
|
virtual int IsFileDeletionsEnabled() const;
|
||||||
|
@ -425,6 +425,13 @@ TEST_F(DBPropertiesTest, ReadLatencyHistogramByLevel) {
|
|||||||
ASSERT_NE(std::string::npos, prop.find("** Level 0 read latency histogram"));
|
ASSERT_NE(std::string::npos, prop.find("** Level 0 read latency histogram"));
|
||||||
ASSERT_NE(std::string::npos, prop.find("** Level 1 read latency histogram"));
|
ASSERT_NE(std::string::npos, prop.find("** Level 1 read latency histogram"));
|
||||||
ASSERT_EQ(std::string::npos, prop.find("** Level 2 read latency histogram"));
|
ASSERT_EQ(std::string::npos, prop.find("** Level 2 read latency histogram"));
|
||||||
|
|
||||||
|
// Clear internal stats
|
||||||
|
dbfull()->ResetStats();
|
||||||
|
ASSERT_TRUE(dbfull()->GetProperty("rocksdb.cfstats", &prop));
|
||||||
|
ASSERT_EQ(std::string::npos, prop.find("** Level 0 read latency histogram"));
|
||||||
|
ASSERT_EQ(std::string::npos, prop.find("** Level 1 read latency histogram"));
|
||||||
|
ASSERT_EQ(std::string::npos, prop.find("** Level 2 read latency histogram"));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(DBPropertiesTest, AggregatedTablePropertiesAtLevel) {
|
TEST_F(DBPropertiesTest, AggregatedTablePropertiesAtLevel) {
|
||||||
|
@ -189,6 +189,20 @@ class InternalStats {
|
|||||||
num_dropped_records(c.num_dropped_records),
|
num_dropped_records(c.num_dropped_records),
|
||||||
count(c.count) {}
|
count(c.count) {}
|
||||||
|
|
||||||
|
void Clear() {
|
||||||
|
this->micros = 0;
|
||||||
|
this->bytes_read_non_output_levels = 0;
|
||||||
|
this->bytes_read_output_level = 0;
|
||||||
|
this->bytes_written = 0;
|
||||||
|
this->bytes_moved = 0;
|
||||||
|
this->num_input_files_in_non_output_levels = 0;
|
||||||
|
this->num_input_files_in_output_level = 0;
|
||||||
|
this->num_output_files = 0;
|
||||||
|
this->num_input_records = 0;
|
||||||
|
this->num_dropped_records = 0;
|
||||||
|
this->count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void Add(const CompactionStats& c) {
|
void Add(const CompactionStats& c) {
|
||||||
this->micros += c.micros;
|
this->micros += c.micros;
|
||||||
this->bytes_read_non_output_levels += c.bytes_read_non_output_levels;
|
this->bytes_read_non_output_levels += c.bytes_read_non_output_levels;
|
||||||
@ -222,6 +236,26 @@ class InternalStats {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void Clear() {
|
||||||
|
for (int i = 0; i < INTERNAL_DB_STATS_ENUM_MAX; i++) {
|
||||||
|
db_stats_[i].store(0);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < INTERNAL_CF_STATS_ENUM_MAX; i++) {
|
||||||
|
cf_stats_count_[i] = 0;
|
||||||
|
cf_stats_value_[i] = 0;
|
||||||
|
}
|
||||||
|
for (auto& comp_stat : comp_stats_) {
|
||||||
|
comp_stat.Clear();
|
||||||
|
}
|
||||||
|
for (auto& h : file_read_latency_) {
|
||||||
|
h.Clear();
|
||||||
|
}
|
||||||
|
cf_stats_snapshot_.Clear();
|
||||||
|
db_stats_snapshot_.Clear();
|
||||||
|
bg_error_count_ = 0;
|
||||||
|
started_at_ = env_->NowMicros();
|
||||||
|
}
|
||||||
|
|
||||||
void AddCompactionStats(int level, const CompactionStats& stats) {
|
void AddCompactionStats(int level, const CompactionStats& stats) {
|
||||||
comp_stats_[level].Add(stats);
|
comp_stats_[level].Add(stats);
|
||||||
}
|
}
|
||||||
@ -319,6 +353,20 @@ class InternalStats {
|
|||||||
ingest_files_addfile(0),
|
ingest_files_addfile(0),
|
||||||
ingest_l0_files_addfile(0),
|
ingest_l0_files_addfile(0),
|
||||||
ingest_keys_addfile(0) {}
|
ingest_keys_addfile(0) {}
|
||||||
|
|
||||||
|
void Clear() {
|
||||||
|
comp_stats.Clear();
|
||||||
|
ingest_bytes_flush = 0;
|
||||||
|
stall_count = 0;
|
||||||
|
compact_bytes_write = 0;
|
||||||
|
compact_bytes_read = 0;
|
||||||
|
compact_micros = 0;
|
||||||
|
seconds_up = 0;
|
||||||
|
ingest_bytes_addfile = 0;
|
||||||
|
ingest_files_addfile = 0;
|
||||||
|
ingest_l0_files_addfile = 0;
|
||||||
|
ingest_keys_addfile = 0;
|
||||||
|
}
|
||||||
} cf_stats_snapshot_;
|
} cf_stats_snapshot_;
|
||||||
|
|
||||||
struct DBStatsSnapshot {
|
struct DBStatsSnapshot {
|
||||||
@ -350,6 +398,18 @@ class InternalStats {
|
|||||||
num_keys_written(0),
|
num_keys_written(0),
|
||||||
write_stall_micros(0),
|
write_stall_micros(0),
|
||||||
seconds_up(0) {}
|
seconds_up(0) {}
|
||||||
|
|
||||||
|
void Clear() {
|
||||||
|
ingest_bytes = 0;
|
||||||
|
wal_bytes = 0;
|
||||||
|
wal_synced = 0;
|
||||||
|
write_with_wal = 0;
|
||||||
|
write_other = 0;
|
||||||
|
write_self = 0;
|
||||||
|
num_keys_written = 0;
|
||||||
|
write_stall_micros = 0;
|
||||||
|
seconds_up = 0;
|
||||||
|
}
|
||||||
} db_stats_snapshot_;
|
} db_stats_snapshot_;
|
||||||
|
|
||||||
// Handler functions for getting property values. They use "value" as a value-
|
// Handler functions for getting property values. They use "value" as a value-
|
||||||
@ -420,7 +480,7 @@ class InternalStats {
|
|||||||
const int number_levels_;
|
const int number_levels_;
|
||||||
Env* env_;
|
Env* env_;
|
||||||
ColumnFamilyData* cfd_;
|
ColumnFamilyData* cfd_;
|
||||||
const uint64_t started_at_;
|
uint64_t started_at_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -611,6 +611,13 @@ class DB {
|
|||||||
return GetIntProperty(DefaultColumnFamily(), property, value);
|
return GetIntProperty(DefaultColumnFamily(), property, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reset internal stats for DB and all column families.
|
||||||
|
// Note this doesn't reset options.statistics as it is not owned by
|
||||||
|
// DB.
|
||||||
|
virtual Status ResetStats() {
|
||||||
|
return Status::NotSupported("Not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
// Same as GetIntProperty(), but this one returns the aggregated int
|
// Same as GetIntProperty(), but this one returns the aggregated int
|
||||||
// property from all column families.
|
// property from all column families.
|
||||||
virtual bool GetAggregatedIntProperty(const Slice& property,
|
virtual bool GetAggregatedIntProperty(const Slice& property,
|
||||||
|
@ -176,6 +176,7 @@ DEFINE_string(
|
|||||||
"Meta operations:\n"
|
"Meta operations:\n"
|
||||||
"\tcompact -- Compact the entire DB\n"
|
"\tcompact -- Compact the entire DB\n"
|
||||||
"\tstats -- Print DB stats\n"
|
"\tstats -- Print DB stats\n"
|
||||||
|
"\tresetstats -- Reset DB stats\n"
|
||||||
"\tlevelstats -- Print the number of files and bytes per level\n"
|
"\tlevelstats -- Print the number of files and bytes per level\n"
|
||||||
"\tsstables -- Print sstable info\n"
|
"\tsstables -- Print sstable info\n"
|
||||||
"\theapprofile -- Dump a heap profile (if supported by this"
|
"\theapprofile -- Dump a heap profile (if supported by this"
|
||||||
@ -2430,6 +2431,8 @@ void VerifyDBFromDB(std::string& truth_db_name) {
|
|||||||
method = &Benchmark::TimeSeries;
|
method = &Benchmark::TimeSeries;
|
||||||
} else if (name == "stats") {
|
} else if (name == "stats") {
|
||||||
PrintStats("rocksdb.stats");
|
PrintStats("rocksdb.stats");
|
||||||
|
} else if (name == "resetstats") {
|
||||||
|
ResetStats();
|
||||||
} else if (name == "verify") {
|
} else if (name == "verify") {
|
||||||
VerifyDBFromDB(FLAGS_truth_db);
|
VerifyDBFromDB(FLAGS_truth_db);
|
||||||
} else if (name == "levelstats") {
|
} else if (name == "levelstats") {
|
||||||
@ -5012,6 +5015,15 @@ void VerifyDBFromDB(std::string& truth_db_name) {
|
|||||||
db->CompactRange(CompactRangeOptions(), nullptr, nullptr);
|
db->CompactRange(CompactRangeOptions(), nullptr, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ResetStats() {
|
||||||
|
if (db_.db != nullptr) {
|
||||||
|
db_.db->ResetStats();
|
||||||
|
}
|
||||||
|
for (const auto& db_with_cfh : multi_dbs_) {
|
||||||
|
db_with_cfh.db->ResetStats();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PrintStats(const char* key) {
|
void PrintStats(const char* key) {
|
||||||
if (db_.db != nullptr) {
|
if (db_.db != nullptr) {
|
||||||
PrintStats(db_.db, key, false);
|
PrintStats(db_.db, key, false);
|
||||||
|
Loading…
Reference in New Issue
Block a user