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
main
Mayank Agarwal 11 years ago
parent d1d3d15eb7
commit 387ac0f1e1
  1. 3
      db/db_impl.cc
  2. 5
      db/db_statistics.h
  3. 25
      include/leveldb/statistics.h

@ -643,6 +643,8 @@ Status DBImpl::Recover(VersionEdit* edit, MemTable* external_table,
} else { } else {
last_flushed_sequence_ = versions_->LastSequence(); 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. // have succeeded in memtable but Status reports error for all writes.
throw std::runtime_error("In memory WriteBatch corruption!"); throw std::runtime_error("In memory WriteBatch corruption!");
} }
RecordTick(options_.statistics, SEQUENCE_NUMBER, my_batch_count);
versions_->SetLastSequence(last_sequence); versions_->SetLastSequence(last_sequence);
last_flushed_sequence_ = current_sequence; last_flushed_sequence_ = current_sequence;
} }

@ -30,6 +30,11 @@ class DBStatistics: public Statistics {
return allTickers_[tickerType].getCount(); 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) { virtual void recordTick(Tickers tickerType, uint64_t count) {
assert(tickerType < TICKER_ENUM_MAX); assert(tickerType < TICKER_ENUM_MAX);
allTickers_[tickerType].recordTick(count); allTickers_[tickerType].recordTick(count);

@ -59,10 +59,10 @@ enum Tickers {
NUMBER_MULTIGET_BYTES_READ = 20, NUMBER_MULTIGET_BYTES_READ = 20,
NUMBER_FILTERED_DELETES = 21, NUMBER_FILTERED_DELETES = 21,
NUMBER_MERGE_FAILURES = 22, NUMBER_MERGE_FAILURES = 22,
SEQUENCE_NUMBER = 23,
TICKER_ENUM_MAX = 23 TICKER_ENUM_MAX = 24
}; };
const std::vector<std::pair<Tickers, std::string>> TickersNameMap = { const std::vector<std::pair<Tickers, std::string>> TickersNameMap = {
@ -88,7 +88,8 @@ const std::vector<std::pair<Tickers, std::string>> TickersNameMap = {
{ NUMBER_MULTIGET_KEYS_READ, "rocksdb.number.multiget.keys.read" }, { NUMBER_MULTIGET_KEYS_READ, "rocksdb.number.multiget.keys.read" },
{ NUMBER_MULTIGET_BYTES_READ, "rocksdb.number.multiget.bytes.read" }, { NUMBER_MULTIGET_BYTES_READ, "rocksdb.number.multiget.bytes.read" },
{ NUMBER_FILTERED_DELETES, "rocksdb.number.deletes.filtered" }, { 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: public:
Ticker() : count_(0) { } Ticker() : count_(0) { }
inline void recordTick() { inline void setTickerCount(uint64_t count) {
count_++; count_ = count;
} }
inline void recordTick(int count) { inline void recordTick(int count = 1) {
count_ += count; count_ += count;
} }
@ -201,6 +202,7 @@ class Statistics {
virtual long getTickerCount(Tickers tickerType) = 0; virtual long getTickerCount(Tickers tickerType) = 0;
virtual void recordTick(Tickers tickerType, uint64_t count = 0) = 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 measureTime(Histograms histogramType, uint64_t time) = 0;
virtual void histogramData(Histograms type, HistogramData * const data) = 0; virtual void histogramData(Histograms type, HistogramData * const data) = 0;
@ -221,6 +223,17 @@ inline void RecordTick(std::shared_ptr<Statistics> statistics,
statistics->recordTick(ticker, count); statistics->recordTick(ticker, count);
} }
} }
inline void SetTickerCount(std::shared_ptr<Statistics> 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 } // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_STATISTICS_H_ #endif // STORAGE_LEVELDB_INCLUDE_STATISTICS_H_

Loading…
Cancel
Save