From 3a6948c199313fa7e3e38d6ecbfb0366eb5194da Mon Sep 17 00:00:00 2001
From: Xiaoge Su <magichp@gmail.com>
Date: Thu, 12 Nov 2020 17:03:41 -0800
Subject: [PATCH] Report histogram periodically

---
 fdbserver/Knobs.cpp           |  1 +
 fdbserver/Knobs.h             |  1 +
 fdbserver/fdbserver.actor.cpp | 12 ++++++++++++
 flow/SystemMonitor.cpp        |  1 -
 4 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/fdbserver/Knobs.cpp b/fdbserver/Knobs.cpp
index f0225e6f08..8431be5149 100644
--- a/fdbserver/Knobs.cpp
+++ b/fdbserver/Knobs.cpp
@@ -540,6 +540,7 @@ ServerKnobs::ServerKnobs(bool randomize, ClientKnobs* clientKnobs, bool isSimula
 	init( MAX_STATUS_REQUESTS_PER_SECOND,                      256.0 );
 	init( CONFIGURATION_ROWS_TO_FETCH,                         20000 );
 	init( DISABLE_DUPLICATE_LOG_WARNING,                       false );
+	init( HISTOGRAM_REPORT_INTERVAL,                           300.0 );
 
 	// IPager
 	init( PAGER_RESERVED_PAGES,                                    1 );
diff --git a/fdbserver/Knobs.h b/fdbserver/Knobs.h
index 87bedc51e0..0a5168397d 100644
--- a/fdbserver/Knobs.h
+++ b/fdbserver/Knobs.h
@@ -483,6 +483,7 @@ public:
 	double MAX_STATUS_REQUESTS_PER_SECOND;
 	int CONFIGURATION_ROWS_TO_FETCH;
 	bool DISABLE_DUPLICATE_LOG_WARNING;
+	double HISTOGRAM_REPORT_INTERVAL;
 
 	// IPager
 	int PAGER_RESERVED_PAGES;
diff --git a/fdbserver/fdbserver.actor.cpp b/fdbserver/fdbserver.actor.cpp
index 94eb58e9dd..ef8c6f727c 100644
--- a/fdbserver/fdbserver.actor.cpp
+++ b/fdbserver/fdbserver.actor.cpp
@@ -373,6 +373,14 @@ void failAfter( Future<Void> trigger, Endpoint e ) {
 		failAfter( trigger, g_simulator.getProcess( e ) );
 }
 
+ACTOR Future<Void> histogramReport() {
+	loop {
+		wait(delay(SERVER_KNOBS->HISTOGRAM_REPORT_INTERVAL));
+
+		GetHistogramRegistry().logReport();
+	}
+}
+
 void testSerializationSpeed() {
 	double tstart;
 	double build = 0, serialize = 0, deserialize = 0, copy = 0, deallocate = 0;
@@ -1658,6 +1666,8 @@ int main(int argc, char* argv[]) {
 		if (role == Simulation) {
 			TraceEvent("Simulation").detail("TestFile", testFile);
 
+			auto histogramReportActor = histogramReport();
+
 			clientKnobs->trace();
 			flowKnobs->trace();
 			serverKnobs->trace();
@@ -1786,6 +1796,8 @@ int main(int argc, char* argv[]) {
 			if (!dataFolder.size())
 				dataFolder = format("fdb/%d/", publicAddresses.address.port);  // SOMEDAY: Better default
 
+			auto histogramReportActor = histogramReport();
+
 			vector<Future<Void>> actors(listenErrors.begin(), listenErrors.end());
 			actors.push_back( fdbd(connectionFile, localities, processClass, dataFolder, dataFolder, storageMemLimit, metricsConnFile, metricsPrefix, rsssize, whitelistBinPaths) );
 			//actors.push_back( recurring( []{}, .001 ) );  // for ASIO latency measurement
diff --git a/flow/SystemMonitor.cpp b/flow/SystemMonitor.cpp
index a69662442a..f996d2cd5c 100644
--- a/flow/SystemMonitor.cpp
+++ b/flow/SystemMonitor.cpp
@@ -60,7 +60,6 @@ SystemStatistics customSystemMonitor(std::string eventName, StatisticsState *sta
 	netData.init();
 	if (!DEBUG_DETERMINISM && currentStats.initialized) {
 		{
-			GetHistogramRegistry().logReport();
 			TraceEvent(eventName.c_str())
 			    .detail("Elapsed", currentStats.elapsed)
 			    .detail("CPUSeconds", currentStats.processCPUSeconds)