diff options
author | James Wahlin <james.wahlin@10gen.com> | 2016-08-25 08:36:22 -0400 |
---|---|---|
committer | James Wahlin <james.wahlin@10gen.com> | 2016-08-26 16:45:30 -0400 |
commit | a4a9a9ad29415239091db171e01f45677464f668 (patch) | |
tree | 461bbdd6275712543b617ce6e8b8bbc313ffb9e0 /src/mongo/db/commands | |
parent | 752dcf912d5e45c8614ed749e20982e69cc89813 (diff) | |
download | mongo-a4a9a9ad29415239091db171e01f45677464f668.tar.gz |
SERVER-24771 Support killCursors & mongos getMore on view namespace
Diffstat (limited to 'src/mongo/db/commands')
-rw-r--r-- | src/mongo/db/commands/killcursors_cmd.cpp | 22 | ||||
-rw-r--r-- | src/mongo/db/commands/list_collections.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/commands/list_indexes.cpp | 13 |
3 files changed, 29 insertions, 16 deletions
diff --git a/src/mongo/db/commands/killcursors_cmd.cpp b/src/mongo/db/commands/killcursors_cmd.cpp index ac43fa77680..4c85e5f8f99 100644 --- a/src/mongo/db/commands/killcursors_cmd.cpp +++ b/src/mongo/db/commands/killcursors_cmd.cpp @@ -32,6 +32,7 @@ #include "mongo/db/catalog/collection.h" #include "mongo/db/catalog/cursor_manager.h" #include "mongo/db/commands/killcursors_common.h" +#include "mongo/db/curop.h" #include "mongo/db/db_raii.h" #include "mongo/db/query/killcursors_request.h" @@ -45,7 +46,7 @@ public: private: Status _killCursor(OperationContext* txn, const NamespaceString& nss, CursorId cursorId) final { - std::unique_ptr<AutoGetCollectionForRead> ctx; + std::unique_ptr<AutoGetCollectionOrViewForRead> ctx; CursorManager* cursorManager; if (nss.isListIndexesCursorNS() || nss.isListCollectionsCursorNS()) { @@ -54,8 +55,25 @@ private: // data within a collection. cursorManager = CursorManager::getGlobalCursorManager(); } else { - ctx = stdx::make_unique<AutoGetCollectionForRead>(txn, nss); + ctx = stdx::make_unique<AutoGetCollectionOrViewForRead>(txn, nss); Collection* collection = ctx->getCollection(); + ViewDefinition* view = ctx->getView(); + if (view) { + Database* db = ctx->getDb(); + auto resolved = db->getViewCatalog()->resolveView(txn, nss); + if (!resolved.isOK()) { + return resolved.getStatus(); + } + ctx->releaseLocksForView(); + Status status = _killCursor(txn, resolved.getValue().getNamespace(), cursorId); + { + // Set the namespace of the curop back to the view namespace so ctx records + // stats on this view namespace on destruction. + stdx::lock_guard<Client>(*txn->getClient()); + CurOp::get(txn)->setNS_inlock(nss.ns()); + } + return status; + } if (!collection) { return {ErrorCodes::CursorNotFound, str::stream() << "collection does not exist: " << nss.ns()}; diff --git a/src/mongo/db/commands/list_collections.cpp b/src/mongo/db/commands/list_collections.cpp index 87a3c8a30e8..d3dce59c032 100644 --- a/src/mongo/db/commands/list_collections.cpp +++ b/src/mongo/db/commands/list_collections.cpp @@ -265,12 +265,10 @@ public: }); } - const std::string cursorNamespace = str::stream() << dbname << ".$cmd." << getName(); - dassert(NamespaceString(cursorNamespace).isValid()); - dassert(NamespaceString(cursorNamespace).isListCollectionsCursorNS()); + const NamespaceString cursorNss = NamespaceString::makeListCollectionsNSS(dbname); auto statusWithPlanExecutor = PlanExecutor::make( - txn, std::move(ws), std::move(root), cursorNamespace, PlanExecutor::YIELD_MANUAL); + txn, std::move(ws), std::move(root), cursorNss.ns(), PlanExecutor::YIELD_MANUAL); if (!statusWithPlanExecutor.isOK()) { return appendCommandStatus(result, statusWithPlanExecutor.getStatus()); } @@ -302,12 +300,12 @@ public: ClientCursor* cursor = new ClientCursor(CursorManager::getGlobalCursorManager(), exec.release(), - cursorNamespace, + cursorNss.ns(), txn->recoveryUnit()->isReadingFromMajorityCommittedSnapshot()); cursorId = cursor->cursorid(); } - appendCursorResponseObject(cursorId, cursorNamespace, firstBatch.arr(), &result); + appendCursorResponseObject(cursorId, cursorNss.ns(), firstBatch.arr(), &result); return true; } diff --git a/src/mongo/db/commands/list_indexes.cpp b/src/mongo/db/commands/list_indexes.cpp index fb32aad5a25..a943061a510 100644 --- a/src/mongo/db/commands/list_indexes.cpp +++ b/src/mongo/db/commands/list_indexes.cpp @@ -171,14 +171,11 @@ public: root->pushBack(id); } - const std::string cursorNamespace = str::stream() << dbname << ".$cmd." << getName() << "." - << ns.coll(); - dassert(NamespaceString(cursorNamespace).isValid()); - dassert(NamespaceString(cursorNamespace).isListIndexesCursorNS()); - dassert(ns == NamespaceString(cursorNamespace).getTargetNSForListIndexes()); + const NamespaceString cursorNss = NamespaceString::makeListIndexesNSS(dbname, ns.coll()); + dassert(ns == cursorNss.getTargetNSForListIndexes()); auto statusWithPlanExecutor = PlanExecutor::make( - txn, std::move(ws), std::move(root), cursorNamespace, PlanExecutor::YIELD_MANUAL); + txn, std::move(ws), std::move(root), cursorNss.ns(), PlanExecutor::YIELD_MANUAL); if (!statusWithPlanExecutor.isOK()) { return appendCommandStatus(result, statusWithPlanExecutor.getStatus()); } @@ -210,12 +207,12 @@ public: ClientCursor* cursor = new ClientCursor(CursorManager::getGlobalCursorManager(), exec.release(), - cursorNamespace, + cursorNss.ns(), txn->recoveryUnit()->isReadingFromMajorityCommittedSnapshot()); cursorId = cursor->cursorid(); } - appendCursorResponseObject(cursorId, cursorNamespace, firstBatch.arr(), &result); + appendCursorResponseObject(cursorId, cursorNss.ns(), firstBatch.arr(), &result); return true; } |