mirror of
https://github.com/apple/foundationdb.git
synced 2025-05-25 17:00:05 +08:00
clang format
This commit is contained in:
parent
26a66c632a
commit
df18f20efd
@ -153,7 +153,7 @@ struct KVTest {
|
||||
}
|
||||
};
|
||||
|
||||
ACTOR Future<Void> testKVRead( KVTest* test, Key key, TestHistogram<float>* latency, PerfIntCounter* count ) {
|
||||
ACTOR Future<Void> testKVRead(KVTest* test, Key key, TestHistogram<float>* latency, PerfIntCounter* count) {
|
||||
//state Version s1 = test->lastCommit;
|
||||
state Version s2 = test->lastDurable;
|
||||
|
||||
@ -171,7 +171,7 @@ ACTOR Future<Void> testKVRead( KVTest* test, Key key, TestHistogram<float>* late
|
||||
return Void();
|
||||
}
|
||||
|
||||
ACTOR Future<Void> testKVReadSaturation( KVTest* test, TestHistogram<float>* latency, PerfIntCounter* count ) {
|
||||
ACTOR Future<Void> testKVReadSaturation(KVTest* test, TestHistogram<float>* latency, PerfIntCounter* count) {
|
||||
while (true) {
|
||||
state double begin = timer();
|
||||
Optional<Value> val = wait( test->store->readValue(test->randomKey()) );
|
||||
@ -181,7 +181,7 @@ ACTOR Future<Void> testKVReadSaturation( KVTest* test, TestHistogram<float>* lat
|
||||
}
|
||||
}
|
||||
|
||||
ACTOR Future<Void> testKVCommit( KVTest* test, TestHistogram<float>* latency, PerfIntCounter* count ) {
|
||||
ACTOR Future<Void> testKVCommit(KVTest* test, TestHistogram<float>* latency, PerfIntCounter* count) {
|
||||
state Version v = test->lastSet;
|
||||
test->lastCommit = v;
|
||||
state double begin = timer();
|
||||
@ -232,7 +232,7 @@ struct KVStoreTestWorkload : TestWorkload {
|
||||
return Void();
|
||||
}
|
||||
virtual Future<bool> check( Database const& cx ) { return true; }
|
||||
void metricsFromHistogram(vector<PerfMetric>& m, std::string name, TestHistogram<float>& h){
|
||||
void metricsFromHistogram(vector<PerfMetric>& m, std::string name, TestHistogram<float>& h) {
|
||||
m.push_back( PerfMetric( "Min " + name, 1000.0 * h.min(), true) );
|
||||
m.push_back( PerfMetric( "Average " + name, 1000.0 * h.mean(), true) );
|
||||
m.push_back( PerfMetric( "Median " + name, 1000.0 * h.medianEstimate(), true) );
|
||||
|
@ -29,8 +29,8 @@
|
||||
// metrics.
|
||||
#include <fdbrpc/simulator.h>
|
||||
|
||||
// pull in some global pointers too: These types are implemented in fdbrpc/sim2.actor.cpp, which is not available here. Yuck.
|
||||
// If you're not using the simulator, these will remain null, and all should be well.
|
||||
// pull in some global pointers too: These types are implemented in fdbrpc/sim2.actor.cpp, which is not available here.
|
||||
// Yuck. If you're not using the simulator, these will remain null, and all should be well.
|
||||
|
||||
// TODO: create a execution context abstraction that allows independent flow instances within a process.
|
||||
// The simulator would be the main user of it, and histogram would be the only other user (for now).
|
||||
@ -39,133 +39,130 @@ thread_local ISimulator::ProcessInfo* ISimulator::currentProcess = nullptr;
|
||||
|
||||
// Fallback registry when we're not in simulation -- if we had execution contexts we wouldn't need to check if
|
||||
// we have a simulated contex here; we'd just use the current context regardless.
|
||||
static HistogramRegistry * globalHistograms = nullptr;
|
||||
static HistogramRegistry* globalHistograms = nullptr;
|
||||
|
||||
HistogramRegistry & GetHistogramRegistry() {
|
||||
ISimulator::ProcessInfo * info = g_simulator.getCurrentProcess();
|
||||
HistogramRegistry& GetHistogramRegistry() {
|
||||
ISimulator::ProcessInfo* info = g_simulator.getCurrentProcess();
|
||||
|
||||
if (info) {
|
||||
// in simulator; scope histograms to simulated process
|
||||
return info->histograms;
|
||||
}
|
||||
// avoid link order issues where the registry hasn't been initialized, but we're
|
||||
// instantiating a histogram
|
||||
if (globalHistograms == nullptr) {
|
||||
globalHistograms = new HistogramRegistry();
|
||||
}
|
||||
return *globalHistograms;
|
||||
if (info) {
|
||||
// in simulator; scope histograms to simulated process
|
||||
return info->histograms;
|
||||
}
|
||||
// avoid link order issues where the registry hasn't been initialized, but we're
|
||||
// instantiating a histogram
|
||||
if (globalHistograms == nullptr) {
|
||||
globalHistograms = new HistogramRegistry();
|
||||
}
|
||||
return *globalHistograms;
|
||||
}
|
||||
|
||||
void HistogramRegistry::registerHistogram(Histogram * h) {
|
||||
if (histograms.find(h->name()) != histograms.end()) {
|
||||
TraceEvent(SevError, "HistogramDoubleRegistered")
|
||||
.detail("group", h->group)
|
||||
.detail("op", h->op);
|
||||
ASSERT(false);
|
||||
}
|
||||
histograms.insert(std::pair<std::string, Histogram*>(h->name(), h));
|
||||
void HistogramRegistry::registerHistogram(Histogram* h) {
|
||||
if (histograms.find(h->name()) != histograms.end()) {
|
||||
TraceEvent(SevError, "HistogramDoubleRegistered").detail("group", h->group).detail("op", h->op);
|
||||
ASSERT(false);
|
||||
}
|
||||
histograms.insert(std::pair<std::string, Histogram*>(h->name(), h));
|
||||
}
|
||||
|
||||
void HistogramRegistry::unregisterHistogram(Histogram * h) {
|
||||
if (histograms.find(h->name()) == histograms.end()) {
|
||||
TraceEvent(SevError, "HistogramNotRegistered")
|
||||
.detail("group", h->group)
|
||||
.detail("op", h->op);
|
||||
}
|
||||
ASSERT(histograms.erase(h->name()) == 1);
|
||||
void HistogramRegistry::unregisterHistogram(Histogram* h) {
|
||||
if (histograms.find(h->name()) == histograms.end()) {
|
||||
TraceEvent(SevError, "HistogramNotRegistered").detail("group", h->group).detail("op", h->op);
|
||||
}
|
||||
ASSERT(histograms.erase(h->name()) == 1);
|
||||
}
|
||||
|
||||
Histogram * HistogramRegistry::lookupHistogram(std::string name) {
|
||||
auto h = histograms.find(name);
|
||||
if (h == histograms.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
return h->second;
|
||||
Histogram* HistogramRegistry::lookupHistogram(std::string name) {
|
||||
auto h = histograms.find(name);
|
||||
if (h == histograms.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
return h->second;
|
||||
}
|
||||
|
||||
void HistogramRegistry::logReport() {
|
||||
for (auto & i : histograms) {
|
||||
i.second->writeToLog();
|
||||
i.second->clear();
|
||||
}
|
||||
for (auto& i : histograms) {
|
||||
i.second->writeToLog();
|
||||
i.second->clear();
|
||||
}
|
||||
}
|
||||
|
||||
void Histogram::writeToLog() {
|
||||
bool active = false;
|
||||
for (uint32_t i = 0; i < 32; i++) {
|
||||
if (buckets[i]) {
|
||||
active = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!active) {
|
||||
return ;
|
||||
}
|
||||
bool active = false;
|
||||
for (uint32_t i = 0; i < 32; i++) {
|
||||
if (buckets[i]) {
|
||||
active = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!active) {
|
||||
return;
|
||||
}
|
||||
|
||||
TraceEvent e(SevInfo, "Histogram");
|
||||
e.detail("Group", group).detail("Op", op);
|
||||
for (uint32_t i = 0; i < 32; i++) {
|
||||
if (buckets[i]) {
|
||||
switch(unit) {
|
||||
case Unit::microseconds:
|
||||
{
|
||||
uint32_t usec = ((uint32_t)1)<<(i+1);
|
||||
e.detail(format("LessThan%u.%03u", usec / 1000, usec % 1000), buckets[i]);
|
||||
break;
|
||||
}
|
||||
case Unit::bytes:
|
||||
e.detail(format("LessThan%u", ((uint32_t)1)<<(i+1)), buckets[i]);
|
||||
break;
|
||||
default:
|
||||
ASSERT(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
TraceEvent e(SevInfo, "Histogram");
|
||||
e.detail("Group", group).detail("Op", op);
|
||||
for (uint32_t i = 0; i < 32; i++) {
|
||||
if (buckets[i]) {
|
||||
switch (unit) {
|
||||
case Unit::microseconds: {
|
||||
uint32_t usec = ((uint32_t)1) << (i + 1);
|
||||
e.detail(format("LessThan%u.%03u", usec / 1000, usec % 1000), buckets[i]);
|
||||
break;
|
||||
}
|
||||
case Unit::bytes:
|
||||
e.detail(format("LessThan%u", ((uint32_t)1) << (i + 1)), buckets[i]);
|
||||
break;
|
||||
default:
|
||||
ASSERT(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("/flow/histogram/smoke_test") {
|
||||
|
||||
{
|
||||
Reference<Histogram> h = Histogram::getHistogram(LiteralStringRef("smoke_test"), LiteralStringRef("counts"), Histogram::Unit::bytes);
|
||||
|
||||
h->sample(0);
|
||||
ASSERT(h->buckets[0] == 1);
|
||||
h->sample(1);
|
||||
ASSERT(h->buckets[0] == 2);
|
||||
{
|
||||
Reference<Histogram> h =
|
||||
Histogram::getHistogram(LiteralStringRef("smoke_test"), LiteralStringRef("counts"), Histogram::Unit::bytes);
|
||||
|
||||
h->sample(2);
|
||||
ASSERT(h->buckets[1] == 1);
|
||||
h->sample(0);
|
||||
ASSERT(h->buckets[0] == 1);
|
||||
h->sample(1);
|
||||
ASSERT(h->buckets[0] == 2);
|
||||
|
||||
GetHistogramRegistry().logReport();
|
||||
h->sample(2);
|
||||
ASSERT(h->buckets[1] == 1);
|
||||
|
||||
ASSERT(h->buckets[0] == 0);
|
||||
h->sample(0);
|
||||
ASSERT(h->buckets[0] == 1);
|
||||
h = Histogram::getHistogram(LiteralStringRef("smoke_test"), LiteralStringRef("counts2"), Histogram::Unit::bytes);
|
||||
|
||||
// confirm that old h was deallocated.
|
||||
h = Histogram::getHistogram(LiteralStringRef("smoke_test"), LiteralStringRef("counts"), Histogram::Unit::bytes);
|
||||
ASSERT(h->buckets[0] == 0);
|
||||
GetHistogramRegistry().logReport();
|
||||
|
||||
h = Histogram::getHistogram(LiteralStringRef("smoke_test"), LiteralStringRef("times"), Histogram::Unit::microseconds);
|
||||
ASSERT(h->buckets[0] == 0);
|
||||
h->sample(0);
|
||||
ASSERT(h->buckets[0] == 1);
|
||||
h = Histogram::getHistogram(LiteralStringRef("smoke_test"), LiteralStringRef("counts2"),
|
||||
Histogram::Unit::bytes);
|
||||
|
||||
h->sampleSeconds(0.000000);
|
||||
h->sampleSeconds(0.0000019);
|
||||
ASSERT(h->buckets[0] == 2);
|
||||
h->sampleSeconds(0.0000021);
|
||||
ASSERT(h->buckets[1] == 1);
|
||||
h->sampleSeconds(0.000015);
|
||||
ASSERT(h->buckets[3] == 1);
|
||||
// confirm that old h was deallocated.
|
||||
h = Histogram::getHistogram(LiteralStringRef("smoke_test"), LiteralStringRef("counts"), Histogram::Unit::bytes);
|
||||
ASSERT(h->buckets[0] == 0);
|
||||
|
||||
h->sampleSeconds(4400.0);
|
||||
ASSERT(h->buckets[31] == 1);
|
||||
h = Histogram::getHistogram(LiteralStringRef("smoke_test"), LiteralStringRef("times"),
|
||||
Histogram::Unit::microseconds);
|
||||
|
||||
GetHistogramRegistry().logReport();
|
||||
h->sampleSeconds(0.000000);
|
||||
h->sampleSeconds(0.0000019);
|
||||
ASSERT(h->buckets[0] == 2);
|
||||
h->sampleSeconds(0.0000021);
|
||||
ASSERT(h->buckets[1] == 1);
|
||||
h->sampleSeconds(0.000015);
|
||||
ASSERT(h->buckets[3] == 1);
|
||||
|
||||
}
|
||||
h->sampleSeconds(4400.0);
|
||||
ASSERT(h->buckets[31] == 1);
|
||||
|
||||
// h has been deallocated. Does this crash?
|
||||
GetHistogramRegistry().logReport();
|
||||
GetHistogramRegistry().logReport();
|
||||
}
|
||||
|
||||
return Void();
|
||||
// h has been deallocated. Does this crash?
|
||||
GetHistogramRegistry().logReport();
|
||||
|
||||
return Void();
|
||||
}
|
118
flow/Histogram.h
118
flow/Histogram.h
@ -35,88 +35,80 @@
|
||||
class Histogram;
|
||||
|
||||
class HistogramRegistry {
|
||||
public:
|
||||
void registerHistogram(Histogram * h);
|
||||
void unregisterHistogram(Histogram * h);
|
||||
Histogram * lookupHistogram(std::string name);
|
||||
void logReport();
|
||||
private:
|
||||
std::map<std::string, Histogram*> histograms;
|
||||
public:
|
||||
void registerHistogram(Histogram* h);
|
||||
void unregisterHistogram(Histogram* h);
|
||||
Histogram* lookupHistogram(std::string name);
|
||||
void logReport();
|
||||
|
||||
private:
|
||||
std::map<std::string, Histogram*> histograms;
|
||||
};
|
||||
|
||||
// TODO: This should be scoped properly for simulation (instead of just having all the "machines" share one histogram namespace)
|
||||
HistogramRegistry & GetHistogramRegistry();
|
||||
// TODO: This should be scoped properly for simulation (instead of just having all the "machines" share one histogram
|
||||
// namespace)
|
||||
HistogramRegistry& GetHistogramRegistry();
|
||||
|
||||
class Histogram : public ReferenceCounted<Histogram> {
|
||||
public:
|
||||
enum class Unit {
|
||||
microseconds,
|
||||
bytes
|
||||
};
|
||||
enum class Unit { microseconds, bytes };
|
||||
|
||||
private:
|
||||
Histogram(std::string group, std::string op, Unit unit) : group(group), op(op), unit(unit), registry(GetHistogramRegistry()) {
|
||||
clear();
|
||||
registry.registerHistogram(this);
|
||||
}
|
||||
Histogram(std::string group, std::string op, Unit unit)
|
||||
: group(group), op(op), unit(unit), registry(GetHistogramRegistry()) {
|
||||
clear();
|
||||
registry.registerHistogram(this);
|
||||
}
|
||||
|
||||
static std::string generateName(std::string group, std::string op) {
|
||||
return group + ":" + op;
|
||||
}
|
||||
static std::string generateName(std::string group, std::string op) { return group + ":" + op; }
|
||||
|
||||
public:
|
||||
~Histogram() { registry.unregisterHistogram(this); }
|
||||
|
||||
~Histogram() {
|
||||
registry.unregisterHistogram(this);
|
||||
}
|
||||
static Reference<Histogram> getHistogram(StringRef group, StringRef op, Unit unit) {
|
||||
std::string group_str = group.toString();
|
||||
std::string op_str = op.toString();
|
||||
std::string name = generateName(group_str, op_str);
|
||||
HistogramRegistry& registry = GetHistogramRegistry();
|
||||
Histogram* h = registry.lookupHistogram(name);
|
||||
if (!h) {
|
||||
h = new Histogram(group_str, op_str, unit);
|
||||
}
|
||||
return Reference(h);
|
||||
}
|
||||
|
||||
|
||||
static Reference<Histogram> getHistogram(StringRef group, StringRef op, Unit unit) {
|
||||
std::string group_str = group.toString();
|
||||
std::string op_str = op.toString();
|
||||
std::string name = generateName(group_str, op_str);
|
||||
HistogramRegistry & registry = GetHistogramRegistry();
|
||||
Histogram * h = registry.lookupHistogram(name);
|
||||
if (!h) {
|
||||
h = new Histogram(group_str, op_str, unit);
|
||||
}
|
||||
return Reference(h);
|
||||
}
|
||||
|
||||
inline void sample(uint32_t sample) {
|
||||
inline void sample(uint32_t sample) {
|
||||
#ifdef _WIN32
|
||||
unsigned long index;
|
||||
buckets[_BitScanReverse(&index, sample) ? index : 0]++;
|
||||
unsigned long index;
|
||||
buckets[_BitScanReverse(&index, sample) ? index : 0]++;
|
||||
#else
|
||||
buckets[sample ? (31 - __builtin_clz(sample)) : 0]++;
|
||||
buckets[sample ? (31 - __builtin_clz(sample)) : 0]++;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
inline void sampleSeconds(double delta) {
|
||||
uint64_t delta_usec = (delta * 1000000);
|
||||
if (delta_usec > UINT32_MAX) {
|
||||
sample(UINT32_MAX);
|
||||
} else {
|
||||
sample((uint32_t)(delta * 1000000)); // convert to microseconds and truncate to integer
|
||||
}
|
||||
}
|
||||
inline void sampleSeconds(double delta) {
|
||||
uint64_t delta_usec = (delta * 1000000);
|
||||
if (delta_usec > UINT32_MAX) {
|
||||
sample(UINT32_MAX);
|
||||
} else {
|
||||
sample((uint32_t)(delta * 1000000)); // convert to microseconds and truncate to integer
|
||||
}
|
||||
}
|
||||
|
||||
void clear() {
|
||||
for (uint32_t & i : buckets) {
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
void writeToLog();
|
||||
void clear() {
|
||||
for (uint32_t& i : buckets) {
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
void writeToLog();
|
||||
|
||||
std::string name() {
|
||||
return generateName(this->group, this->op);
|
||||
}
|
||||
std::string name() { return generateName(this->group, this->op); }
|
||||
|
||||
std::string const group;
|
||||
std::string const op;
|
||||
Unit const unit;
|
||||
HistogramRegistry & registry;
|
||||
uint32_t buckets[32];
|
||||
std::string const group;
|
||||
std::string const op;
|
||||
Unit const unit;
|
||||
HistogramRegistry& registry;
|
||||
uint32_t buckets[32];
|
||||
};
|
||||
|
||||
#endif // FLOW_HISTOGRAM_H
|
@ -666,7 +666,7 @@ private:
|
||||
};
|
||||
|
||||
struct PacketBuffer : SendBuffer {
|
||||
private:
|
||||
private:
|
||||
int reference_count;
|
||||
uint32_t const size_;
|
||||
double const enqueue_time;
|
||||
|
Loading…
x
Reference in New Issue
Block a user