diff options
Diffstat (limited to 'src/mongo/db/commands/find_and_modify.cpp')
-rw-r--r-- | src/mongo/db/commands/find_and_modify.cpp | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/src/mongo/db/commands/find_and_modify.cpp b/src/mongo/db/commands/find_and_modify.cpp index 32b48d4eb3e..c806e67bdb7 100644 --- a/src/mongo/db/commands/find_and_modify.cpp +++ b/src/mongo/db/commands/find_and_modify.cpp @@ -63,6 +63,7 @@ #include "mongo/db/repl/replication_coordinator_global.h" #include "mongo/db/s/collection_sharding_state.h" #include "mongo/db/write_concern.h" +#include "mongo/s/d_state.h" #include "mongo/util/log.h" #include "mongo/util/scopeguard.h" @@ -214,6 +215,9 @@ public: bool slaveOk() const override { return false; } + virtual bool supportsWriteConcern(const BSONObj& cmd) const override { + return true; + } void addRequiredPrivileges(const std::string& dbname, const BSONObj& cmdObj, std::vector<Privilege>* out) override { @@ -332,13 +336,6 @@ public: const FindAndModifyRequest& args = parseStatus.getValue(); const NamespaceString& nsString = args.getNamespaceString(); - StatusWith<WriteConcernOptions> wcResult = extractWriteConcern(txn, cmdObj, dbName); - if (!wcResult.isOK()) { - return appendCommandStatus(result, wcResult.getStatus()); - } - txn->setWriteConcern(wcResult.getValue()); - setupSynchronousCommit(txn); - boost::optional<DisableDocumentValidation> maybeDisableValidation; if (shouldBypassDocumentValidationForCommand(cmdObj)) maybeDisableValidation.emplace(txn); @@ -350,6 +347,11 @@ public: &repl::ReplClientInfo::setLastOpToSystemLastOpTime, txn); + // If this is the local database, don't set last op. + if (dbName == "local") { + lastOpSetterGuard.Dismiss(); + } + // Although usually the PlanExecutor handles WCE internally, it will throw WCEs when it is // executing a findAndModify. This is done to ensure that we can always match, modify, and // return the document under concurrency, if a matching document exists. @@ -507,14 +509,6 @@ public: lastOpSetterGuard.Dismiss(); } - WriteConcernResult res; - auto waitForWCStatus = - waitForWriteConcern(txn, - repl::ReplClientInfo::forClient(txn->getClient()).getLastOp(), - txn->getWriteConcern(), - &res); - appendCommandWCStatus(result, waitForWCStatus); - return true; } |