From 387ac0f1e100bd49cd03af2e23f2bf62a0e9e223 Mon Sep 17 00:00:00 2001 From: Mayank Agarwal Date: Thu, 15 Aug 2013 22:06:26 -0700 Subject: [PATCH] Expose statistic for sequence number and implement setTickerCount Summary: statistic for sequence number is needed by wormhole. setTickerCount is demanded for this statistic. I can't simply recordTick(max_sequence) when db recovers because the statistic iobject is owned by client and may/may not be reset during reopen. Eg. statistic is reset in mcrocksdb whereas it is not in db_stress. Therefore it is best to go with setTickerCount Test Plan: ./db_stress ... --statistics=1 and observed expected sequence number Reviewers: dhruba CC: leveldb Differential Revision: https://reviews.facebook.net/D12327 --- db/db_impl.cc | 3 +++ db/db_statistics.h | 5 +++++ include/leveldb/statistics.h | 25 +++++++++++++++++++------ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/db/db_impl.cc b/db/db_impl.cc index e72445183..f2351037b 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -643,6 +643,8 @@ Status DBImpl::Recover(VersionEdit* edit, MemTable* external_table, } else { last_flushed_sequence_ = versions_->LastSequence(); } + SetTickerCount(options_.statistics, SEQUENCE_NUMBER, + versions_->LastSequence()); } } @@ -2448,6 +2450,7 @@ Status DBImpl::Write(const WriteOptions& options, WriteBatch* my_batch) { // have succeeded in memtable but Status reports error for all writes. throw std::runtime_error("In memory WriteBatch corruption!"); } + RecordTick(options_.statistics, SEQUENCE_NUMBER, my_batch_count); versions_->SetLastSequence(last_sequence); last_flushed_sequence_ = current_sequence; } diff --git a/db/db_statistics.h b/db/db_statistics.h index 9f2d93ef2..725b75798 100644 --- a/db/db_statistics.h +++ b/db/db_statistics.h @@ -30,6 +30,11 @@ class DBStatistics: public Statistics { return allTickers_[tickerType].getCount(); } + virtual void setTickerCount(Tickers tickerType, uint64_t count) { + assert(tickerType < TICKER_ENUM_MAX); + allTickers_[tickerType].setTickerCount(count); + } + virtual void recordTick(Tickers tickerType, uint64_t count) { assert(tickerType < TICKER_ENUM_MAX); allTickers_[tickerType].recordTick(count); diff --git a/include/leveldb/statistics.h b/include/leveldb/statistics.h index e214c2bef..9a36ffccf 100644 --- a/include/leveldb/statistics.h +++ b/include/leveldb/statistics.h @@ -59,10 +59,10 @@ enum Tickers { NUMBER_MULTIGET_BYTES_READ = 20, NUMBER_FILTERED_DELETES = 21, - NUMBER_MERGE_FAILURES = 22, + SEQUENCE_NUMBER = 23, - TICKER_ENUM_MAX = 23 + TICKER_ENUM_MAX = 24 }; const std::vector> TickersNameMap = { @@ -88,7 +88,8 @@ const std::vector> TickersNameMap = { { NUMBER_MULTIGET_KEYS_READ, "rocksdb.number.multiget.keys.read" }, { NUMBER_MULTIGET_BYTES_READ, "rocksdb.number.multiget.bytes.read" }, { NUMBER_FILTERED_DELETES, "rocksdb.number.deletes.filtered" }, - { NUMBER_MERGE_FAILURES, "rocksdb.number.merge.failures" } + { NUMBER_MERGE_FAILURES, "rocksdb.number.merge.failures" }, + { SEQUENCE_NUMBER, "rocksdb.sequence.number" } }; /** @@ -179,11 +180,11 @@ class Ticker { public: Ticker() : count_(0) { } - inline void recordTick() { - count_++; + inline void setTickerCount(uint64_t count) { + count_ = count; } - inline void recordTick(int count) { + inline void recordTick(int count = 1) { count_ += count; } @@ -201,6 +202,7 @@ class Statistics { virtual long getTickerCount(Tickers tickerType) = 0; virtual void recordTick(Tickers tickerType, uint64_t count = 0) = 0; + virtual void setTickerCount(Tickers tickerType, uint64_t count) = 0; virtual void measureTime(Histograms histogramType, uint64_t time) = 0; virtual void histogramData(Histograms type, HistogramData * const data) = 0; @@ -221,6 +223,17 @@ inline void RecordTick(std::shared_ptr statistics, statistics->recordTick(ticker, count); } } + +inline void SetTickerCount(std::shared_ptr statistics, + Tickers ticker, + uint64_t count) { + assert(HistogramsNameMap.size() == HISTOGRAM_ENUM_MAX); + assert(TickersNameMap.size() == TICKER_ENUM_MAX); + if (statistics) { + statistics->setTickerCount(ticker, count); + } +} + } // namespace leveldb #endif // STORAGE_LEVELDB_INCLUDE_STATISTICS_H_