diff options
author | Bernard Gorman <bernard.gorman@gmail.com> | 2018-02-02 16:02:30 +0000 |
---|---|---|
committer | Bernard Gorman <bernard.gorman@gmail.com> | 2018-02-13 11:04:43 +0000 |
commit | 1221b80ee0d65879a4c76ff98f78e92b53766cc0 (patch) | |
tree | a6e4f81b3a82160ba3663daa4e4eaac07fad652e /src/mongo/db/query/plan_executor.cpp | |
parent | ca0a855dfc0f479d85b76a640b12a259c0547310 (diff) | |
download | mongo-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.cpp | 19 |
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); |