summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTed Tuckman <ted.tuckman@mongodb.com>2018-10-02 17:12:12 -0400
committerTed Tuckman <ted.tuckman@mongodb.com>2018-10-09 10:59:41 -0400
commitaddc24e5dcc8c2053df56697d35162a8776446e5 (patch)
tree16990f2d3dccbfe5e9e7f360339b04c98fd85077 /src
parent3dc5e5979bc9a4a914b0a479e88e70078bd02552 (diff)
downloadmongo-addc24e5dcc8c2053df56697d35162a8776446e5.tar.gz
SERVER-37007 Add planSummary to idleCursor
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/clientcursor.cpp5
-rw-r--r--src/mongo/db/clientcursor.h11
-rw-r--r--src/mongo/db/generic_cursor.idl4
-rw-r--r--src/mongo/db/pipeline/mongo_process_common.cpp20
4 files changed, 35 insertions, 5 deletions
diff --git a/src/mongo/db/clientcursor.cpp b/src/mongo/db/clientcursor.cpp
index 756f1fbc7eb..92e6a1ffb30 100644
--- a/src/mongo/db/clientcursor.cpp
+++ b/src/mongo/db/clientcursor.cpp
@@ -47,6 +47,7 @@
#include "mongo/db/commands/server_status_metric.h"
#include "mongo/db/cursor_server_params.h"
#include "mongo/db/jsobj.h"
+#include "mongo/db/query/explain.h"
#include "mongo/db/repl/repl_client_info.h"
#include "mongo/db/repl/replication_coordinator.h"
#include "mongo/util/background.h"
@@ -92,7 +93,8 @@ ClientCursor::ClientCursor(ClientCursorParams params,
_exec(std::move(params.exec)),
_operationUsingCursor(operationUsingCursor),
_lastUseDate(now),
- _createdDate(now) {
+ _createdDate(now),
+ _planSummary(Explain::getPlanSummary(_exec.get())) {
invariant(_cursorManager);
invariant(_exec);
invariant(_operationUsingCursor);
@@ -143,6 +145,7 @@ GenericCursor ClientCursor::toGenericCursor() const {
gc.setLastAccessDate(getLastUseDate());
gc.setCreatedDate(getCreatedDate());
gc.setNBatchesReturned(getNBatches());
+ gc.setPlanSummary(getPlanSummary());
if (auto opCtx = _operationUsingCursor) {
gc.setOperationUsingCursorId(opCtx->getOpID());
}
diff --git a/src/mongo/db/clientcursor.h b/src/mongo/db/clientcursor.h
index 96cae17da5b..83b326b93da 100644
--- a/src/mongo/db/clientcursor.h
+++ b/src/mongo/db/clientcursor.h
@@ -209,6 +209,14 @@ public:
return _createdDate;
}
+ void setPlanSummary(std::string ps) {
+ _planSummary = std::move(ps);
+ }
+
+ StringData getPlanSummary() const {
+ return StringData(_planSummary);
+ }
+
/**
* Returns a generic cursor containing diagnostics about this cursor.
* The caller must either have this cursor pinned or hold a mutex from the cursor manager.
@@ -374,6 +382,9 @@ private:
Date_t _lastUseDate;
Date_t _createdDate;
+
+ // A string with the plan summary of the cursor's query.
+ std::string _planSummary;
};
/**
diff --git a/src/mongo/db/generic_cursor.idl b/src/mongo/db/generic_cursor.idl
index 24661fa9221..2792a9db88e 100644
--- a/src/mongo/db/generic_cursor.idl
+++ b/src/mongo/db/generic_cursor.idl
@@ -71,6 +71,10 @@ structs:
lsid:
type: LogicalSessionId
optional: true
+ planSummary:
+ description: The plan summary of this cursor's query.
+ type: string
+ optional: true
operationUsingCursorId:
description: The op ID of the operation pinning the cursor. Will be empty for idle cursors.
type: long
diff --git a/src/mongo/db/pipeline/mongo_process_common.cpp b/src/mongo/db/pipeline/mongo_process_common.cpp
index aae991ba05f..1c97921e237 100644
--- a/src/mongo/db/pipeline/mongo_process_common.cpp
+++ b/src/mongo/db/pipeline/mongo_process_common.cpp
@@ -78,10 +78,22 @@ std::vector<BSONObj> MongoProcessCommon::getCurrentOps(
if (cursorMode == CurrentOpCursorMode::kIncludeCursors) {
for (auto&& cursor : getIdleCursors(expCtx, userMode)) {
- ops.push_back(BSON("type"
- << "idleCursor"
- << "cursor"
- << cursor.toBSON()));
+ BSONObjBuilder cursorObj;
+ cursorObj.append("type", "idleCursor");
+ // On mongos, planSummary is not present.
+ auto planSummaryData = cursor.getPlanSummary();
+ if (planSummaryData) {
+ auto planSummaryText = planSummaryData->toString();
+ // Plan summary has to appear in the top level object, not the cursor object.
+ // We remove it, create the op, then put it back.
+ cursor.setPlanSummary(boost::none);
+ cursorObj.append("planSummary", planSummaryText);
+ cursorObj.append("cursor", cursor.toBSON());
+ cursor.setPlanSummary(StringData(planSummaryText));
+ } else {
+ cursorObj.append("cursor", cursor.toBSON());
+ }
+ ops.emplace_back(cursorObj.obj());
}
}