From d6ae6dec69e41d1e6a3e7071e85f80fc66f1fed7 Mon Sep 17 00:00:00 2001 From: Yi Wu Date: Tue, 11 Oct 2016 10:54:11 -0700 Subject: [PATCH] Add Statistics::getAndResetTickerCount(). Summary: A convience method to atomically get and reset ticker count. I'm wanting to use it to have a thin wrapper to the statistics object to export ticker counts to ODS for LogDevice (since they don't even use fb303). Test Plan: test in LogDevice shadow cluster. https://fburl.com/461868822 Reviewers: andrewkr, yhchiang, IslamAbdelRahman Reviewed By: IslamAbdelRahman Subscribers: andrewkr, dhruba, leveldb Differential Revision: https://reviews.facebook.net/D64869 --- HISTORY.md | 1 + include/rocksdb/statistics.h | 1 + util/statistics.cc | 24 ++++++++++++++++++++++++ util/statistics.h | 1 + 4 files changed, 27 insertions(+) diff --git a/HISTORY.md b/HISTORY.md index 6442bb883..b3d1dbb5c 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -2,6 +2,7 @@ ## Unreleased ### Public API Change * DB::GetOptions() reflect dynamic changed options (i.e. through DB::SetOptions()) and return copy of options instead of reference. +* Added Statistics::getAndResetTickerCount(). ## 4.12.0 (9/12/2016) ### Public API Change diff --git a/include/rocksdb/statistics.h b/include/rocksdb/statistics.h index 7dbd707a9..3fa8959ca 100644 --- a/include/rocksdb/statistics.h +++ b/include/rocksdb/statistics.h @@ -416,6 +416,7 @@ class Statistics { virtual std::string getHistogramString(uint32_t type) const { return ""; } virtual void recordTick(uint32_t tickerType, uint64_t count = 0) = 0; virtual void setTickerCount(uint32_t tickerType, uint64_t count) = 0; + virtual uint64_t getAndResetTickerCount(uint32_t tickerType) = 0; virtual void measureTime(uint32_t histogramType, uint64_t time) = 0; // String representation of the statistic object. diff --git a/util/statistics.cc b/util/statistics.cc index 2d351df48..a27001eea 100644 --- a/util/statistics.cc +++ b/util/statistics.cc @@ -123,6 +123,30 @@ void StatisticsImpl::setTickerCount(uint32_t tickerType, uint64_t count) { } } +uint64_t StatisticsImpl::getAndResetTickerCount(uint32_t tickerType) { + uint64_t sum = 0; + { + MutexLock lock(&aggregate_lock_); + assert(enable_internal_stats_ ? tickerType < INTERNAL_TICKER_ENUM_MAX + : tickerType < TICKER_ENUM_MAX); + if (tickerType < TICKER_ENUM_MAX || enable_internal_stats_) { + tickers_[tickerType].thread_value->Fold( + [](void* curr_ptr, void* res) { + auto* sum_ptr = static_cast(res); + *sum_ptr += static_cast*>(curr_ptr)->exchange( + 0, std::memory_order_relaxed); + }, + &sum); + sum += tickers_[tickerType].merged_sum.exchange( + 0, std::memory_order_relaxed); + } + } + if (stats_ && tickerType < TICKER_ENUM_MAX) { + stats_->setTickerCount(tickerType, 0); + } + return sum; +} + void StatisticsImpl::recordTick(uint32_t tickerType, uint64_t count) { assert( enable_internal_stats_ ? diff --git a/util/statistics.h b/util/statistics.h index ea8805288..0f2e6c8e2 100644 --- a/util/statistics.h +++ b/util/statistics.h @@ -41,6 +41,7 @@ class StatisticsImpl : public Statistics { std::string getHistogramString(uint32_t histogram_type) const override; virtual void setTickerCount(uint32_t ticker_type, uint64_t count) override; + virtual uint64_t getAndResetTickerCount(uint32_t ticker_type) override; virtual void recordTick(uint32_t ticker_type, uint64_t count) override; virtual void measureTime(uint32_t histogram_type, uint64_t value) override;