diff options
author | Irina Yatsenko <irina.yatsenko@mongodb.com> | 2021-04-29 23:42:13 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-05-12 18:36:03 +0000 |
commit | 265ba00b96161463bc2a6d8640098d3ac4e4b70a (patch) | |
tree | 819a268613c34917b85c8b1ac530c2d05934039b /src/mongo/db/curop.cpp | |
parent | 1c7969556696ff8bce4b213c3d85598d0961cd2b (diff) | |
download | mongo-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.cpp | 61 |
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 { |