mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-27 20:43:57 +00:00
f6ca226c17
Summary: Make StatisticsImpl being able to forward stats to provided statistics implementation. The main purpose is to allow us to collect internal stats in the future even when user supplies custom statistics implementation. It avoids intrumenting 2 sets of stats collection code. One immediate use case is tuning advisor, which needs to collect some internal stats, users may not be interested. Test Plan: ran db_bench and see stats show up at the end of run Will run make all check since some tests rely on statistics Reviewers: yhchiang, sdong, igor Reviewed By: sdong Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D20145
91 lines
2.6 KiB
C++
91 lines
2.6 KiB
C++
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under the BSD-style license found in the
|
|
// LICENSE file in the root directory of this source tree. An additional grant
|
|
// of patent rights can be found in the PATENTS file in the same directory.
|
|
//
|
|
#pragma once
|
|
#include "rocksdb/statistics.h"
|
|
|
|
#include <vector>
|
|
#include <atomic>
|
|
#include <string>
|
|
|
|
#include "util/histogram.h"
|
|
#include "util/mutexlock.h"
|
|
#include "port/likely.h"
|
|
|
|
|
|
namespace rocksdb {
|
|
|
|
enum TickersInternal : uint32_t {
|
|
INTERNAL_TICKER_ENUM_START = TICKER_ENUM_MAX,
|
|
INTERNAL_TICKER_ENUM_MAX
|
|
};
|
|
|
|
enum HistogramsInternal : uint32_t {
|
|
INTERNAL_HISTOGRAM_START = HISTOGRAM_ENUM_MAX,
|
|
INTERNAL_HISTOGRAM_ENUM_MAX
|
|
};
|
|
|
|
|
|
class StatisticsImpl : public Statistics {
|
|
public:
|
|
StatisticsImpl(std::shared_ptr<Statistics> stats,
|
|
bool enable_internal_stats);
|
|
virtual ~StatisticsImpl();
|
|
|
|
virtual uint64_t getTickerCount(uint32_t ticker_type) const override;
|
|
virtual void histogramData(uint32_t histogram_type,
|
|
HistogramData* const data) const override;
|
|
|
|
virtual void setTickerCount(uint32_t ticker_type, uint64_t count) override;
|
|
virtual void recordTick(uint32_t ticker_type, uint64_t count) override;
|
|
virtual void measureTime(uint32_t histogram_type, uint64_t value) override;
|
|
|
|
virtual std::string ToString() const override;
|
|
virtual bool HistEnabledForType(uint32_t type) const override;
|
|
|
|
private:
|
|
std::shared_ptr<Statistics> stats_shared_;
|
|
Statistics* stats_;
|
|
bool enable_internal_stats_;
|
|
|
|
struct Ticker {
|
|
Ticker() : value(uint_fast64_t()) {}
|
|
|
|
std::atomic_uint_fast64_t value;
|
|
// Pad the structure to make it size of 64 bytes. A plain array of
|
|
// std::atomic_uint_fast64_t results in huge performance degradataion
|
|
// due to false sharing.
|
|
char padding[64 - sizeof(std::atomic_uint_fast64_t)];
|
|
};
|
|
|
|
Ticker tickers_[INTERNAL_TICKER_ENUM_MAX] __attribute__((aligned(64)));
|
|
HistogramImpl histograms_[INTERNAL_HISTOGRAM_ENUM_MAX]
|
|
__attribute__((aligned(64)));
|
|
};
|
|
|
|
// Utility functions
|
|
inline void MeasureTime(Statistics* statistics, uint32_t histogram_type,
|
|
uint64_t value) {
|
|
if (statistics) {
|
|
statistics->measureTime(histogram_type, value);
|
|
}
|
|
}
|
|
|
|
inline void RecordTick(Statistics* statistics, uint32_t ticker_type,
|
|
uint64_t count = 1) {
|
|
if (statistics) {
|
|
statistics->recordTick(ticker_type, count);
|
|
}
|
|
}
|
|
|
|
inline void SetTickerCount(Statistics* statistics, uint32_t ticker_type,
|
|
uint64_t count) {
|
|
if (statistics) {
|
|
statistics->setTickerCount(ticker_type, count);
|
|
}
|
|
}
|
|
|
|
}
|