summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/plan_executor.cpp
diff options
context:
space:
mode:
authorBernard Gorman <bernard.gorman@gmail.com>2018-02-02 16:02:30 +0000
committerBernard Gorman <bernard.gorman@gmail.com>2018-02-13 11:04:43 +0000
commit1221b80ee0d65879a4c76ff98f78e92b53766cc0 (patch)
treea6e4f81b3a82160ba3663daa4e4eaac07fad652e /src/mongo/db/query/plan_executor.cpp
parentca0a855dfc0f479d85b76a640b12a259c0547310 (diff)
downloadmongo-1221b80ee0d65879a4c76ff98f78e92b53766cc0.tar.gz
SERVER-32912 Ensure that killCursors always invalidates a pinned cursor
Diffstat (limited to 'src/mongo/db/query/plan_executor.cpp')
-rw-r--r--src/mongo/db/query/plan_executor.cpp19
1 files changed, 9 insertions, 10 deletions
diff --git a/src/mongo/db/query/plan_executor.cpp b/src/mongo/db/query/plan_executor.cpp
index b3ad1aa08d0..a85210d0751 100644
--- a/src/mongo/db/query/plan_executor.cpp
+++ b/src/mongo/db/query/plan_executor.cpp
@@ -370,9 +370,7 @@ Status PlanExecutor::restoreStateWithoutRetrying() {
}
_currentState = kUsable;
- return isMarkedAsKilled()
- ? Status{ErrorCodes::QueryPlanKilled, "query killed during yield: " + *_killReason}
- : Status::OK();
+ return _killStatus;
}
void PlanExecutor::detachFromOperationContext() {
@@ -501,10 +499,8 @@ PlanExecutor::ExecState PlanExecutor::getNextImpl(Snapshotted<BSONObj>* objOut,
invariant(_currentState == kUsable);
if (isMarkedAsKilled()) {
if (NULL != objOut) {
- Status status(ErrorCodes::OperationFailed,
- str::stream() << "Operation aborted because: " << *_killReason);
*objOut = Snapshotted<BSONObj>(SnapshotId(),
- WorkingSetCommon::buildMemberStatusObject(status));
+ WorkingSetCommon::buildMemberStatusObject(_killStatus));
}
return PlanExecutor::DEAD;
}
@@ -646,8 +642,12 @@ bool PlanExecutor::isEOF() {
return isMarkedAsKilled() || (_stash.empty() && _root->isEOF());
}
-void PlanExecutor::markAsKilled(string reason) {
- _killReason = std::move(reason);
+void PlanExecutor::markAsKilled(Status killStatus) {
+ invariant(!killStatus.isOK());
+ // If killed multiple times, only retain the first status.
+ if (_killStatus.isOK()) {
+ _killStatus = killStatus;
+ }
}
void PlanExecutor::dispose(OperationContext* opCtx, CursorManager* cursorManager) {
@@ -678,8 +678,7 @@ Status PlanExecutor::executePlan() {
if (PlanExecutor::DEAD == state || PlanExecutor::FAILURE == state) {
if (isMarkedAsKilled()) {
- return Status(ErrorCodes::QueryPlanKilled,
- str::stream() << "Operation aborted because: " << *_killReason);
+ return _killStatus;
}
auto errorStatus = WorkingSetCommon::getMemberObjectStatus(obj);