summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands
diff options
context:
space:
mode:
authorJames Wahlin <james.wahlin@10gen.com>2016-08-25 08:36:22 -0400
committerJames Wahlin <james.wahlin@10gen.com>2016-08-26 16:45:30 -0400
commita4a9a9ad29415239091db171e01f45677464f668 (patch)
tree461bbdd6275712543b617ce6e8b8bbc313ffb9e0 /src/mongo/db/commands
parent752dcf912d5e45c8614ed749e20982e69cc89813 (diff)
downloadmongo-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.cpp22
-rw-r--r--src/mongo/db/commands/list_collections.cpp10
-rw-r--r--src/mongo/db/commands/list_indexes.cpp13
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;
}