summaryrefslogtreecommitdiff
path: root/src/mongo/db/curop.cpp
diff options
context:
space:
mode:
authorIrina Yatsenko <irina.yatsenko@mongodb.com>2021-04-29 23:42:13 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-05-12 18:36:03 +0000
commit265ba00b96161463bc2a6d8640098d3ac4e4b70a (patch)
tree819a268613c34917b85c8b1ac530c2d05934039b /src/mongo/db/curop.cpp
parent1c7969556696ff8bce4b213c3d85598d0961cd2b (diff)
downloadmongo-265ba00b96161463bc2a6d8640098d3ac4e4b70a.tar.gz
SERVER-50286 Indicate in logs whether an operation involves a view
Diffstat (limited to 'src/mongo/db/curop.cpp')
-rw-r--r--src/mongo/db/curop.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/mongo/db/curop.cpp b/src/mongo/db/curop.cpp
index 32dd1a531d4..20bc4610e65 100644
--- a/src/mongo/db/curop.cpp
+++ b/src/mongo/db/curop.cpp
@@ -882,6 +882,10 @@ string OpDebug::report(OperationContext* opCtx, const SingleThreadedLockStats* l
s << " dataThroughputAverage: " << *dataThroughputAverage << " MB/sec";
}
+ if (!resolvedViews.empty()) {
+ s << " resolvedViews: " << getResolvedViewsInfo();
+ }
+
OPDEBUG_TOSTRING_HELP(nShards);
OPDEBUG_TOSTRING_HELP(cursorid);
if (mongotCursorId) {
@@ -1061,6 +1065,10 @@ void OpDebug::report(OperationContext* opCtx,
pAttrs->add("dataThroughputAverageMBPerSec", *dataThroughputAverage);
}
+ if (!resolvedViews.empty()) {
+ pAttrs->add("resolvedViews", getResolvedViewsInfo());
+ }
+
OPDEBUG_TOATTR_HELP(nShards);
OPDEBUG_TOATTR_HELP(cursorid);
if (mongotCursorId) {
@@ -1205,6 +1213,10 @@ void OpDebug::append(OperationContext* opCtx,
appendAsObjOrString("originatingCommand", originatingCommand, appendMaxElementSize, &b);
}
+ if (!resolvedViews.empty()) {
+ appendResolvedViewsInfo(b);
+ }
+
OPDEBUG_APPEND_NUMBER(b, nShards);
OPDEBUG_APPEND_NUMBER(b, cursorid);
if (mongotCursorId) {
@@ -1667,6 +1679,55 @@ BSONObj OpDebug::makeMongotDebugStatsObject() const {
return cursorBuilder.obj();
}
+void OpDebug::addResolvedViews(const std::vector<NamespaceString>& namespaces,
+ const std::vector<BSONObj>& pipeline) {
+ if (namespaces.empty())
+ return;
+
+ if (resolvedViews.find(namespaces.front()) == resolvedViews.end()) {
+ resolvedViews[namespaces.front()] = std::make_pair(namespaces, pipeline);
+ }
+}
+
+static void appendResolvedViewsInfoImpl(
+ BSONArrayBuilder& resolvedViewsArr,
+ const std::map<NamespaceString, std::pair<std::vector<NamespaceString>, std::vector<BSONObj>>>&
+ resolvedViews) {
+ for (const auto& kv : resolvedViews) {
+ const NamespaceString& viewNss = kv.first;
+ const std::vector<NamespaceString>& dependencies = kv.second.first;
+ const std::vector<BSONObj>& pipeline = kv.second.second;
+
+ BSONObjBuilder aView;
+ aView.append("viewNamespace", viewNss.ns());
+
+ BSONArrayBuilder dependenciesArr(aView.subarrayStart("dependencyChain"));
+ for (const auto& nss : dependencies) {
+ dependenciesArr.append(nss.coll().toString());
+ }
+ dependenciesArr.doneFast();
+
+ BSONArrayBuilder pipelineArr(aView.subarrayStart("resolvedPipeline"));
+ for (const auto& stage : pipeline) {
+ pipelineArr.append(stage);
+ }
+ pipelineArr.doneFast();
+
+ resolvedViewsArr.append(redact(aView.done()));
+ }
+}
+
+BSONArray OpDebug::getResolvedViewsInfo() const {
+ BSONArrayBuilder resolvedViewsArr;
+ appendResolvedViewsInfoImpl(resolvedViewsArr, this->resolvedViews);
+ return resolvedViewsArr.arr();
+}
+
+void OpDebug::appendResolvedViewsInfo(BSONObjBuilder& builder) const {
+ BSONArrayBuilder resolvedViewsArr(builder.subarrayStart("resolvedViews"));
+ appendResolvedViewsInfoImpl(resolvedViewsArr, this->resolvedViews);
+ resolvedViewsArr.doneFast();
+}
namespace {