From 28a6425d9e773c3a0d6879f65b4e2ee47c96fd21 Mon Sep 17 00:00:00 2001 From: Daniel Gottlieb Date: Tue, 9 Apr 2019 16:26:57 -0400 Subject: SERVER-39848: Add flow control diagnostics. --- src/mongo/db/curop.cpp | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'src/mongo/db/curop.cpp') diff --git a/src/mongo/db/curop.cpp b/src/mongo/db/curop.cpp index cb18faa1337..068de93ec44 100644 --- a/src/mongo/db/curop.cpp +++ b/src/mongo/db/curop.cpp @@ -433,7 +433,10 @@ bool CurOp::completeAndLogOperation(OperationContext* opCtx, << "Interrupted while trying to gather storage statistics for a slow operation"; } } - log(component) << _debug.report(client, *this, (lockerInfo ? &lockerInfo->stats : nullptr)); + log(component) << _debug.report(client, + *this, + (lockerInfo ? &lockerInfo->stats : nullptr), + opCtx->lockState()->getFlowControlStats()); } // Return 'true' if this operation should also be added to the profiler. @@ -598,7 +601,8 @@ StringData getProtoString(int op) { string OpDebug::report(Client* client, const CurOp& curop, - const SingleThreadedLockStats* lockStats) const { + const SingleThreadedLockStats* lockStats, + FlowControlTicketholder::CurOp flowControlStats) const { StringBuilder s; if (iscommand) s << "command "; @@ -699,6 +703,11 @@ string OpDebug::report(Client* client, s << " locks:" << locks.obj().toString(); } + BSONObj flowControlObj = makeFlowControlObject(flowControlStats); + if (flowControlObj.nFields() > 0) { + s << " flowControl:" << flowControlObj.toString(); + } + if (storageStats) { s << " storage:" << storageStats->toBSON().toString(); } @@ -724,6 +733,7 @@ string OpDebug::report(Client* client, void OpDebug::append(const CurOp& curop, const SingleThreadedLockStats& lockStats, + FlowControlTicketholder::CurOp flowControlStats, BSONObjBuilder& b) const { const size_t maxElementSize = 50 * 1024; @@ -776,6 +786,12 @@ void OpDebug::append(const CurOp& curop, lockStats.report(&locks); } + { + BSONObj flowControlMetrics = makeFlowControlObject(flowControlStats); + BSONObjBuilder flowControlBuilder(b.subobjStart("flowControl")); + flowControlBuilder.appendElements(flowControlMetrics); + } + if (storageStats) { b.append("storage", storageStats->toBSON()); } @@ -813,6 +829,24 @@ void OpDebug::setPlanSummaryMetrics(const PlanSummaryStats& planSummaryStats) { replanned = planSummaryStats.replanned; } +BSONObj OpDebug::makeFlowControlObject(FlowControlTicketholder::CurOp stats) const { + BSONObjBuilder builder; + if (stats.ticketsAcquired > 0) { + builder.append("acquireCount", stats.ticketsAcquired); + } + + if (stats.acquireWaitCount > 0) { + builder.append("acquireWaitCount", stats.acquireWaitCount); + } + + if (stats.timeAcquiringMicros > 0) { + builder.append("timeAcquiringMicros", stats.timeAcquiringMicros); + } + + return builder.obj(); +} + + namespace { /** -- cgit v1.2.1