summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jstests/replsets/find_and_modify_wc.js79
-rw-r--r--src/mongo/db/commands.cpp10
-rw-r--r--src/mongo/db/commands.h8
-rw-r--r--src/mongo/db/commands/find_and_modify.cpp14
-rw-r--r--src/mongo/db/commands/write_commands/batch_executor.cpp8
-rw-r--r--src/mongo/db/write_concern.cpp36
-rw-r--r--src/mongo/db/write_concern.h17
7 files changed, 9 insertions, 163 deletions
diff --git a/jstests/replsets/find_and_modify_wc.js b/jstests/replsets/find_and_modify_wc.js
deleted file mode 100644
index 21725c0e6d8..00000000000
--- a/jstests/replsets/find_and_modify_wc.js
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// Tests writeConcerns with findAndModify command
-//
-(function() {
- 'use strict';
-
- var nodeCount = 3;
- var rst = new ReplSetTest({ nodes: nodeCount });
- rst.startSet({ nojournal: "" });
- rst.initiate();
-
- var primary = rst.getPrimary();
- var coll = primary.getCollection("test.find_and_modify_wc");
- coll.remove({});
-
- // insert some documents
- var docs = [];
- for (var i = 1; i <= 5; ++i) {
- docs.push({ i: i, j: 2*i });
- }
- var res = coll.runCommand({ insert: coll.getName(),
- documents: docs,
- writeConcern: { w: nodeCount } });
- assert(res.ok);
- assert.eq(5, coll.count());
-
- // use for updates in subsequent runCommand calls
- var reqUpdate = {
- findAndModify: coll.getName(),
- query: { i: 3 },
- update: { $inc: { j: 1 } },
- writeConcern: { w: 'majority' }
- };
-
- // Verify findAndModify returns old document new: false
- var res = coll.runCommand(reqUpdate);
- assert(res.ok);
- assert(res.value);
- // (2 * res.value.i) == 6 == res.value.j (old document)
- assert.eq(2 * res.value.i, res.value.j);
- assert(!res.writeConcernError);
-
- // Verify findAndModify returns new document with new: true
- reqUpdate.new = true;
- res = coll.runCommand(reqUpdate);
- assert(res.ok);
- assert(res.value);
- // (2 * res.value.i + 2) == 8 == res.value.j (new document after two updates)
- assert.eq(2 * res.value.i + 2, res.value.j);
- assert(!res.writeConcernError);
-
- // Verify findAndModify remove works
- res = coll.runCommand({
- findAndModify: coll.getName(),
- sort: { i: 1 },
- remove: true,
- writeConcern: { w: nodeCount }
- });
- assert.eq(res.value.i, 1);
- assert.eq(coll.count(), 4);
- assert(!res.writeConcernError);
-
- // Verify findAndModify returns writeConcernError
- // when given invalid writeConcerns
- [
- { w: 'invalid' },
- { w: nodeCount + 1 }
- ].forEach(function(wc) {
- reqUpdate.writeConcern = wc;
- res = coll.runCommand(reqUpdate);
-
- assert(res.writeConcernError);
- assert(res.writeConcernError.code);
- assert(res.writeConcernError.errmsg);
- });
-
- rst.stopSet();
-
-})();
diff --git a/src/mongo/db/commands.cpp b/src/mongo/db/commands.cpp
index 8c95e60b919..fe3bda293d8 100644
--- a/src/mongo/db/commands.cpp
+++ b/src/mongo/db/commands.cpp
@@ -51,7 +51,6 @@
#include "mongo/db/jsobj.h"
#include "mongo/db/namespace_string.h"
#include "mongo/db/server_parameters.h"
-#include "mongo/s/write_ops/wc_error_detail.h"
#include "mongo/util/log.h"
namespace mongo {
@@ -262,15 +261,6 @@ namespace mongo {
}
}
- void Command::appendCommandWCStatus(BSONObjBuilder& result, const Status& status) {
- if (!status.isOK()) {
- WCErrorDetail wcError;
- wcError.setErrCode(status.code());
- wcError.setErrMessage(status.reason());
- result.append("writeConcernError", wcError.toBSON());
- }
- }
-
Status Command::getStatusFromCommandResult(const BSONObj& result) {
return mongo::getStatusFromCommandResult(result);
}
diff --git a/src/mongo/db/commands.h b/src/mongo/db/commands.h
index 7c9b2f66b55..f256f3ceac5 100644
--- a/src/mongo/db/commands.h
+++ b/src/mongo/db/commands.h
@@ -48,8 +48,8 @@ namespace mongo {
class BSONObjBuilder;
class Client;
class Database;
- class OperationContext;
class Timer;
+ class OperationContext;
namespace mutablebson {
class Document;
@@ -315,12 +315,6 @@ namespace mutablebson {
BSONArray firstBatch,
BSONObjBuilder* builder);
- /**
- * Helper for setting a writeConcernError field in the command result object if
- * a writeConcern error occurs.
- */
- static void appendCommandWCStatus(BSONObjBuilder& result, const Status& status);
-
// Set by command line. Controls whether or not testing-only commands should be available.
static int testCommandsEnabled;
diff --git a/src/mongo/db/commands/find_and_modify.cpp b/src/mongo/db/commands/find_and_modify.cpp
index 4e2ebd6bf3d..2cba4a3960f 100644
--- a/src/mongo/db/commands/find_and_modify.cpp
+++ b/src/mongo/db/commands/find_and_modify.cpp
@@ -47,7 +47,6 @@
#include "mongo/db/ops/update_lifecycle_impl.h"
#include "mongo/db/query/get_executor.h"
#include "mongo/db/repl/replication_coordinator_global.h"
-#include "mongo/db/write_concern.h"
#include "mongo/util/log.h"
namespace mongo {
@@ -115,12 +114,6 @@ namespace mongo {
return false;
}
- StatusWith<WriteConcernOptions> wcResult = extractWriteConcern(cmdObj);
- if (!wcResult.isOK()) {
- return appendCommandStatus(result, wcResult.getStatus());
- }
- setupSynchronousCommit(wcResult.getValue(), txn);
-
bool ok = false;
MONGO_WRITE_CONFLICT_RETRY_LOOP_BEGIN {
errmsg = "";
@@ -182,13 +175,6 @@ namespace mongo {
errmsg);
}
- WriteConcernResult res;
- wcResult = waitForWriteConcern(txn,
- wcResult.getValue(),
- txn->getClient()->getLastOp(),
- &res);
- appendCommandWCStatus(result, wcResult.getStatus());
-
return ok;
}
diff --git a/src/mongo/db/commands/write_commands/batch_executor.cpp b/src/mongo/db/commands/write_commands/batch_executor.cpp
index 48f1f0a1be4..ae0c16e30f6 100644
--- a/src/mongo/db/commands/write_commands/batch_executor.cpp
+++ b/src/mongo/db/commands/write_commands/batch_executor.cpp
@@ -756,6 +756,14 @@ namespace mongo {
Collection* _collection;
};
+ void setupSynchronousCommit( const WriteConcernOptions& writeConcern,
+ OperationContext* txn ) {
+ if ( writeConcern.syncMode == WriteConcernOptions::JOURNAL ||
+ writeConcern.syncMode == WriteConcernOptions::FSYNC ) {
+ txn->recoveryUnit()->goingToAwaitCommit();
+ }
+ }
+
void WriteBatchExecutor::bulkExecute( const BatchedCommandRequest& request,
const WriteConcernOptions& writeConcern,
std::vector<BatchedUpsertDetail*>* upsertedIds,
diff --git a/src/mongo/db/write_concern.cpp b/src/mongo/db/write_concern.cpp
index db55f59e220..97db25a5c5b 100644
--- a/src/mongo/db/write_concern.cpp
+++ b/src/mongo/db/write_concern.cpp
@@ -31,7 +31,6 @@
#include "mongo/db/write_concern.h"
#include "mongo/base/counter.h"
-#include "mongo/bson/util/bson_extract.h"
#include "mongo/db/commands/server_status_metric.h"
#include "mongo/db/global_environment_experiment.h"
#include "mongo/db/operation_context.h"
@@ -53,41 +52,6 @@ namespace mongo {
static ServerStatusMetricField<Counter64> gleWtimeoutsDisplay("getLastError.wtimeouts",
&gleWtimeouts );
- void setupSynchronousCommit(const WriteConcernOptions& writeConcern,
- OperationContext* txn) {
- if ( writeConcern.syncMode == WriteConcernOptions::JOURNAL ||
- writeConcern.syncMode == WriteConcernOptions::FSYNC ) {
- txn->recoveryUnit()->goingToAwaitCommit();
- }
- }
-
- StatusWith<WriteConcernOptions> extractWriteConcern(const BSONObj& cmdObj) {
- BSONElement writeConcernElement;
- Status wcStatus = bsonExtractTypedField(cmdObj,
- "writeConcern",
- Object,
- &writeConcernElement);
-
- if (!wcStatus.isOK()) {
- if (wcStatus == ErrorCodes::NoSuchKey) {
- return repl::getGlobalReplicationCoordinator()->getGetLastErrorDefault();
- }
- return wcStatus;
- }
-
- WriteConcernOptions writeConcern;
- wcStatus = writeConcern.parse(writeConcernElement.Obj());
-
- if (wcStatus.isOK()) {
- wcStatus = validateWriteConcern(writeConcern);
- }
- if (!wcStatus.isOK()) {
- return wcStatus;
- }
-
- return writeConcern;
- }
-
Status validateWriteConcern( const WriteConcernOptions& writeConcern ) {
const bool isJournalEnabled = getGlobalEnvironment()->getGlobalStorageEngine()->isDurable();
diff --git a/src/mongo/db/write_concern.h b/src/mongo/db/write_concern.h
index 19513e4f969..98d7893a2e1 100644
--- a/src/mongo/db/write_concern.h
+++ b/src/mongo/db/write_concern.h
@@ -34,23 +34,6 @@
namespace mongo {
class OperationContext;
- template <typename T> class StatusWith;
-
- /**
- * If "writeConcern" indicates a durable commit level,
- * marks the RecoveryUnit associated with "txn" appropriately.
- * Provides a hint to the storage engine that
- * particular operations will be waiting for their changes to become durable.
- */
- void setupSynchronousCommit(const WriteConcernOptions& writeConcern,
- OperationContext* txn);
-
- /**
- * Attempts to extract a writeConcern from cmdObj.
- * Verifies that the writeConcern is of type Object (BSON type) and
- * that the resulting writeConcern is valid for this particular host.
- */
- StatusWith<WriteConcernOptions> extractWriteConcern(const BSONObj& cmdObj);
/**
* Verifies that a WriteConcern is valid for this particular host.