Shard::HostWithResponse ShardLocal::_runCommand(OperationContext* txn, const ReadPreferenceSetting& unused, const std::string& dbName, Milliseconds maxTimeMSOverrideUnused, const BSONObj& cmdObj) { repl::OpTime currentOpTimeFromClient = repl::ReplClientInfo::forClient(txn->getClient()).getLastOp(); ON_BLOCK_EXIT([this, &txn, ¤tOpTimeFromClient] { _updateLastOpTimeFromClient(txn, currentOpTimeFromClient); }); try { DBDirectClient client(txn); rpc::UniqueReply commandResponse = client.runCommandWithMetadata( dbName, cmdObj.firstElementFieldName(), rpc::makeEmptyMetadata(), cmdObj); BSONObj responseReply = commandResponse->getCommandReply().getOwned(); BSONObj responseMetadata = commandResponse->getMetadata().getOwned(); Status commandStatus = getStatusFromCommandResult(responseReply); Status writeConcernStatus = getWriteConcernStatusFromCommandResult(responseReply); return Shard::HostWithResponse(boost::none, Shard::CommandResponse{std::move(responseReply), std::move(responseMetadata), std::move(commandStatus), std::move(writeConcernStatus)}); } catch (const DBException& ex) { return Shard::HostWithResponse(boost::none, ex.toStatus()); } }
StatusWith<Shard::CommandResponse> RSLocalClient::runCommandOnce(OperationContext* opCtx, StringData dbName, const BSONObj& cmdObj) { const auto currentOpTimeFromClient = repl::ReplClientInfo::forClient(opCtx->getClient()).getLastOp(); ON_BLOCK_EXIT([this, &opCtx, ¤tOpTimeFromClient] { _updateLastOpTimeFromClient(opCtx, currentOpTimeFromClient); }); try { DBDirectClient client(opCtx); rpc::UniqueReply commandResponse = client.runCommand(OpMsgRequest::fromDBAndBody(dbName, cmdObj)); auto result = commandResponse->getCommandReply().getOwned(); return Shard::CommandResponse(boost::none, result, getStatusFromCommandResult(result), getWriteConcernStatusFromCommandResult(result)); } catch (const DBException& ex) { return ex.toStatus(); } }