summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWilliam Schultz <william.schultz@mongodb.com>2018-11-15 18:13:44 -0500
committerWilliam Schultz <william.schultz@mongodb.com>2018-11-15 18:13:44 -0500
commit72789f5739982af1cbdb1dd4fa181c4924f657b3 (patch)
tree24c2087ed4e3cdbb0f3a4c180669eb40623a3b75 /src
parent8caf07e68313dea0bd60dd4bdfa6fe85bca40b69 (diff)
downloadmongo-72789f5739982af1cbdb1dd4fa181c4924f657b3.tar.gz
SERVER-37560 Store ReadConcernArgs on cursor object instead of ReadConcernLevel
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/clientcursor.cpp2
-rw-r--r--src/mongo/db/clientcursor.h12
-rw-r--r--src/mongo/db/commands/find_cmd.cpp2
-rw-r--r--src/mongo/db/commands/getmore_cmd.cpp3
-rw-r--r--src/mongo/db/commands/list_collections.cpp2
-rw-r--r--src/mongo/db/commands/list_indexes.cpp2
-rw-r--r--src/mongo/db/commands/repair_cursor.cpp2
-rw-r--r--src/mongo/db/commands/run_aggregate.cpp2
-rw-r--r--src/mongo/db/query/find.cpp4
-rw-r--r--src/mongo/dbtests/cursor_manager_test.cpp166
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));