diff options
author | William Schultz <william.schultz@mongodb.com> | 2018-11-15 18:13:44 -0500 |
---|---|---|
committer | William Schultz <william.schultz@mongodb.com> | 2018-11-15 18:13:44 -0500 |
commit | 72789f5739982af1cbdb1dd4fa181c4924f657b3 (patch) | |
tree | 24c2087ed4e3cdbb0f3a4c180669eb40623a3b75 /src | |
parent | 8caf07e68313dea0bd60dd4bdfa6fe85bca40b69 (diff) | |
download | mongo-72789f5739982af1cbdb1dd4fa181c4924f657b3.tar.gz |
SERVER-37560 Store ReadConcernArgs on cursor object instead of ReadConcernLevel
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/clientcursor.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/clientcursor.h | 12 | ||||
-rw-r--r-- | src/mongo/db/commands/find_cmd.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/commands/getmore_cmd.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/commands/list_collections.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/commands/list_indexes.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/commands/repair_cursor.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/commands/run_aggregate.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/query/find.cpp | 4 | ||||
-rw-r--r-- | src/mongo/dbtests/cursor_manager_test.cpp | 166 |
10 files changed, 105 insertions, 92 deletions
diff --git a/src/mongo/db/clientcursor.cpp b/src/mongo/db/clientcursor.cpp index 8c489cb3b8e..fc7a1110052 100644 --- a/src/mongo/db/clientcursor.cpp +++ b/src/mongo/db/clientcursor.cpp @@ -88,7 +88,7 @@ ClientCursor::ClientCursor(ClientCursorParams params, _authenticatedUsers(std::move(params.authenticatedUsers)), _lsid(operationUsingCursor->getLogicalSessionId()), _txnNumber(operationUsingCursor->getTxnNumber()), - _readConcernLevel(params.readConcernLevel), + _readConcernArgs(params.readConcernArgs), _cursorManager(cursorManager), _originatingCommand(params.originatingCommandObj), _queryOptions(params.queryOptions), diff --git a/src/mongo/db/clientcursor.h b/src/mongo/db/clientcursor.h index 733cd53df4f..dc751a06318 100644 --- a/src/mongo/db/clientcursor.h +++ b/src/mongo/db/clientcursor.h @@ -58,11 +58,11 @@ struct ClientCursorParams { ClientCursorParams(std::unique_ptr<PlanExecutor, PlanExecutor::Deleter> planExecutor, NamespaceString nss, UserNameIterator authenticatedUsersIter, - repl::ReadConcernLevel readConcernLevel, + repl::ReadConcernArgs readConcernArgs, BSONObj originatingCommandObj) : exec(std::move(planExecutor)), nss(std::move(nss)), - readConcernLevel(readConcernLevel), + readConcernArgs(readConcernArgs), queryOptions(exec->getCanonicalQuery() ? exec->getCanonicalQuery()->getQueryRequest().getOptions() : 0), @@ -89,7 +89,7 @@ struct ClientCursorParams { std::unique_ptr<PlanExecutor, PlanExecutor::Deleter> exec; const NamespaceString nss; std::vector<UserName> authenticatedUsers; - const repl::ReadConcernLevel readConcernLevel; + const repl::ReadConcernArgs readConcernArgs; int queryOptions = 0; BSONObj originatingCommandObj; }; @@ -134,8 +134,8 @@ public: return _txnNumber; } - repl::ReadConcernLevel getReadConcernLevel() const { - return _readConcernLevel; + repl::ReadConcernArgs getReadConcernArgs() const { + return _readConcernArgs; } /** @@ -328,7 +328,7 @@ private: // A transaction number for this cursor, if it was provided in the originating command. const boost::optional<TxnNumber> _txnNumber; - const repl::ReadConcernLevel _readConcernLevel; + const repl::ReadConcernArgs _readConcernArgs; CursorManager* _cursorManager; diff --git a/src/mongo/db/commands/find_cmd.cpp b/src/mongo/db/commands/find_cmd.cpp index 9e75b094d25..9ba9d24b277 100644 --- a/src/mongo/db/commands/find_cmd.cpp +++ b/src/mongo/db/commands/find_cmd.cpp @@ -373,7 +373,7 @@ public: {std::move(exec), nss, AuthorizationSession::get(opCtx->getClient())->getAuthenticatedUserNames(), - repl::ReadConcernArgs::get(opCtx).getLevel(), + repl::ReadConcernArgs::get(opCtx), _request.body}); cursorId = pinnedCursor.getCursor()->cursorid(); diff --git a/src/mongo/db/commands/getmore_cmd.cpp b/src/mongo/db/commands/getmore_cmd.cpp index 570599ec90d..ff1748d6c83 100644 --- a/src/mongo/db/commands/getmore_cmd.cpp +++ b/src/mongo/db/commands/getmore_cmd.cpp @@ -371,7 +371,8 @@ public: const auto replicationMode = repl::ReplicationCoordinator::get(opCtx)->getReplicationMode(); if (replicationMode == repl::ReplicationCoordinator::modeReplSet && - cursor->getReadConcernLevel() == repl::ReadConcernLevel::kMajorityReadConcern) { + cursor->getReadConcernArgs().getLevel() == + repl::ReadConcernLevel::kMajorityReadConcern) { opCtx->recoveryUnit()->setTimestampReadSource( RecoveryUnit::ReadSource::kMajorityCommitted); uassertStatusOK(opCtx->recoveryUnit()->obtainMajorityCommittedSnapshot()); diff --git a/src/mongo/db/commands/list_collections.cpp b/src/mongo/db/commands/list_collections.cpp index 2814db52b84..9ec3c768989 100644 --- a/src/mongo/db/commands/list_collections.cpp +++ b/src/mongo/db/commands/list_collections.cpp @@ -373,7 +373,7 @@ public: {std::move(exec), cursorNss, AuthorizationSession::get(opCtx->getClient())->getAuthenticatedUserNames(), - repl::ReadConcernArgs::get(opCtx).getLevel(), + repl::ReadConcernArgs::get(opCtx), jsobj}); appendCursorResponseObject( diff --git a/src/mongo/db/commands/list_indexes.cpp b/src/mongo/db/commands/list_indexes.cpp index 42a04b27d48..7e62d8272a3 100644 --- a/src/mongo/db/commands/list_indexes.cpp +++ b/src/mongo/db/commands/list_indexes.cpp @@ -220,7 +220,7 @@ public: {std::move(exec), cursorNss, AuthorizationSession::get(opCtx->getClient())->getAuthenticatedUserNames(), - repl::ReadConcernArgs::get(opCtx).getLevel(), + repl::ReadConcernArgs::get(opCtx), cmdObj}); appendCursorResponseObject( diff --git a/src/mongo/db/commands/repair_cursor.cpp b/src/mongo/db/commands/repair_cursor.cpp index 7c617ee2ab4..ae43ab43e63 100644 --- a/src/mongo/db/commands/repair_cursor.cpp +++ b/src/mongo/db/commands/repair_cursor.cpp @@ -105,7 +105,7 @@ public: {std::move(exec), ns, AuthorizationSession::get(opCtx->getClient())->getAuthenticatedUserNames(), - repl::ReadConcernArgs::get(opCtx).getLevel(), + repl::ReadConcernArgs::get(opCtx), cmdObj}); appendCursorResponseObject( diff --git a/src/mongo/db/commands/run_aggregate.cpp b/src/mongo/db/commands/run_aggregate.cpp index f79cfe03dc0..98fc17718fc 100644 --- a/src/mongo/db/commands/run_aggregate.cpp +++ b/src/mongo/db/commands/run_aggregate.cpp @@ -595,7 +595,7 @@ Status runAggregate(OperationContext* opCtx, std::move(execs[idx]), origNss, AuthorizationSession::get(opCtx->getClient())->getAuthenticatedUserNames(), - repl::ReadConcernArgs::get(opCtx).getLevel(), + repl::ReadConcernArgs::get(opCtx), cmdObj); if (expCtx->tailableMode == TailableModeEnum::kTailable) { cursorParams.setTailable(true); diff --git a/src/mongo/db/query/find.cpp b/src/mongo/db/query/find.cpp index 08d43c05df0..bdeeb907c45 100644 --- a/src/mongo/db/query/find.cpp +++ b/src/mongo/db/query/find.cpp @@ -356,7 +356,7 @@ Message getMore(OperationContext* opCtx, const auto replicationMode = repl::ReplicationCoordinator::get(opCtx)->getReplicationMode(); if (replicationMode == repl::ReplicationCoordinator::modeReplSet && - cc->getReadConcernLevel() == repl::ReadConcernLevel::kMajorityReadConcern) { + cc->getReadConcernArgs().getLevel() == repl::ReadConcernLevel::kMajorityReadConcern) { opCtx->recoveryUnit()->setTimestampReadSource( RecoveryUnit::ReadSource::kMajorityCommitted); uassertStatusOK(opCtx->recoveryUnit()->obtainMajorityCommittedSnapshot()); @@ -676,7 +676,7 @@ std::string runQuery(OperationContext* opCtx, {std::move(exec), nss, AuthorizationSession::get(opCtx->getClient())->getAuthenticatedUserNames(), - readConcernArgs.getLevel(), + readConcernArgs, upconvertedQuery}); ccId = pinnedCursor.getCursor()->cursorid(); diff --git a/src/mongo/dbtests/cursor_manager_test.cpp b/src/mongo/dbtests/cursor_manager_test.cpp index af26c405b2f..9fd6890baed 100644 --- a/src/mongo/dbtests/cursor_manager_test.cpp +++ b/src/mongo/dbtests/cursor_manager_test.cpp @@ -113,7 +113,7 @@ public: return {makeFakePlanExecutor(opCtx), kTestNss, {}, - repl::ReadConcernLevel::kLocalReadConcern, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), BSONObj()}; } @@ -155,7 +155,7 @@ TEST_F(CursorManagerTest, GlobalCursorManagerShouldReportOwnershipOfCursorsItCre {makeFakePlanExecutor(), NamespaceString{"test.collection"}, {}, - repl::ReadConcernLevel::kLocalReadConcern, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), BSONObj()}); ASSERT_TRUE(CursorManager::isGloballyManagedCursor(cursorPin.getCursor()->cursorid())); } @@ -166,12 +166,13 @@ TEST_F(CursorManagerTest, CursorManager* cursorManager = useCursorManager(); auto opCtx = cc().makeOperationContext(); for (int i = 0; i < 1000; i++) { - auto cursorPin = cursorManager->registerCursor(_opCtx.get(), - {makeFakePlanExecutor(), - kTestNss, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + _opCtx.get(), + {makeFakePlanExecutor(), + kTestNss, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); ASSERT_FALSE(CursorManager::isGloballyManagedCursor(cursorPin.getCursor()->cursorid())); } } @@ -185,12 +186,13 @@ TEST_F(CursorManagerTest, CursorManager* cursorManager = useCursorManager(); boost::optional<uint32_t> prefix; for (int i = 0; i < 1000; i++) { - auto cursorPin = cursorManager->registerCursor(_opCtx.get(), - {makeFakePlanExecutor(), - kTestNss, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + _opCtx.get(), + {makeFakePlanExecutor(), + kTestNss, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); auto cursorId = cursorPin.getCursor()->cursorid(); if (prefix) { ASSERT_EQ(*prefix, extractLeading32Bits(cursorId)); @@ -208,12 +210,13 @@ TEST_F(CursorManagerTest, */ TEST_F(CursorManagerTest, InvalidateCursor) { CursorManager* cursorManager = useCursorManager(); - auto cursorPin = cursorManager->registerCursor(_opCtx.get(), - {makeFakePlanExecutor(), - kTestNss, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + _opCtx.get(), + {makeFakePlanExecutor(), + kTestNss, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); auto cursorId = cursorPin.getCursor()->cursorid(); cursorPin.release(); @@ -238,12 +241,13 @@ TEST_F(CursorManagerTest, InvalidateCursor) { TEST_F(CursorManagerTest, InvalidateCursorWithDrop) { CursorManager* cursorManager = useCursorManager(); - auto cursorPin = cursorManager->registerCursor(_opCtx.get(), - {makeFakePlanExecutor(), - kTestNss, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + _opCtx.get(), + {makeFakePlanExecutor(), + kTestNss, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); auto cursorId = cursorPin.getCursor()->cursorid(); cursorPin.release(); @@ -265,12 +269,13 @@ TEST_F(CursorManagerTest, InvalidateCursorWithDrop) { TEST_F(CursorManagerTest, InvalidatePinnedCursor) { CursorManager* cursorManager = useCursorManager(); - auto cursorPin = cursorManager->registerCursor(_opCtx.get(), - {makeFakePlanExecutor(), - kTestNss, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + _opCtx.get(), + {makeFakePlanExecutor(), + kTestNss, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); // If the cursor is pinned, it sticks around, even after invalidation. ASSERT_EQUALS(1U, cursorManager->numCursors()); @@ -297,12 +302,13 @@ TEST_F(CursorManagerTest, ShouldBeAbleToKillPinnedCursor) { const bool shouldAudit = false; OperationContext* const pinningOpCtx = _opCtx.get(); - auto cursorPin = cursorManager->registerCursor(pinningOpCtx, - {makeFakePlanExecutor(), - kTestNss, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + pinningOpCtx, + {makeFakePlanExecutor(), + kTestNss, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); auto cursorId = cursorPin.getCursor()->cursorid(); ASSERT_OK(cursorManager->killCursor(_opCtx.get(), cursorId, shouldAudit)); @@ -320,12 +326,13 @@ TEST_F(CursorManagerTest, ShouldBeAbleToKillPinnedCursorMultiClient) { OperationContext* const pinningOpCtx = _opCtx.get(); // Pin the cursor from one client. - auto cursorPin = cursorManager->registerCursor(pinningOpCtx, - {makeFakePlanExecutor(), - kTestNss, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + pinningOpCtx, + {makeFakePlanExecutor(), + kTestNss, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); auto cursorId = cursorPin.getCursor()->cursorid(); @@ -358,7 +365,7 @@ TEST_F(CursorManagerTest, InactiveCursorShouldTimeout) { {makeFakePlanExecutor(), NamespaceString{"test.collection"}, {}, - repl::ReadConcernLevel::kLocalReadConcern, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), BSONObj()}); ASSERT_EQ(0UL, cursorManager->timeoutCursors(_opCtx.get(), Date_t())); @@ -371,7 +378,7 @@ TEST_F(CursorManagerTest, InactiveCursorShouldTimeout) { {makeFakePlanExecutor(), NamespaceString{"test.collection"}, {}, - repl::ReadConcernLevel::kLocalReadConcern, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), BSONObj()}); ASSERT_EQ(1UL, cursorManager->timeoutCursors(_opCtx.get(), Date_t::max())); ASSERT_EQ(0UL, cursorManager->numCursors()); @@ -384,12 +391,13 @@ TEST_F(CursorManagerTest, InactivePinnedCursorShouldNotTimeout) { CursorManager* cursorManager = useCursorManager(); auto clock = useClock(); - auto cursorPin = cursorManager->registerCursor(_opCtx.get(), - {makeFakePlanExecutor(), - NamespaceString{"test.collection"}, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + _opCtx.get(), + {makeFakePlanExecutor(), + NamespaceString{"test.collection"}, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); // The pin is still in scope, so it should not time out. clock->advance(getDefaultCursorTimeoutMillis()); @@ -404,12 +412,13 @@ TEST_F(CursorManagerTest, InactiveKilledCursorsShouldTimeout) { auto clock = useClock(); // Make a cursor from the plan executor, and immediately kill it. - auto cursorPin = cursorManager->registerCursor(_opCtx.get(), - {makeFakePlanExecutor(), - NamespaceString{"test.collection"}, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + _opCtx.get(), + {makeFakePlanExecutor(), + NamespaceString{"test.collection"}, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); cursorPin.release(); const bool collectionGoingAway = false; cursorManager->invalidateAll( @@ -430,12 +439,13 @@ TEST_F(CursorManagerTest, InactiveKilledCursorsThatAreStillPinnedShouldNotTimeou auto clock = useClock(); // Make a cursor from the plan executor, and immediately kill it. - auto cursorPin = cursorManager->registerCursor(_opCtx.get(), - {makeFakePlanExecutor(), - NamespaceString{"test.collection"}, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + _opCtx.get(), + {makeFakePlanExecutor(), + NamespaceString{"test.collection"}, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); const bool collectionGoingAway = false; cursorManager->invalidateAll( _opCtx.get(), collectionGoingAway, "KilledCursorsShouldTimeoutTest"); @@ -455,12 +465,13 @@ TEST_F(CursorManagerTest, UsingACursorShouldUpdateTimeOfLastUse) { auto clock = useClock(); // Register a cursor which we will look at again. - auto cursorPin = cursorManager->registerCursor(_opCtx.get(), - {makeFakePlanExecutor(), - kTestNss, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + _opCtx.get(), + {makeFakePlanExecutor(), + kTestNss, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); auto usedCursorId = cursorPin.getCursor()->cursorid(); cursorPin.release(); @@ -470,7 +481,7 @@ TEST_F(CursorManagerTest, UsingACursorShouldUpdateTimeOfLastUse) { {makeFakePlanExecutor(), kTestNss, {}, - repl::ReadConcernLevel::kLocalReadConcern, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), BSONObj()}); // Advance the clock to simulate time passing. @@ -500,12 +511,13 @@ TEST_F(CursorManagerTest, CursorShouldNotTimeOutUntilIdleForLongEnoughAfterBeing auto clock = useClock(); // Register a cursor which we will look at again. - auto cursorPin = cursorManager->registerCursor(_opCtx.get(), - {makeFakePlanExecutor(), - kTestNss, - {}, - repl::ReadConcernLevel::kLocalReadConcern, - BSONObj()}); + auto cursorPin = cursorManager->registerCursor( + _opCtx.get(), + {makeFakePlanExecutor(), + kTestNss, + {}, + repl::ReadConcernArgs(repl::ReadConcernLevel::kLocalReadConcern), + BSONObj()}); // Advance the clock to simulate time passing. clock->advance(getDefaultCursorTimeoutMillis() + Milliseconds(1)); |