From a5a6f8431cb2404b69d58a15b0cbe6e9a7146dce Mon Sep 17 00:00:00 2001 From: "A.J. Beamon" Date: Mon, 8 Jul 2019 14:01:04 -0700 Subject: [PATCH 1/3] Add a random UID to TransactionMetrics in case a client opens multiple connections and also a field to indicate whether the connection is internal. Convert some of the metrics to our Counter object instead of running totals. --- fdbbackup/backup.actor.cpp | 4 +- fdbcli/fdbcli.actor.cpp | 2 +- fdbclient/DatabaseContext.h | 40 +++++----- fdbclient/NativeAPI.actor.cpp | 93 ++++++++++++----------- fdbclient/NativeAPI.actor.h | 4 +- fdbclient/ThreadSafeTransaction.actor.cpp | 2 +- fdbserver/Restore.actor.cpp | 2 +- fdbserver/tester.actor.cpp | 2 +- fdbserver/worker.actor.cpp | 2 +- flow/Stats.actor.cpp | 20 +++-- flow/Stats.h | 21 +++++ 11 files changed, 114 insertions(+), 78 deletions(-) diff --git a/fdbbackup/backup.actor.cpp b/fdbbackup/backup.actor.cpp index 1e4fd786e2..5d62be9a8b 100644 --- a/fdbbackup/backup.actor.cpp +++ b/fdbbackup/backup.actor.cpp @@ -3244,7 +3244,7 @@ int main(int argc, char* argv[]) { } try { - db = Database::createDatabase(ccf, -1, localities); + db = Database::createDatabase(ccf, -1, true, localities); } catch (Error& e) { fprintf(stderr, "ERROR: %s\n", e.what()); @@ -3266,7 +3266,7 @@ int main(int argc, char* argv[]) { } try { - sourceDb = Database::createDatabase(sourceCcf, -1, localities); + sourceDb = Database::createDatabase(sourceCcf, -1, true, localities); } catch (Error& e) { fprintf(stderr, "ERROR: %s\n", e.what()); diff --git a/fdbcli/fdbcli.actor.cpp b/fdbcli/fdbcli.actor.cpp index ebb63a82b9..a84712ddfd 100644 --- a/fdbcli/fdbcli.actor.cpp +++ b/fdbcli/fdbcli.actor.cpp @@ -2516,7 +2516,7 @@ ACTOR Future cli(CLIOptions opt, LineNoise* plinenoise) { TraceEvent::setNetworkThread(); try { - db = Database::createDatabase(ccf, -1); + db = Database::createDatabase(ccf, -1, false); if (!opt.exec.present()) { printf("Using cluster file `%s'.\n", ccf->getFilename().c_str()); } diff --git a/fdbclient/DatabaseContext.h b/fdbclient/DatabaseContext.h index 4c1c21dc6a..35eb8e6f71 100644 --- a/fdbclient/DatabaseContext.h +++ b/fdbclient/DatabaseContext.h @@ -58,7 +58,7 @@ public: ~DatabaseContext(); - Database clone() const { return Database(new DatabaseContext( cluster, clientInfo, clientInfoMonitor, dbId, taskID, clientLocality, enableLocalityLoadBalance, lockAware, apiVersion )); } + Database clone() const { return Database(new DatabaseContext( cluster, clientInfo, clientInfoMonitor, taskID, clientLocality, enableLocalityLoadBalance, lockAware, internal, apiVersion )); } std::pair> getCachedLocation( const KeyRef&, bool isBackward = false ); bool getCachedLocations( const KeyRangeRef&, vector>>&, int limit, bool reverse ); @@ -97,8 +97,8 @@ public: //private: explicit DatabaseContext( Reference cluster, Reference> clientDBInfo, - Future clientInfoMonitor, Standalone dbId, TaskPriority taskID, LocalityData const& clientLocality, - bool enableLocalityLoadBalance, bool lockAware, int apiVersion = Database::API_VERSION_LATEST ); + Future clientInfoMonitor, TaskPriority taskID, LocalityData const& clientLocality, + bool enableLocalityLoadBalance, bool lockAware, bool internal = true, int apiVersion = Database::API_VERSION_LATEST ); explicit DatabaseContext( const Error &err ); @@ -133,22 +133,26 @@ public: std::map< UID, StorageServerInfo* > server_interf; - Standalone dbId; + UID dbId; + bool internal; + + CounterCollection cc; + + Counter transactionReadVersions; + Counter transactionLogicalReads; + Counter transactionPhysicalReads; + Counter transactionCommittedMutations; + Counter transactionCommittedMutationBytes; + Counter transactionsCommitStarted; + Counter transactionsCommitCompleted; + Counter transactionsTooOld; + Counter transactionsFutureVersions; + Counter transactionsNotCommitted; + Counter transactionsMaybeCommitted; + Counter transactionsResourceConstrained; + Counter transactionsProcessBehind; + Counter transactionWaitsForFullRecovery; - int64_t transactionReadVersions; - int64_t transactionLogicalReads; - int64_t transactionPhysicalReads; - int64_t transactionCommittedMutations; - int64_t transactionCommittedMutationBytes; - int64_t transactionsCommitStarted; - int64_t transactionsCommitCompleted; - int64_t transactionsTooOld; - int64_t transactionsFutureVersions; - int64_t transactionsNotCommitted; - int64_t transactionsMaybeCommitted; - int64_t transactionsResourceConstrained; - int64_t transactionsProcessBehind; - int64_t transactionWaitsForFullRecovery; ContinuousSample latencies, readLatencies, commitLatencies, GRVLatencies, mutationsPerCommit, bytesPerCommit; int outstandingWatches; diff --git a/fdbclient/NativeAPI.actor.cpp b/fdbclient/NativeAPI.actor.cpp index 8ada99503f..b9cea4c1ad 100644 --- a/fdbclient/NativeAPI.actor.cpp +++ b/fdbclient/NativeAPI.actor.cpp @@ -208,24 +208,18 @@ template <> void addref( DatabaseContext* ptr ) { ptr->addref(); } template <> void delref( DatabaseContext* ptr ) { ptr->delref(); } ACTOR Future databaseLogger( DatabaseContext *cx ) { + state double lastLogged = 0; loop { - wait( delay( CLIENT_KNOBS->SYSTEM_MONITOR_INTERVAL, cx->taskID ) ); - TraceEvent("TransactionMetrics") + wait(delay(CLIENT_KNOBS->SYSTEM_MONITOR_INTERVAL, cx->taskID)); + TraceEvent ev("TransactionMetrics", cx->dbId); + + ev.detail("Elapsed", (lastLogged == 0) ? 0 : now() - lastLogged) .detail("Cluster", cx->cluster && cx->getConnectionFile() ? cx->getConnectionFile()->getConnectionString().clusterKeyName().toString() : "") - .detail("ReadVersions", cx->transactionReadVersions) - .detail("LogicalUncachedReads", cx->transactionLogicalReads) - .detail("PhysicalReadRequests", cx->transactionPhysicalReads) - .detail("CommittedMutations", cx->transactionCommittedMutations) - .detail("CommittedMutationBytes", cx->transactionCommittedMutationBytes) - .detail("CommitStarted", cx->transactionsCommitStarted) - .detail("CommitCompleted", cx->transactionsCommitCompleted) - .detail("TooOld", cx->transactionsTooOld) - .detail("FutureVersions", cx->transactionsFutureVersions) - .detail("NotCommitted", cx->transactionsNotCommitted) - .detail("MaybeCommitted", cx->transactionsMaybeCommitted) - .detail("ResourceConstrained", cx->transactionsResourceConstrained) - .detail("ProcessBehind", cx->transactionsProcessBehind) - .detail("MeanLatency", cx->latencies.mean()) + .detail("Internal", cx->internal); + + cx->cc.logToTraceEvent(ev); + + ev.detail("MeanLatency", cx->latencies.mean()) .detail("MedianLatency", cx->latencies.median()) .detail("Latency90", cx->latencies.percentile(0.90)) .detail("Latency98", cx->latencies.percentile(0.98)) @@ -245,12 +239,15 @@ ACTOR Future databaseLogger( DatabaseContext *cx ) { .detail("MeanBytesPerCommit", cx->bytesPerCommit.mean()) .detail("MedianBytesPerCommit", cx->bytesPerCommit.median()) .detail("MaxBytesPerCommit", cx->bytesPerCommit.max()); + cx->latencies.clear(); cx->readLatencies.clear(); cx->GRVLatencies.clear(); cx->commitLatencies.clear(); cx->mutationsPerCommit.clear(); cx->bytesPerCommit.clear(); + + lastLogged = now(); } } @@ -508,18 +505,21 @@ ACTOR static Future getHealthMetricsActor(DatabaseContext *cx, bo Future DatabaseContext::getHealthMetrics(bool detailed = false) { return getHealthMetricsActor(this, detailed); } - DatabaseContext::DatabaseContext( - Reference cluster, Reference> clientInfo, Future clientInfoMonitor, Standalone dbId, - TaskPriority taskID, LocalityData const& clientLocality, bool enableLocalityLoadBalance, bool lockAware, int apiVersion ) - : cluster(cluster), clientInfo(clientInfo), clientInfoMonitor(clientInfoMonitor), dbId(dbId), taskID(taskID), clientLocality(clientLocality), enableLocalityLoadBalance(enableLocalityLoadBalance), - lockAware(lockAware), apiVersion(apiVersion), provisional(false), - transactionReadVersions(0), transactionLogicalReads(0), transactionPhysicalReads(0), transactionCommittedMutations(0), transactionCommittedMutationBytes(0), - transactionsCommitStarted(0), transactionsCommitCompleted(0), transactionsTooOld(0), transactionsFutureVersions(0), transactionsNotCommitted(0), - transactionsMaybeCommitted(0), transactionsResourceConstrained(0), transactionsProcessBehind(0), outstandingWatches(0), transactionTimeout(0.0), transactionMaxRetries(-1), + Reference cluster, Reference> clientInfo, Future clientInfoMonitor, + TaskPriority taskID, LocalityData const& clientLocality, bool enableLocalityLoadBalance, bool lockAware, bool internal, int apiVersion ) + : cluster(cluster), clientInfo(clientInfo), clientInfoMonitor(clientInfoMonitor), taskID(taskID), clientLocality(clientLocality), enableLocalityLoadBalance(enableLocalityLoadBalance), + lockAware(lockAware), apiVersion(apiVersion), provisional(false), cc("TransactionMetrics"), + transactionReadVersions("ReadVersions", cc), transactionLogicalReads("LogicalUncachedReads", cc), transactionPhysicalReads("PhysicalReadRequests", cc), + transactionCommittedMutations("CommittedMutations", cc), transactionCommittedMutationBytes("CommittedMutationBytes", cc), transactionsCommitStarted("CommitStarted", cc), + transactionsCommitCompleted("CommitCompleted", cc), transactionsTooOld("TooOld", cc), transactionsFutureVersions("FutureVersions", cc), + transactionsNotCommitted("NotCommitted", cc), transactionsMaybeCommitted("MaybeCommitted", cc), transactionsResourceConstrained("ResourceConstrained", cc), + transactionsProcessBehind("ProcessBehind", cc), transactionWaitsForFullRecovery("WaitsForFullRecovery", cc), outstandingWatches(0), latencies(1000), readLatencies(1000), commitLatencies(1000), GRVLatencies(1000), mutationsPerCommit(1000), bytesPerCommit(1000), mvCacheInsertLocation(0), - healthMetricsLastUpdated(0), detailedHealthMetricsLastUpdated(0) + healthMetricsLastUpdated(0), detailedHealthMetricsLastUpdated(0), internal(internal) { + dbId = deterministicRandom()->randomUniqueID(); + metadataVersionCache.resize(CLIENT_KNOBS->METADATA_VERSION_CACHE_SIZE); maxOutstandingWatches = CLIENT_KNOBS->DEFAULT_MAX_OUTSTANDING_WATCHES; @@ -539,7 +539,14 @@ DatabaseContext::DatabaseContext( clientStatusUpdater.actor = clientStatusUpdateActor(this); } -DatabaseContext::DatabaseContext( const Error &err ) : deferredError(err), latencies(1000), readLatencies(1000), commitLatencies(1000), GRVLatencies(1000), mutationsPerCommit(1000), bytesPerCommit(1000) {} +DatabaseContext::DatabaseContext( const Error &err ) : deferredError(err), cc("TransactionMetrics"), + transactionReadVersions("ReadVersions", cc), transactionLogicalReads("LogicalUncachedReads", cc), transactionPhysicalReads("PhysicalReadRequests", cc), + transactionCommittedMutations("CommittedMutations", cc), transactionCommittedMutationBytes("CommittedMutationBytes", cc), transactionsCommitStarted("CommitStarted", cc), + transactionsCommitCompleted("CommitCompleted", cc), transactionsTooOld("TooOld", cc), transactionsFutureVersions("FutureVersions", cc), + transactionsNotCommitted("NotCommitted", cc), transactionsMaybeCommitted("MaybeCommitted", cc), transactionsResourceConstrained("ResourceConstrained", cc), + transactionsProcessBehind("ProcessBehind", cc), transactionWaitsForFullRecovery("WaitsForFullRecovery", cc), latencies(1000), readLatencies(1000), commitLatencies(1000), + GRVLatencies(1000), mutationsPerCommit(1000), bytesPerCommit(1000), + internal(false) {} ACTOR static Future monitorClientInfo( Reference>> clusterInterface, Reference ccf, Reference> outInfo, Reference> connectedCoordinatorsNumDelayed ) { try { @@ -632,11 +639,11 @@ Database DatabaseContext::create(Reference>> Reference> clientInfo(new AsyncVar()); Future clientInfoMonitor = delayedAsyncVar(connectedCoordinatorsNum, connectedCoordinatorsNumDelayed, CLIENT_KNOBS->CHECK_CONNECTED_COORDINATOR_NUM_DELAY) || monitorClientInfo(clusterInterface, connFile, clientInfo, connectedCoordinatorsNumDelayed); - return Database(new DatabaseContext(cluster, clientInfo, clientInfoMonitor, LiteralStringRef(""), TaskPriority::DefaultEndpoint, clientLocality, true, false)); + return Database(new DatabaseContext(cluster, clientInfo, clientInfoMonitor, TaskPriority::DefaultEndpoint, clientLocality, true, false, true)); } Database DatabaseContext::create(Reference> clientInfo, Future clientInfoMonitor, LocalityData clientLocality, bool enableLocalityLoadBalance, TaskPriority taskID, bool lockAware, int apiVersion) { - return Database( new DatabaseContext( Reference(nullptr), clientInfo, clientInfoMonitor, LiteralStringRef(""), taskID, clientLocality, enableLocalityLoadBalance, lockAware, apiVersion ) ); + return Database( new DatabaseContext( Reference(nullptr), clientInfo, clientInfoMonitor, taskID, clientLocality, enableLocalityLoadBalance, lockAware, true, apiVersion ) ); } DatabaseContext::~DatabaseContext() { @@ -816,7 +823,7 @@ Reference DatabaseContext::getConnectionFile() { return cluster->getConnectionFile(); } -Database Database::createDatabase( Reference connFile, int apiVersion, LocalityData const& clientLocality, DatabaseContext *preallocatedDb ) { +Database Database::createDatabase( Reference connFile, int apiVersion, bool internal, LocalityData const& clientLocality, DatabaseContext *preallocatedDb ) { Reference> connectedCoordinatorsNum(new AsyncVar(0)); // Number of connected coordinators for the client Reference> connectedCoordinatorsNumDelayed(new AsyncVar(0)); Reference cluster(new Cluster(connFile, connectedCoordinatorsNum, apiVersion)); @@ -825,18 +832,18 @@ Database Database::createDatabase( Reference connFile, in DatabaseContext *db; if(preallocatedDb) { - db = new (preallocatedDb) DatabaseContext(cluster, clientInfo, clientInfoMonitor, LiteralStringRef(""), TaskPriority::DefaultEndpoint, clientLocality, true, false, apiVersion); + db = new (preallocatedDb) DatabaseContext(cluster, clientInfo, clientInfoMonitor, TaskPriority::DefaultEndpoint, clientLocality, true, false, internal, apiVersion); } else { - db = new DatabaseContext(cluster, clientInfo, clientInfoMonitor, LiteralStringRef(""), TaskPriority::DefaultEndpoint, clientLocality, true, false, apiVersion); + db = new DatabaseContext(cluster, clientInfo, clientInfoMonitor, TaskPriority::DefaultEndpoint, clientLocality, true, false, internal, apiVersion); } return Database(db); } -Database Database::createDatabase( std::string connFileName, int apiVersion, LocalityData const& clientLocality ) { +Database Database::createDatabase( std::string connFileName, int apiVersion, bool internal, LocalityData const& clientLocality ) { Reference rccf = Reference(new ClusterConnectionFile(ClusterConnectionFile::lookupClusterFileName(connFileName).first)); - return Database::createDatabase(rccf, apiVersion, clientLocality); + return Database::createDatabase(rccf, apiVersion, internal, clientLocality); } extern IPAddress determinePublicIPAutomatically(ClusterConnectionString const& ccs); @@ -2718,7 +2725,7 @@ ACTOR static Future tryCommit( Database cx, Reference tr->versionstampPromise.send(ret); tr->numErrors = 0; - cx->transactionsCommitCompleted++; + ++cx->transactionsCommitCompleted; cx->transactionCommittedMutations += req.transaction.mutations.size(); cx->transactionCommittedMutationBytes += req.transaction.mutations.expectedSize(); @@ -2793,7 +2800,7 @@ Future Transaction::commitMutations() { return Void(); } - cx->transactionsCommitStarted++; + ++cx->transactionsCommitStarted; if(options.readOnly) return transaction_read_only(); @@ -3126,7 +3133,7 @@ ACTOR Future extractReadVersion(DatabaseContext* cx, Reference Transaction::getReadVersion(uint32_t flags) { - cx->transactionReadVersions++; + ++cx->transactionReadVersions; flags |= options.getReadVersionFlags; auto& batcher = cx->versionBatcher[ flags ]; @@ -3162,15 +3169,15 @@ Future Transaction::onError( Error const& e ) { e.code() == error_code_cluster_not_fully_recovered) { if(e.code() == error_code_not_committed) - cx->transactionsNotCommitted++; + ++cx->transactionsNotCommitted; if(e.code() == error_code_commit_unknown_result) - cx->transactionsMaybeCommitted++; + ++cx->transactionsMaybeCommitted; if (e.code() == error_code_proxy_memory_limit_exceeded) - cx->transactionsResourceConstrained++; + ++cx->transactionsResourceConstrained; if (e.code() == error_code_process_behind) - cx->transactionsProcessBehind++; + ++cx->transactionsProcessBehind; if (e.code() == error_code_cluster_not_fully_recovered) { - cx->transactionWaitsForFullRecovery++; + ++cx->transactionWaitsForFullRecovery; } double backoff = getBackoff(e.code()); @@ -3181,9 +3188,9 @@ Future Transaction::onError( Error const& e ) { e.code() == error_code_future_version) { if( e.code() == error_code_transaction_too_old ) - cx->transactionsTooOld++; + ++cx->transactionsTooOld; else if( e.code() == error_code_future_version ) - cx->transactionsFutureVersions++; + ++cx->transactionsFutureVersions; double maxBackoff = options.maxBackoff; reset(); diff --git a/fdbclient/NativeAPI.actor.h b/fdbclient/NativeAPI.actor.h index b7c3aa6d71..92bde7817b 100644 --- a/fdbclient/NativeAPI.actor.h +++ b/fdbclient/NativeAPI.actor.h @@ -74,8 +74,8 @@ class Database { public: enum { API_VERSION_LATEST = -1 }; - static Database createDatabase( Reference connFile, int apiVersion, LocalityData const& clientLocality=LocalityData(), DatabaseContext *preallocatedDb=nullptr ); - static Database createDatabase( std::string connFileName, int apiVersion, LocalityData const& clientLocality=LocalityData() ); + static Database createDatabase( Reference connFile, int apiVersion, bool internal=true, LocalityData const& clientLocality=LocalityData(), DatabaseContext *preallocatedDb=nullptr ); + static Database createDatabase( std::string connFileName, int apiVersion, bool internal=true, LocalityData const& clientLocality=LocalityData() ); Database() {} // an uninitialized database can be destructed or reassigned safely; that's it void operator= ( Database const& rhs ) { db = rhs.db; } diff --git a/fdbclient/ThreadSafeTransaction.actor.cpp b/fdbclient/ThreadSafeTransaction.actor.cpp index 130b1652ce..d074515dba 100644 --- a/fdbclient/ThreadSafeTransaction.actor.cpp +++ b/fdbclient/ThreadSafeTransaction.actor.cpp @@ -68,7 +68,7 @@ ThreadSafeDatabase::ThreadSafeDatabase(std::string connFilename, int apiVersion) onMainThreadVoid([db, connFile, apiVersion](){ try { - Database::createDatabase(connFile, apiVersion, LocalityData(), db).extractPtr(); + Database::createDatabase(connFile, apiVersion, false, LocalityData(), db).extractPtr(); } catch(Error &e) { new (db) DatabaseContext(e); diff --git a/fdbserver/Restore.actor.cpp b/fdbserver/Restore.actor.cpp index a221a8593d..81f82ae387 100644 --- a/fdbserver/Restore.actor.cpp +++ b/fdbserver/Restore.actor.cpp @@ -24,7 +24,7 @@ #include "flow/actorcompiler.h" // This must be the last #include. ACTOR Future restoreWorker(Reference ccf, LocalityData locality) { - state Database cx = Database::createDatabase(ccf->getFilename(), Database::API_VERSION_LATEST,locality); + state Database cx = Database::createDatabase(ccf->getFilename(), Database::API_VERSION_LATEST, true, locality); state RestoreInterface interf; interf.initEndpoints(); state Optional leaderInterf; diff --git a/fdbserver/tester.actor.cpp b/fdbserver/tester.actor.cpp index 3e977c9493..2904d96015 100644 --- a/fdbserver/tester.actor.cpp +++ b/fdbserver/tester.actor.cpp @@ -505,7 +505,7 @@ ACTOR Future testerServerWorkload( WorkloadRequest work, Reference workerServer( if(metricsPrefix.size() > 0) { if( metricsConnFile.size() > 0) { try { - state Database db = Database::createDatabase(metricsConnFile, Database::API_VERSION_LATEST, locality); + state Database db = Database::createDatabase(metricsConnFile, Database::API_VERSION_LATEST, true, locality); metricsLogger = runMetrics( db, KeyRef(metricsPrefix) ); } catch(Error &e) { TraceEvent(SevWarnAlways, "TDMetricsBadClusterFile").error(e).detail("ConnFile", metricsConnFile); diff --git a/flow/Stats.actor.cpp b/flow/Stats.actor.cpp index 8d0afa7455..751130bc25 100644 --- a/flow/Stats.actor.cpp +++ b/flow/Stats.actor.cpp @@ -69,6 +69,13 @@ void Counter::clear() { metric = 0; } +void CounterCollection::logToTraceEvent(TraceEvent &te) const { + for (ICounter* c : counters) { + te.detail(c->getName().c_str(), c); + c->resetInterval(); + } +} + ACTOR Future traceCounters(std::string traceEventName, UID traceEventID, double interval, CounterCollection* counters, std::string trackLatestName) { wait(delay(0)); // Give an opportunity for all members used in special counters to be initialized @@ -80,15 +87,12 @@ ACTOR Future traceCounters(std::string traceEventName, UID traceEventID, d loop{ TraceEvent te(traceEventName.c_str(), traceEventID); te.detail("Elapsed", now() - last_interval); - for (ICounter* c : counters->counters) { - if (c->hasRate() && c->hasRoughness()) - te.detailf(c->getName().c_str(), "%g %g %lld", c->getRate(), c->getRoughness(), (long long)c->getValue()); - else - te.detail(c->getName().c_str(), c->getValue()); - c->resetInterval(); - } - if (!trackLatestName.empty()) + + counters->logToTraceEvent(te); + + if (!trackLatestName.empty()) { te.trackLatest(trackLatestName.c_str()); + } last_interval = now(); wait(delay(interval)); diff --git a/flow/Stats.h b/flow/Stats.h index 8044c4d802..24481c3024 100644 --- a/flow/Stats.h +++ b/flow/Stats.h @@ -62,12 +62,26 @@ struct ICounter { virtual void remove() {} }; +template<> +struct Traceable : std::true_type { + static std::string toString(ICounter const *counter) { + if (counter->hasRate() && counter->hasRoughness()) { + return format("%g %g %lld", counter->getRate(), counter->getRoughness(), (long long)counter->getValue()); + } + else { + return format("%lld", (long long)counter->getValue()); + } + } +}; + struct CounterCollection { CounterCollection(std::string name, std::string id = std::string()) : name(name), id(id) {} std::vector counters, counters_to_remove; ~CounterCollection() { for (auto c : counters_to_remove) c->remove(); } std::string name; std::string id; + + void logToTraceEvent(TraceEvent& te) const; }; struct Counter : ICounter, NonCopyable { @@ -97,6 +111,13 @@ private: Int64MetricHandle metric; }; +template<> +struct Traceable : std::true_type { + static std::string toString(Counter const& counter) { + return Traceable::toString((ICounter const*)&counter); + } +}; + template struct SpecialCounter : ICounter, FastAllocated>, NonCopyable { SpecialCounter(CounterCollection& collection, std::string const& name, F && f) : name(name), f(f) { collection.counters.push_back(this); collection.counters_to_remove.push_back(this); } From 764a4591ada255cecc0e63fd0f1ebbbcba07a1c2 Mon Sep 17 00:00:00 2001 From: "A.J. Beamon" Date: Tue, 9 Jul 2019 14:17:26 -0700 Subject: [PATCH 2/3] Add a comment to internal flag --- fdbclient/DatabaseContext.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdbclient/DatabaseContext.h b/fdbclient/DatabaseContext.h index 35eb8e6f71..dfd4ef0dd0 100644 --- a/fdbclient/DatabaseContext.h +++ b/fdbclient/DatabaseContext.h @@ -134,7 +134,7 @@ public: std::map< UID, StorageServerInfo* > server_interf; UID dbId; - bool internal; + bool internal; // Only contexts created through the C client and fdbcli are non-internal CounterCollection cc; From fdd580c8788b4d4b27a90908ee8c05c9a9bf59e6 Mon Sep 17 00:00:00 2001 From: "A.J. Beamon" Date: Tue, 9 Jul 2019 15:00:11 -0700 Subject: [PATCH 3/3] Restore some variable initializations that were unintentionally removed. --- fdbclient/NativeAPI.actor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdbclient/NativeAPI.actor.cpp b/fdbclient/NativeAPI.actor.cpp index b9cea4c1ad..41be26ccfe 100644 --- a/fdbclient/NativeAPI.actor.cpp +++ b/fdbclient/NativeAPI.actor.cpp @@ -514,7 +514,7 @@ DatabaseContext::DatabaseContext( transactionCommittedMutations("CommittedMutations", cc), transactionCommittedMutationBytes("CommittedMutationBytes", cc), transactionsCommitStarted("CommitStarted", cc), transactionsCommitCompleted("CommitCompleted", cc), transactionsTooOld("TooOld", cc), transactionsFutureVersions("FutureVersions", cc), transactionsNotCommitted("NotCommitted", cc), transactionsMaybeCommitted("MaybeCommitted", cc), transactionsResourceConstrained("ResourceConstrained", cc), - transactionsProcessBehind("ProcessBehind", cc), transactionWaitsForFullRecovery("WaitsForFullRecovery", cc), outstandingWatches(0), + transactionsProcessBehind("ProcessBehind", cc), transactionWaitsForFullRecovery("WaitsForFullRecovery", cc), outstandingWatches(0), transactionTimeout(0.0), transactionMaxRetries(-1), latencies(1000), readLatencies(1000), commitLatencies(1000), GRVLatencies(1000), mutationsPerCommit(1000), bytesPerCommit(1000), mvCacheInsertLocation(0), healthMetricsLastUpdated(0), detailedHealthMetricsLastUpdated(0), internal(internal) {