diff options
Diffstat (limited to 'src/mongo/s/commands/strategy.cpp')
-rw-r--r-- | src/mongo/s/commands/strategy.cpp | 82 |
1 files changed, 42 insertions, 40 deletions
diff --git a/src/mongo/s/commands/strategy.cpp b/src/mongo/s/commands/strategy.cpp index 148dcd66e05..a209b0a8f9b 100644 --- a/src/mongo/s/commands/strategy.cpp +++ b/src/mongo/s/commands/strategy.cpp @@ -82,7 +82,7 @@ using std::stringstream; namespace { -void runAgainstRegistered(OperationContext* txn, +void runAgainstRegistered(OperationContext* opCtx, const char* ns, BSONObj& jsobj, BSONObjBuilder& anObjBuilder, @@ -104,14 +104,14 @@ void runAgainstRegistered(OperationContext* txn, return; } - execCommandClient(txn, c, queryOptions, ns, jsobj, anObjBuilder); + execCommandClient(opCtx, c, queryOptions, ns, jsobj, anObjBuilder); } /** * Called into by the web server. For now we just translate the parameters to their old style * equivalents. */ -void execCommandHandler(OperationContext* txn, +void execCommandHandler(OperationContext* opCtx, Command* command, const rpc::RequestInterface& request, rpc::ReplyBuilderInterface* replyBuilder) { @@ -124,7 +124,7 @@ void execCommandHandler(OperationContext* txn, std::string db = request.getDatabase().rawData(); BSONObjBuilder result; - execCommandClient(txn, command, queryFlags, request.getDatabase().rawData(), cmdObj, result); + execCommandClient(opCtx, command, queryFlags, request.getDatabase().rawData(), cmdObj, result); replyBuilder->setCommandReply(result.done()).setMetadata(rpc::makeEmptyMetadata()); } @@ -134,7 +134,7 @@ MONGO_INITIALIZER(InitializeCommandExecCommandHandler)(InitializerContext* const return Status::OK(); } -void registerErrorImpl(OperationContext* txn, const DBException& exception) {} +void registerErrorImpl(OperationContext* opCtx, const DBException& exception) {} MONGO_INITIALIZER(InitializeRegisterErrorHandler)(InitializerContext* const) { Command::registerRegisterError(registerErrorImpl); @@ -143,12 +143,12 @@ MONGO_INITIALIZER(InitializeRegisterErrorHandler)(InitializerContext* const) { } // namespace -void Strategy::queryOp(OperationContext* txn, const NamespaceString& nss, DbMessage* dbm) { +void Strategy::queryOp(OperationContext* opCtx, const NamespaceString& nss, DbMessage* dbm) { globalOpCounters.gotQuery(); const QueryMessage q(*dbm); - Client* const client = txn->getClient(); + Client* const client = opCtx->getClient(); AuthorizationSession* const authSession = AuthorizationSession::get(client); Status status = authSession->checkAuthForFind(nss, false); @@ -183,7 +183,7 @@ void Strategy::queryOp(OperationContext* txn, const NamespaceString& nss, DbMess }(); auto canonicalQuery = - uassertStatusOK(CanonicalQuery::canonicalize(txn, q, ExtensionsCallbackNoop())); + uassertStatusOK(CanonicalQuery::canonicalize(opCtx, q, ExtensionsCallbackNoop())); // If the $explain flag was set, we must run the operation on the shards as an explain command // rather than a find command. @@ -199,7 +199,7 @@ void Strategy::queryOp(OperationContext* txn, const NamespaceString& nss, DbMess BSONObjBuilder explainBuilder; uassertStatusOK(Strategy::explainFind( - txn, findCommand, queryRequest, verbosity, metadata, &explainBuilder)); + opCtx, findCommand, queryRequest, verbosity, metadata, &explainBuilder)); BSONObj explainObj = explainBuilder.done(); replyToQuery(0, // query result flags @@ -220,7 +220,7 @@ void Strategy::queryOp(OperationContext* txn, const NamespaceString& nss, DbMess // 0 means the cursor is exhausted. Otherwise we assume that a cursor with the returned id can // be retrieved via the ClusterCursorManager. auto cursorId = - ClusterFind::runQuery(txn, + ClusterFind::runQuery(opCtx, *canonicalQuery, readPreference, &batch, @@ -249,10 +249,12 @@ void Strategy::queryOp(OperationContext* txn, const NamespaceString& nss, DbMess cursorId.getValue()); } -void Strategy::clientCommandOp(OperationContext* txn, const NamespaceString& nss, DbMessage* dbm) { +void Strategy::clientCommandOp(OperationContext* opCtx, + const NamespaceString& nss, + DbMessage* dbm) { const QueryMessage q(*dbm); - Client* const client = txn->getClient(); + Client* const client = opCtx->getClient(); LOG(3) << "command: " << q.ns << " " << redact(q.query) << " ntoreturn: " << q.ntoreturn << " options: " << q.queryOptions; @@ -282,7 +284,7 @@ void Strategy::clientCommandOp(OperationContext* txn, const NamespaceString& nss const NamespaceString interposedNss("admin", "$cmd"); BSONObjBuilder reply; runAgainstRegistered( - txn, interposedNss.ns().c_str(), interposedCmd, reply, q.queryOptions); + opCtx, interposedNss.ns().c_str(), interposedCmd, reply, q.queryOptions); replyToQuery(0, client->session(), dbm->msg(), reply.done()); }; @@ -336,7 +338,7 @@ void Strategy::clientCommandOp(OperationContext* txn, const NamespaceString& nss const int maxTimeMS = uassertStatusOK(QueryRequest::parseMaxTimeMS(cmdObj[QueryRequest::cmdOptionMaxTimeMS])); if (maxTimeMS > 0) { - txn->setDeadlineAfterNowBy(Milliseconds{maxTimeMS}); + opCtx->setDeadlineAfterNowBy(Milliseconds{maxTimeMS}); } int loops = 5; @@ -346,7 +348,7 @@ void Strategy::clientCommandOp(OperationContext* txn, const NamespaceString& nss OpQueryReplyBuilder reply; { BSONObjBuilder builder(reply.bufBuilderForResults()); - runAgainstRegistered(txn, q.ns, cmdObj, builder, q.queryOptions); + runAgainstRegistered(opCtx, q.ns, cmdObj, builder, q.queryOptions); } reply.sendCommandReply(client->session(), dbm->msg()); return; @@ -361,13 +363,13 @@ void Strategy::clientCommandOp(OperationContext* txn, const NamespaceString& nss // For legacy reasons, ns may not actually be set in the exception const std::string staleNS(e.getns().empty() ? std::string(q.ns) : e.getns()); - ShardConnection::checkMyConnectionVersions(txn, staleNS); + ShardConnection::checkMyConnectionVersions(opCtx, staleNS); if (loops < 4) { // This throws out the entire database cache entry in response to // StaleConfigException instead of just the collection which encountered it. There // is no good reason for it other than the lack of lower-granularity cache // invalidation. - Grid::get(txn)->catalogCache()->invalidate(NamespaceString(staleNS).db()); + Grid::get(opCtx)->catalogCache()->invalidate(NamespaceString(staleNS).db()); } } catch (const DBException& e) { OpQueryReplyBuilder reply; @@ -381,7 +383,7 @@ void Strategy::clientCommandOp(OperationContext* txn, const NamespaceString& nss } } -void Strategy::commandOp(OperationContext* txn, +void Strategy::commandOp(OperationContext* opCtx, const string& db, const BSONObj& command, int options, @@ -395,7 +397,7 @@ void Strategy::commandOp(OperationContext* txn, qSpec, CommandInfo(versionedNS, targetingQuery, targetingCollation)); // Initialize the cursor - cursor.init(txn); + cursor.init(opCtx); set<ShardId> shardIds; cursor.getQueryShardIds(shardIds); @@ -411,7 +413,7 @@ void Strategy::commandOp(OperationContext* txn, } } -void Strategy::getMore(OperationContext* txn, const NamespaceString& nss, DbMessage* dbm) { +void Strategy::getMore(OperationContext* opCtx, const NamespaceString& nss, DbMessage* dbm) { const int ntoreturn = dbm->pullInt(); uassert( 34424, str::stream() << "Invalid ntoreturn for OP_GET_MORE: " << ntoreturn, ntoreturn >= 0); @@ -419,12 +421,12 @@ void Strategy::getMore(OperationContext* txn, const NamespaceString& nss, DbMess globalOpCounters.gotGetMore(); - Client* const client = txn->getClient(); + Client* const client = opCtx->getClient(); // TODO: Handle stale config exceptions here from coll being dropped or sharded during op for // now has same semantics as legacy request. - auto statusGetDb = Grid::get(txn)->catalogCache()->getDatabase(txn, nss.db()); + auto statusGetDb = Grid::get(opCtx)->catalogCache()->getDatabase(opCtx, nss.db()); if (statusGetDb == ErrorCodes::NamespaceNotFound) { replyToQuery(ResultFlag_CursorNotFound, client->session(), dbm->msg(), 0, 0, 0); return; @@ -438,7 +440,7 @@ void Strategy::getMore(OperationContext* txn, const NamespaceString& nss, DbMess GetMoreRequest getMoreRequest(nss, cursorId, batchSize, boost::none, boost::none, boost::none); - auto cursorResponse = ClusterFind::runGetMore(txn, getMoreRequest); + auto cursorResponse = ClusterFind::runGetMore(opCtx, getMoreRequest); if (cursorResponse == ErrorCodes::CursorNotFound) { replyToQuery(ResultFlag_CursorNotFound, client->session(), dbm->msg(), 0, 0, 0); return; @@ -464,7 +466,7 @@ void Strategy::getMore(OperationContext* txn, const NamespaceString& nss, DbMess cursorResponse.getValue().getCursorId()); } -void Strategy::killCursors(OperationContext* txn, DbMessage* dbm) { +void Strategy::killCursors(OperationContext* opCtx, DbMessage* dbm) { const int numCursors = dbm->pullInt(); massert(34425, str::stream() << "Invalid killCursors message. numCursors: " << numCursors @@ -481,9 +483,9 @@ void Strategy::killCursors(OperationContext* txn, DbMessage* dbm) { ConstDataCursor cursors(dbm->getArray(numCursors)); - Client* const client = txn->getClient(); + Client* const client = opCtx->getClient(); AuthorizationSession* const authSession = AuthorizationSession::get(client); - ClusterCursorManager* const manager = Grid::get(txn)->getCursorManager(); + ClusterCursorManager* const manager = Grid::get(opCtx)->getCursorManager(); for (int i = 0; i < numCursors; ++i) { const CursorId cursorId = cursors.readAndAdvance<LittleEndian<int64_t>>(); @@ -517,13 +519,13 @@ void Strategy::killCursors(OperationContext* txn, DbMessage* dbm) { } } -void Strategy::writeOp(OperationContext* txn, DbMessage* dbm) { +void Strategy::writeOp(OperationContext* opCtx, DbMessage* dbm) { OwnedPointerVector<BatchedCommandRequest> commandRequestsOwned; std::vector<BatchedCommandRequest*>& commandRequests = commandRequestsOwned.mutableVector(); msgToBatchRequests(dbm->msg(), &commandRequests); - auto& clientLastError = LastError::get(txn->getClient()); + auto& clientLastError = LastError::get(opCtx->getClient()); for (auto it = commandRequests.begin(); it != commandRequests.end(); ++it) { // Multiple commands registered to last error as multiple requests @@ -546,7 +548,7 @@ void Strategy::writeOp(OperationContext* txn, DbMessage* dbm) { BSONObj commandBSON = commandRequest->toBSON(); BSONObjBuilder builder; - runAgainstRegistered(txn, cmdNS.c_str(), commandBSON, builder, 0); + runAgainstRegistered(opCtx, cmdNS.c_str(), commandBSON, builder, 0); bool parsed = commandResponse.parseBSON(builder.done(), nullptr); (void)parsed; // for compile @@ -566,7 +568,7 @@ void Strategy::writeOp(OperationContext* txn, DbMessage* dbm) { } } -Status Strategy::explainFind(OperationContext* txn, +Status Strategy::explainFind(OperationContext* opCtx, const BSONObj& findCommand, const QueryRequest& qr, ExplainCommon::Verbosity verbosity, @@ -581,7 +583,7 @@ Status Strategy::explainFind(OperationContext* txn, Timer timer; std::vector<Strategy::CommandResult> shardResults; - Strategy::commandOp(txn, + Strategy::commandOp(opCtx, qr.nss().db().toString(), explainCmdBob.obj(), options, @@ -601,13 +603,13 @@ Status Strategy::explainFind(OperationContext* txn, const char* mongosStageName = ClusterExplain::getStageNameForReadOp(shardResults, findCommand); return ClusterExplain::buildExplainResult( - txn, shardResults, mongosStageName, millisElapsed, out); + opCtx, shardResults, mongosStageName, millisElapsed, out); } /** * Called into by the commands infrastructure. */ -void execCommandClient(OperationContext* txn, +void execCommandClient(OperationContext* opCtx, Command* c, int queryOptions, const char* ns, @@ -624,7 +626,7 @@ void execCommandClient(OperationContext* txn, return; } - Status status = Command::checkAuthorization(c, txn, dbname, cmdObj); + Status status = Command::checkAuthorization(c, opCtx, dbname, cmdObj); if (!status.isOK()) { Command::appendCommandStatus(result, status); return; @@ -657,20 +659,20 @@ void execCommandClient(OperationContext* txn, // attach tracking rpc::TrackingMetadata trackingMetadata; trackingMetadata.initWithOperName(c->getName()); - rpc::TrackingMetadata::get(txn) = trackingMetadata; + rpc::TrackingMetadata::get(opCtx) = trackingMetadata; std::string errmsg; bool ok = false; try { if (!supportsWriteConcern) { - ok = c->run(txn, dbname, cmdObj, queryOptions, errmsg, result); + ok = c->run(opCtx, dbname, cmdObj, queryOptions, errmsg, result); } else { // Change the write concern while running the command. - const auto oldWC = txn->getWriteConcern(); - ON_BLOCK_EXIT([&] { txn->setWriteConcern(oldWC); }); - txn->setWriteConcern(wcResult.getValue()); + const auto oldWC = opCtx->getWriteConcern(); + ON_BLOCK_EXIT([&] { opCtx->setWriteConcern(oldWC); }); + opCtx->setWriteConcern(wcResult.getValue()); - ok = c->run(txn, dbname, cmdObj, queryOptions, errmsg, result); + ok = c->run(opCtx, dbname, cmdObj, queryOptions, errmsg, result); } } catch (const DBException& e) { result.resetToEmpty(); |