/** * Test that an attempt to kill a pinned cursor succeeds with more than one client. */ TEST_F(CursorManagerTest, ShouldBeAbleToKillPinnedCursorMultiClient) { CursorManager* cursorManager = useCursorManager(); const bool shouldAudit = false; OperationContext* const pinningOpCtx = _opCtx.get(); // Pin the cursor from one client. auto cursorPin = cursorManager->registerCursor(pinningOpCtx, {makeFakePlanExecutor(), kTestNss, {}, repl::ReadConcernLevel::kLocalReadConcern, BSONObj()}); auto cursorId = cursorPin.getCursor()->cursorid(); // Set up another client to kill the cursor. auto killCursorClientOwned = getGlobalServiceContext()->makeClient("killCursorClient"); // Keep around a raw pointer for when we transfer ownership of killingClientOwned to the global // current client. Client* killCursorClient = killCursorClientOwned.get(); // Need to swap the current client in order to make an operation context. auto pinningClient = Client::releaseCurrent(); Client::setCurrent(std::move(killCursorClientOwned)); auto killCursorOpCtx = killCursorClient->makeOperationContext(); invariant(killCursorOpCtx); ASSERT_OK(cursorManager->killCursor(killCursorOpCtx.get(), cursorId, shouldAudit)); // The original operation should have been interrupted since the cursor was pinned. ASSERT_EQ(pinningOpCtx->checkForInterruptNoAssert(), ErrorCodes::CursorKilled); }
/** * Test that an attempt to kill a pinned cursor succeeds. */ TEST_F(CursorManagerTest, ShouldBeAbleToKillPinnedCursor) { CursorManager* cursorManager = useCursorManager(); const bool shouldAudit = false; OperationContext* const pinningOpCtx = _opCtx.get(); auto cursorPin = cursorManager->registerCursor(pinningOpCtx, {makeFakePlanExecutor(), kTestNss, {}, repl::ReadConcernLevel::kLocalReadConcern, BSONObj()}); auto cursorId = cursorPin.getCursor()->cursorid(); ASSERT_OK(cursorManager->killCursor(_opCtx.get(), cursorId, shouldAudit)); // The original operation should have been interrupted since the cursor was pinned. ASSERT_EQ(pinningOpCtx->checkForInterruptNoAssert(), ErrorCodes::CursorKilled); }