summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/find_cmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/commands/find_cmd.cpp')
-rw-r--r--src/mongo/db/commands/find_cmd.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/mongo/db/commands/find_cmd.cpp b/src/mongo/db/commands/find_cmd.cpp
index 4ce8c38e5f2..f59df4f4d8b 100644
--- a/src/mongo/db/commands/find_cmd.cpp
+++ b/src/mongo/db/commands/find_cmd.cpp
@@ -232,8 +232,8 @@ public:
// Parse the command BSON to a QueryRequest.
const bool isExplain = false;
// Pass parseNs to makeFromFindCommand in case cmdObj does not have a UUID.
- auto qrStatus = QueryRequest::makeFromFindCommand(
- NamespaceString(parseNs(dbname, cmdObj)), cmdObj, isExplain);
+ const NamespaceString parsedNss(parseNs(dbname, cmdObj));
+ auto qrStatus = QueryRequest::makeFromFindCommand(parsedNss, cmdObj, isExplain);
uassertStatusOK(qrStatus.getStatus());
auto replCoord = repl::ReplicationCoordinator::get(opCtx);
@@ -245,12 +245,23 @@ public:
!(session->inActiveOrKilledMultiDocumentTransaction() && qr->isTailable()));
// Validate term before acquiring locks, if provided.
- if (auto term = qr->getReplicationTerm()) {
+ auto term = qr->getReplicationTerm();
+ if (term) {
Status status = replCoord->updateTerm(opCtx, *term);
// Note: updateTerm returns ok if term stayed the same.
uassertStatusOK(status);
}
+ // The presence of a term in the request indicates that this is an internal replication
+ // oplog read request.
+ if (term && parsedNss == NamespaceString::kRsOplogNamespace) {
+ // We do not want to take tickets for internal (replication) oplog reads. Stalling
+ // on ticket acquisition can cause complicated deadlocks. Primaries may depend on
+ // data reaching secondaries in order to proceed; and secondaries may get stalled
+ // replicating because of an inability to acquire a read ticket.
+ opCtx->lockState()->skipAcquireTicket();
+ }
+
// Acquire locks. If the query is on a view, we release our locks and convert the query
// request into an aggregation command.
boost::optional<AutoGetCollectionForReadCommand> ctx;