diff options
Diffstat (limited to 'src/mongo/db/commands/find_cmd.cpp')
| -rw-r--r-- | src/mongo/db/commands/find_cmd.cpp | 17 |
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; |
