summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authormatt dannenberg <matt.dannenberg@10gen.com>2015-04-09 10:01:45 -0400
committermatt dannenberg <matt.dannenberg@10gen.com>2015-04-17 11:27:21 -0400
commit5a29fa08eeea0ece229102dcd4e7b6580c7acd1d (patch)
tree15d965b370cee5c9bca32f91c3d944ccc04d7038 /src/mongo/db
parentea32e99a4e06930b2cae7b03882e3fda3333934b (diff)
downloadmongo-5a29fa08eeea0ece229102dcd4e7b6580c7acd1d.tar.gz
SERVER-15860 Switch replication metadata ops to be replication-specific, rather than using commands
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/auth/sasl_commands.cpp12
-rw-r--r--src/mongo/db/catalog/apply_ops.cpp1
-rw-r--r--src/mongo/db/catalog/capped_utils.cpp5
-rw-r--r--src/mongo/db/catalog/create_collection.cpp94
-rw-r--r--src/mongo/db/catalog/create_collection.h43
-rw-r--r--src/mongo/db/clientcursor.cpp8
-rw-r--r--src/mongo/db/clientlistplugin.cpp3
-rw-r--r--src/mongo/db/cloner.cpp43
-rw-r--r--src/mongo/db/cloner.h7
-rw-r--r--src/mongo/db/commands.cpp24
-rw-r--r--src/mongo/db/commands.h23
-rw-r--r--src/mongo/db/commands/apply_ops.cpp5
-rw-r--r--src/mongo/db/commands/authentication_commands.cpp13
-rw-r--r--src/mongo/db/commands/authentication_commands.h3
-rw-r--r--src/mongo/db/commands/cleanup_orphaned_cmd.cpp3
-rw-r--r--src/mongo/db/commands/clone.cpp4
-rw-r--r--src/mongo/db/commands/clone_collection.cpp3
-rw-r--r--src/mongo/db/commands/collection_to_capped.cpp10
-rw-r--r--src/mongo/db/commands/compact.cpp7
-rw-r--r--src/mongo/db/commands/connection_status.cpp2
-rw-r--r--src/mongo/db/commands/copydb.cpp4
-rw-r--r--src/mongo/db/commands/copydb_start_commands.cpp6
-rw-r--r--src/mongo/db/commands/count.cpp3
-rw-r--r--src/mongo/db/commands/cpuprofile.cpp12
-rw-r--r--src/mongo/db/commands/create_indexes.cpp27
-rw-r--r--src/mongo/db/commands/current_op.cpp3
-rw-r--r--src/mongo/db/commands/dbhash.cpp7
-rw-r--r--src/mongo/db/commands/dbhash.h7
-rw-r--r--src/mongo/db/commands/distinct.cpp8
-rw-r--r--src/mongo/db/commands/drop_indexes.cpp16
-rw-r--r--src/mongo/db/commands/explain_cmd.cpp10
-rw-r--r--src/mongo/db/commands/explain_cmd.h3
-rw-r--r--src/mongo/db/commands/fail_point_cmd.cpp3
-rw-r--r--src/mongo/db/commands/find_and_modify.cpp6
-rw-r--r--src/mongo/db/commands/find_cmd.cpp3
-rw-r--r--src/mongo/db/commands/fsync.cpp10
-rw-r--r--src/mongo/db/commands/geo_near_cmd.cpp7
-rw-r--r--src/mongo/db/commands/get_last_error.cpp17
-rw-r--r--src/mongo/db/commands/getmore_cmd.cpp3
-rw-r--r--src/mongo/db/commands/group.cpp3
-rw-r--r--src/mongo/db/commands/group.h3
-rw-r--r--src/mongo/db/commands/hashcmd.cpp3
-rw-r--r--src/mongo/db/commands/index_filter_commands.cpp8
-rw-r--r--src/mongo/db/commands/index_filter_commands.h8
-rw-r--r--src/mongo/db/commands/isself.cpp7
-rw-r--r--src/mongo/db/commands/kill_op.cpp3
-rw-r--r--src/mongo/db/commands/list_collections.cpp3
-rw-r--r--src/mongo/db/commands/list_databases.cpp3
-rw-r--r--src/mongo/db/commands/list_indexes.cpp3
-rw-r--r--src/mongo/db/commands/merge_chunks_cmd.cpp3
-rw-r--r--src/mongo/db/commands/mr.cpp15
-rw-r--r--src/mongo/db/commands/oplog_note.cpp3
-rw-r--r--src/mongo/db/commands/parallel_collection_scan.cpp9
-rw-r--r--src/mongo/db/commands/parameters.cpp14
-rw-r--r--src/mongo/db/commands/pipeline_command.cpp8
-rw-r--r--src/mongo/db/commands/plan_cache_commands.cpp8
-rw-r--r--src/mongo/db/commands/plan_cache_commands.h8
-rw-r--r--src/mongo/db/commands/rename_collection.cpp24
-rw-r--r--src/mongo/db/commands/repair_cursor.cpp9
-rw-r--r--src/mongo/db/commands/server_status.cpp7
-rw-r--r--src/mongo/db/commands/test_commands.cpp25
-rw-r--r--src/mongo/db/commands/touch.cpp3
-rw-r--r--src/mongo/db/commands/user_management_commands.cpp57
-rw-r--r--src/mongo/db/commands/validate.cpp7
-rw-r--r--src/mongo/db/commands/write_commands/batch_executor.cpp3
-rw-r--r--src/mongo/db/commands/write_commands/write_commands.cpp9
-rw-r--r--src/mongo/db/commands/write_commands/write_commands.h3
-rw-r--r--src/mongo/db/commands/writeback_compatibility_shim.cpp6
-rw-r--r--src/mongo/db/dbcommands.cpp170
-rw-r--r--src/mongo/db/dbcommands_generic.cpp60
-rw-r--r--src/mongo/db/dbdirectclient.cpp3
-rw-r--r--src/mongo/db/dbeval.cpp3
-rw-r--r--src/mongo/db/dbwebserver.cpp4
-rw-r--r--src/mongo/db/driverHelpers.cpp7
-rw-r--r--src/mongo/db/exec/stagedebug_cmd.cpp8
-rw-r--r--src/mongo/db/exec/update.cpp1
-rw-r--r--src/mongo/db/geo/haystack.cpp8
-rw-r--r--src/mongo/db/instance.cpp10
-rw-r--r--src/mongo/db/repl/master_slave.cpp4
-rw-r--r--src/mongo/db/repl/oplog.cpp120
-rw-r--r--src/mongo/db/repl/oplog.h2
-rw-r--r--src/mongo/db/repl/replication_info.cpp7
-rw-r--r--src/mongo/db/repl/replset_commands.cpp90
-rw-r--r--src/mongo/db/repl/resync.cpp3
-rw-r--r--src/mongo/db/repl/rs_initialsync.cpp1
-rw-r--r--src/mongo/db/repl/rs_rollback.cpp2
-rw-r--r--src/mongo/db/repl/sync_tail.cpp4
-rw-r--r--src/mongo/db/stats/top.cpp7
-rw-r--r--src/mongo/db/storage/mmap_v1/journal_latency_test_cmd.cpp7
89 files changed, 797 insertions, 457 deletions
diff --git a/src/mongo/db/auth/sasl_commands.cpp b/src/mongo/db/auth/sasl_commands.cpp
index a6ef35c1a74..a4843e9d900 100644
--- a/src/mongo/db/auth/sasl_commands.cpp
+++ b/src/mongo/db/auth/sasl_commands.cpp
@@ -74,8 +74,7 @@ namespace {
BSONObj& cmdObj,
int options,
std::string& ignored,
- BSONObjBuilder& result,
- bool fromRepl);
+ BSONObjBuilder& result);
virtual void help(stringstream& help) const;
virtual bool isWriteCommandForConfigServer() const { return false; }
@@ -97,8 +96,7 @@ namespace {
BSONObj& cmdObj,
int options,
std::string& ignored,
- BSONObjBuilder& result,
- bool fromRepl);
+ BSONObjBuilder& result);
virtual void help(stringstream& help) const;
virtual bool isWriteCommandForConfigServer() const { return false; }
@@ -273,8 +271,7 @@ namespace {
BSONObj& cmdObj,
int options,
std::string& ignored,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
ClientBasic* client = ClientBasic::getCurrent();
AuthenticationSession::set(client, std::unique_ptr<AuthenticationSession>());
@@ -319,8 +316,7 @@ namespace {
BSONObj& cmdObj,
int options,
std::string& ignored,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
ClientBasic* client = ClientBasic::getCurrent();
std::unique_ptr<AuthenticationSession> sessionGuard;
diff --git a/src/mongo/db/catalog/apply_ops.cpp b/src/mongo/db/catalog/apply_ops.cpp
index 2ef6d46c9d0..9722982abfe 100644
--- a/src/mongo/db/catalog/apply_ops.cpp
+++ b/src/mongo/db/catalog/apply_ops.cpp
@@ -136,7 +136,6 @@ namespace mongo {
repl::applyOperation_inlock(txn,
ctx.db(),
temp,
- !txn->writesAreReplicated(),
alwaysUpsert);
break;
}
diff --git a/src/mongo/db/catalog/capped_utils.cpp b/src/mongo/db/catalog/capped_utils.cpp
index 76be6e8d040..fc228a02025 100644
--- a/src/mongo/db/catalog/capped_utils.cpp
+++ b/src/mongo/db/catalog/capped_utils.cpp
@@ -41,6 +41,7 @@
#include "mongo/db/query/internal_plans.h"
#include "mongo/db/repl/replication_coordinator_global.h"
#include "mongo/db/service_context.h"
+#include "mongo/util/scopeguard.h"
namespace mongo {
namespace {
@@ -224,8 +225,9 @@ namespace {
}
- bool shouldReplicateWrites = txn->writesAreReplicated();
+ const bool shouldReplicateWrites = txn->writesAreReplicated();
txn->setReplicatedWrites(false);
+ ON_BLOCK_EXIT(&OperationContext::setReplicatedWrites, txn, shouldReplicateWrites);
Status status = cloneCollectionAsCapped(txn,
db,
shortSource.toString(),
@@ -234,7 +236,6 @@ namespace {
true);
if (!status.isOK()) {
- txn->setReplicatedWrites(shouldReplicateWrites);
return status;
}
diff --git a/src/mongo/db/catalog/create_collection.cpp b/src/mongo/db/catalog/create_collection.cpp
new file mode 100644
index 00000000000..fd598521a41
--- /dev/null
+++ b/src/mongo/db/catalog/create_collection.cpp
@@ -0,0 +1,94 @@
+/**
+ * Copyright (C) 2015 MongoDB Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, the copyright holders give permission to link the
+ * code of portions of this program with the OpenSSL library under certain
+ * conditions as described in each individual source file and distribute
+ * linked combinations including the program with the OpenSSL library. You
+ * must comply with the GNU Affero General Public License in all respects for
+ * all of the code used other than as permitted herein. If you modify file(s)
+ * with this exception, you may extend this exception to your version of the
+ * file(s), but you are not obligated to do so. If you do not wish to do so,
+ * delete this exception statement from your version. If you delete this
+ * exception statement from all source files in the program, then also delete
+ * it in the license file.
+ */
+
+#include "mongo/platform/basic.h"
+
+#include "mongo/db/catalog/create_collection.h"
+
+#include "mongo/bson/bsonobj.h"
+#include "mongo/db/concurrency/write_conflict_exception.h"
+#include "mongo/db/curop.h"
+#include "mongo/db/db_raii.h"
+#include "mongo/db/operation_context.h"
+#include "mongo/db/ops/insert.h"
+#include "mongo/db/repl/replication_coordinator_global.h"
+
+namespace mongo {
+ Status createCollection(OperationContext* txn,
+ const std::string& dbName,
+ const BSONObj& cmdObj) {
+ BSONObjIterator it(cmdObj);
+
+ // Extract ns from first cmdObj element.
+ BSONElement firstElt = it.next();
+ uassert(15888,
+ "must pass name of collection to create",
+ firstElt.valuestrsafe()[0] != '\0');
+
+ Status status = userAllowedWriteNS(dbName, firstElt.valuestr());
+ if (!status.isOK()) {
+ return status;
+ }
+
+ const std::string ns = dbName + '.' + firstElt.valuestrsafe();
+
+ // Build options object from remaining cmdObj elements.
+ BSONObjBuilder optionsBuilder;
+ while (it.more()) {
+ optionsBuilder.append(it.next());
+ }
+
+ BSONObj options = optionsBuilder.obj();
+ uassert(14832,
+ "specify size:<n> when capped is true",
+ !options["capped"].trueValue() || options["size"].isNumber() ||
+ options.hasField("$nExtents"));
+
+ MONGO_WRITE_CONFLICT_RETRY_LOOP_BEGIN {
+ ScopedTransaction transaction(txn, MODE_IX);
+ Lock::DBLock dbXLock(txn->lockState(), dbName, MODE_X);
+ OldClientContext ctx(txn, ns);
+ if (txn->writesAreReplicated() &&
+ !repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(dbName)) {
+ return Status(ErrorCodes::NotMaster,
+ str::stream() << "Not primary while creating collection " << ns);
+ }
+
+ WriteUnitOfWork wunit(txn);
+
+ // Create collection.
+ status = userCreateNS(txn, ctx.db(), ns.c_str(), options);
+ if (!status.isOK()) {
+ return status;
+ }
+
+ wunit.commit();
+ } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "create", ns);
+ return Status::OK();
+ }
+} // namespace mongo
diff --git a/src/mongo/db/catalog/create_collection.h b/src/mongo/db/catalog/create_collection.h
new file mode 100644
index 00000000000..e96a7d799f9
--- /dev/null
+++ b/src/mongo/db/catalog/create_collection.h
@@ -0,0 +1,43 @@
+/**
+ * Copyright (C) 2015 MongoDB Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, the copyright holders give permission to link the
+ * code of portions of this program with the OpenSSL library under certain
+ * conditions as described in each individual source file and distribute
+ * linked combinations including the program with the OpenSSL library. You
+ * must comply with the GNU Affero General Public License in all respects for
+ * all of the code used other than as permitted herein. If you modify file(s)
+ * with this exception, you may extend this exception to your version of the
+ * file(s), but you are not obligated to do so. If you do not wish to do so,
+ * delete this exception statement from your version. If you delete this
+ * exception statement from all source files in the program, then also delete
+ * it in the license file.
+ */
+
+#include <string>
+
+#include "mongo/base/status.h"
+
+namespace mongo {
+ class BSONObj;
+ class OperationContext;
+
+ /**
+ * Creates a collection as described in "cmdObj" on the database "dbName".
+ */
+ Status createCollection(OperationContext* txn,
+ const std::string& dbName,
+ const BSONObj& cmdObj);
+} // namespace mongo
diff --git a/src/mongo/db/clientcursor.cpp b/src/mongo/db/clientcursor.cpp
index 9fc4c309aa5..d0919fce1ab 100644
--- a/src/mongo/db/clientcursor.cpp
+++ b/src/mongo/db/clientcursor.cpp
@@ -339,8 +339,12 @@ namespace mongo {
actions.addAction(ActionType::cursorInfo);
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& jsobj, int, string& errmsg, BSONObjBuilder& result,
- bool fromRepl ) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& jsobj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
_appendCursorStats( result );
return true;
}
diff --git a/src/mongo/db/clientlistplugin.cpp b/src/mongo/db/clientlistplugin.cpp
index a777026cb0d..ba2069d2b69 100644
--- a/src/mongo/db/clientlistplugin.cpp
+++ b/src/mongo/db/clientlistplugin.cpp
@@ -174,8 +174,7 @@ namespace {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
scoped_ptr<MatchExpression> filter;
if ( cmdObj["filter"].isABSONObj() ) {
diff --git a/src/mongo/db/cloner.cpp b/src/mongo/db/cloner.cpp
index c8dae4e827d..88fdec2ece3 100644
--- a/src/mongo/db/cloner.cpp
+++ b/src/mongo/db/cloner.cpp
@@ -131,7 +131,7 @@ namespace mongo {
uassert(ErrorCodes::NotMaster,
str::stream() << "Not primary while cloning collection " << from_collection.ns()
<< " to " << to_collection.ns(),
- !logForRepl ||
+ !txn->writesAreReplicated() ||
repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(_dbName));
// Make sure database still exists after we resume from the temp release
@@ -148,7 +148,6 @@ namespace mongo {
<< to_collection.ns() << "]",
!createdCollection );
WriteUnitOfWork wunit(txn);
- invariant(logForRepl == txn->writesAreReplicated());
collection = db->createCollection(txn, to_collection.ns(), CollectionOptions());
verify(collection);
@@ -179,7 +178,7 @@ namespace mongo {
globalWriteLock.reset(new Lock::GlobalWrite(txn->lockState()));
// Check if everything is still all right.
- if (logForRepl) {
+ if (txn->writesAreReplicated()) {
uassert(28592,
str::stream() << "Cannot write to db: " << _dbName
<< " after yielding",
@@ -246,7 +245,6 @@ namespace mongo {
NamespaceString from_collection;
NamespaceString to_collection;
time_t saveLast;
- bool logForRepl;
bool _mayYield;
bool _mayBeInterrupted;
};
@@ -257,7 +255,6 @@ namespace mongo {
const string& toDBName,
const NamespaceString& from_collection,
const NamespaceString& to_collection,
- bool logForRepl,
bool masterSameProcess,
bool slaveOk,
bool mayYield,
@@ -270,7 +267,6 @@ namespace mongo {
f.from_collection = from_collection;
f.to_collection = to_collection;
f.saveLast = time( 0 );
- f.logForRepl = logForRepl;
f._mayYield = mayYield;
f._mayBeInterrupted = mayBeInterrupted;
@@ -285,7 +281,7 @@ namespace mongo {
str::stream() << "Not primary while cloning collection " << from_collection.ns()
<< " to " << to_collection.ns() << " with filter "
<< query.toString(),
- !logForRepl ||
+ !txn->writesAreReplicated() ||
repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(toDBName));
}
@@ -293,7 +289,6 @@ namespace mongo {
const string& toDBName,
const NamespaceString& from_collection,
const NamespaceString& to_collection,
- bool logForRepl,
bool masterSameProcess,
bool slaveOk,
bool mayYield,
@@ -317,7 +312,7 @@ namespace mongo {
uassert(ErrorCodes::NotMaster,
str::stream() << "Not primary while copying indexes from " << from_collection.ns()
<< " to " << to_collection.ns() << " (Cloner)",
- !logForRepl ||
+ !txn->writesAreReplicated() ||
repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(toDBName));
@@ -331,7 +326,6 @@ namespace mongo {
Collection* collection = db->getCollection( to_collection );
if ( !collection ) {
WriteUnitOfWork wunit(txn);
- invariant(logForRepl == txn->writesAreReplicated());
collection = db->createCollection(txn, to_collection.ns(), CollectionOptions());
invariant(collection);
wunit.commit();
@@ -355,7 +349,7 @@ namespace mongo {
WriteUnitOfWork wunit(txn);
indexer.commit();
- if (logForRepl) {
+ if (txn->writesAreReplicated()) {
const string targetSystemIndexesCollectionName =
to_collection.getSystemIndexesCollection();
const char* createIndexNs = targetSystemIndexesCollectionName.c_str();
@@ -373,8 +367,7 @@ namespace mongo {
string& errmsg,
bool mayYield,
bool mayBeInterrupted,
- bool shouldCopyIndexes,
- bool logForRepl) {
+ bool shouldCopyIndexes) {
const NamespaceString nss(ns);
const string dbname = nss.db().toString();
@@ -384,7 +377,7 @@ namespace mongo {
uassert(ErrorCodes::NotMaster,
str::stream() << "Not primary while copying collection " << ns << " (Cloner)",
- !logForRepl ||
+ !txn->writesAreReplicated() ||
repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(dbname));
Database* db = dbHolder().openDb(txn, dbname);
@@ -397,7 +390,6 @@ namespace mongo {
BSONObj col = collList.front();
if (col["options"].isABSONObj()) {
WriteUnitOfWork wunit(txn);
- invariant(logForRepl == txn->writesAreReplicated());
Status status = userCreateNS(txn, db, ns, col["options"].Obj(), 0);
if ( !status.isOK() ) {
errmsg = status.toString();
@@ -410,7 +402,7 @@ namespace mongo {
// main data
copy(txn, dbname,
nss, nss,
- logForRepl, false, true, mayYield, mayBeInterrupted,
+ false, true, mayYield, mayBeInterrupted,
Query(query).snapshot());
/* TODO : copyIndexes bool does not seem to be implemented! */
@@ -421,7 +413,7 @@ namespace mongo {
// indexes
copyIndexes(txn, dbname,
NamespaceString(ns), NamespaceString(ns),
- logForRepl, false, true, mayYield,
+ false, true, mayYield,
mayBeInterrupted);
return true;
@@ -438,7 +430,9 @@ namespace mongo {
if ( errCode ) {
*errCode = 0;
}
- massert( 10289 , "useReplAuth is not written to replication log", !opts.useReplAuth || !opts.logForRepl );
+ massert(10289,
+ "useReplAuth is not written to replication log",
+ !opts.useReplAuth || !txn->writesAreReplicated());
const ConnectionString cs = ConnectionString::parse(masterHost, errmsg);
if (!cs.isValid()) {
@@ -559,7 +553,7 @@ namespace mongo {
uassert(ErrorCodes::NotMaster,
str::stream() << "Not primary while cloning database " << opts.fromDB
<< " (after getting list of collections to clone)",
- !opts.logForRepl ||
+ !txn->writesAreReplicated() ||
repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(toDBName));
if ( opts.syncData ) {
@@ -579,7 +573,6 @@ namespace mongo {
// we defer building id index for performance - building it in batch is much
// faster
- invariant(opts.logForRepl == txn->writesAreReplicated());
Status createStatus = userCreateNS(txn, db, to_name.ns(), options, false);
if ( !createStatus.isOK() ) {
errmsg = str::stream() << "failed to create collection \""
@@ -600,7 +593,6 @@ namespace mongo {
toDBName,
from_name,
to_name,
- opts.logForRepl,
masterSameProcess,
opts.slaveOk,
opts.mayYield,
@@ -635,7 +627,11 @@ namespace mongo {
WriteUnitOfWork wunit(txn);
BSONObj id;
- c->deleteDocument(txn, *it, true, true, opts.logForRepl ? &id : NULL);
+ c->deleteDocument(txn,
+ *it,
+ true,
+ true,
+ txn->writesAreReplicated() ? &id : nullptr);
wunit.commit();
}
@@ -645,7 +641,7 @@ namespace mongo {
WriteUnitOfWork wunit(txn);
indexer.commit();
- if (opts.logForRepl) {
+ if (txn->writesAreReplicated()) {
getGlobalServiceContext()->getOpObserver()->onCreateIndex(
txn,
c->ns().getSystemIndexesCollection().c_str(),
@@ -671,7 +667,6 @@ namespace mongo {
toDBName,
from_name,
to_name,
- opts.logForRepl,
masterSameProcess,
opts.slaveOk,
opts.mayYield,
diff --git a/src/mongo/db/cloner.h b/src/mongo/db/cloner.h
index 80dd941b19e..e9218d8ab67 100644
--- a/src/mongo/db/cloner.h
+++ b/src/mongo/db/cloner.h
@@ -65,15 +65,13 @@ namespace mongo {
std::string& errmsg,
bool mayYield,
bool mayBeInterrupted,
- bool copyIndexes = true,
- bool logForRepl = true );
+ bool copyIndexes = true);
private:
void copy(OperationContext* txn,
const std::string& toDBName,
const NamespaceString& from_ns,
const NamespaceString& to_ns,
- bool logForRepl,
bool masterSameProcess,
bool slaveOk,
bool mayYield,
@@ -84,7 +82,6 @@ namespace mongo {
const std::string& toDBName,
const NamespaceString& from_ns,
const NamespaceString& to_ns,
- bool logForRepl,
bool masterSameProcess,
bool slaveOk,
bool mayYield,
@@ -103,7 +100,6 @@ namespace mongo {
*/
struct CloneOptions {
CloneOptions() {
- logForRepl = true;
slaveOk = false;
useReplAuth = false;
snapshot = true;
@@ -117,7 +113,6 @@ namespace mongo {
std::string fromDB;
std::set<std::string> collsToIgnore;
- bool logForRepl;
bool slaveOk;
bool useReplAuth;
bool snapshot;
diff --git a/src/mongo/db/commands.cpp b/src/mongo/db/commands.cpp
index f81caefe991..0db0b13e739 100644
--- a/src/mongo/db/commands.cpp
+++ b/src/mongo/db/commands.cpp
@@ -364,10 +364,9 @@ namespace mongo {
static Status _checkAuthorizationImpl(Command* c,
ClientBasic* client,
const std::string& dbname,
- const BSONObj& cmdObj,
- bool fromRepl) {
+ const BSONObj& cmdObj) {
namespace mmb = mutablebson;
- if ( c->adminOnly() && ! fromRepl && dbname != "admin" ) {
+ if ( c->adminOnly() && dbname != "admin" ) {
return Status(ErrorCodes::Unauthorized, str::stream() << c->name <<
" may only be run against the admin database.");
}
@@ -397,10 +396,9 @@ namespace mongo {
Status Command::_checkAuthorization(Command* c,
ClientBasic* client,
const std::string& dbname,
- const BSONObj& cmdObj,
- bool fromRepl) {
+ const BSONObj& cmdObj) {
namespace mmb = mutablebson;
- Status status = _checkAuthorizationImpl(c, client, dbname, cmdObj, fromRepl);
+ Status status = _checkAuthorizationImpl(c, client, dbname, cmdObj);
if (!status.isOK()) {
log(LogComponent::kAccessControl) << status << std::endl;
}
@@ -434,7 +432,12 @@ namespace mongo {
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- virtual bool run(OperationContext* txn, const string&, mongo::BSONObj&, int, std::string&, mongo::BSONObjBuilder& result, bool) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ mongo::BSONObj&,
+ int,
+ std::string&,
+ mongo::BSONObjBuilder& result) {
shardConnectionPool.flush();
pool.flush();
return true;
@@ -457,7 +460,12 @@ namespace mongo {
actions.addAction(ActionType::connPoolStats);
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- virtual bool run(OperationContext* txn, const string&, mongo::BSONObj&, int, std::string&, mongo::BSONObjBuilder& result, bool) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ mongo::BSONObj&,
+ int,
+ std::string&,
+ mongo::BSONObjBuilder& result) {
pool.appendInfo( result );
result.append( "numDBClientConnection" , DBClientConnection::getNumConnections() );
result.append( "numAScopedConnection" , AScopedConnection::getNumConnections() );
diff --git a/src/mongo/db/commands.h b/src/mongo/db/commands.h
index c3da3ad9578..16db4cf84bd 100644
--- a/src/mongo/db/commands.h
+++ b/src/mongo/db/commands.h
@@ -91,9 +91,6 @@ namespace mutablebson {
/* run the given command
implement this...
- fromRepl - command is being invoked as part of replication syncing. In this situation you
- normally do not want to log the command to the local oplog.
-
return value is true if succeeded. if false, set errmsg text.
*/
virtual bool run(OperationContext* txn,
@@ -101,8 +98,7 @@ namespace mutablebson {
BSONObj& cmdObj,
int options,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl = false ) = 0;
+ BSONObjBuilder& result) = 0;
/**
* This designation for the command is only used by the 'help' call and has nothing to do
@@ -130,7 +126,6 @@ namespace mutablebson {
virtual bool localHostOnlyIfNoAuth(const BSONObj& cmdObj) { return false; }
/* Return true if slaves are allowed to execute the command
- (the command directly from a client -- if fromRepl, always allowed).
*/
virtual bool slaveOk() const = 0;
@@ -262,8 +257,7 @@ namespace mutablebson {
int queryOptions,
const char *ns,
BSONObj& cmdObj,
- BSONObjBuilder& result,
- bool fromRepl );
+ BSONObjBuilder& result);
// For mongos
static void execCommandClientBasic(OperationContext* txn,
Command* c,
@@ -271,8 +265,7 @@ namespace mutablebson {
int queryOptions,
const char *ns,
BSONObj& cmdObj,
- BSONObjBuilder& result,
- bool fromRepl );
+ BSONObjBuilder& result);
// Helper for setting errmsg and ok field in command result object.
static void appendCommandStatus(BSONObjBuilder& result, bool ok, const std::string& errmsg);
@@ -339,10 +332,6 @@ namespace mutablebson {
* Checks to see if the client is authorized to run the given command with the given
* parameters on the given named database.
*
- * fromRepl is true if this command is running as part of oplog application, which for
- * historic reasons has slightly different authorization semantics. TODO(schwerin): Check
- * to see if this oddity can now be eliminated.
- *
* Returns Status::OK() if the command is authorized. Most likely returns
* ErrorCodes::Unauthorized otherwise, but any return other than Status::OK implies not
* authorized.
@@ -350,8 +339,7 @@ namespace mutablebson {
static Status _checkAuthorization(Command* c,
ClientBasic* client,
const std::string& dbname,
- const BSONObj& cmdObj,
- bool fromRepl);
+ const BSONObj& cmdObj);
};
bool _runCommands(OperationContext* txn,
@@ -359,7 +347,7 @@ namespace mutablebson {
BSONObj& _cmdobj,
BufBuilder& b,
BSONObjBuilder& anObjBuilder,
- bool fromRepl, int queryOptions);
+ int queryOptions);
bool runCommands(OperationContext* txn,
const char* ns,
@@ -367,7 +355,6 @@ namespace mutablebson {
CurOp& curop,
BufBuilder& b,
BSONObjBuilder& anObjBuilder,
- bool fromRepl,
int queryOptions);
} // namespace mongo
diff --git a/src/mongo/db/commands/apply_ops.cpp b/src/mongo/db/commands/apply_ops.cpp
index 5342d8ac1c8..3222c371ddc 100644
--- a/src/mongo/db/commands/apply_ops.cpp
+++ b/src/mongo/db/commands/apply_ops.cpp
@@ -80,10 +80,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
- invariant(!fromRepl == txn->writesAreReplicated());
-
+ BSONObjBuilder& result) {
if ( cmdObj.firstElement().type() != Array ) {
errmsg = "ops has to be an array";
return false;
diff --git a/src/mongo/db/commands/authentication_commands.cpp b/src/mongo/db/commands/authentication_commands.cpp
index 4a432e03cb2..6ebe3f06da8 100644
--- a/src/mongo/db/commands/authentication_commands.cpp
+++ b/src/mongo/db/commands/authentication_commands.cpp
@@ -113,7 +113,12 @@ namespace mongo {
virtual void addRequiredPrivileges(const std::string& dbname,
const BSONObj& cmdObj,
std::vector<Privilege>* out) {} // No auth required
- bool run(OperationContext* txn, const string&, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
nonce64 n = getNextNonce();
stringstream ss;
ss << hex << n;
@@ -152,8 +157,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
if (!serverGlobalParams.quiet) {
mutablebson::Document cmdToLog(cmdObj, mutablebson::Document::kInPlaceDisabled);
@@ -413,8 +417,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationSession* authSession =
AuthorizationSession::get(ClientBasic::getCurrent());
authSession->logoutDatabase(dbname);
diff --git a/src/mongo/db/commands/authentication_commands.h b/src/mongo/db/commands/authentication_commands.h
index e6b0dd87ab5..e22711454e2 100644
--- a/src/mongo/db/commands/authentication_commands.h
+++ b/src/mongo/db/commands/authentication_commands.h
@@ -55,8 +55,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl);
+ BSONObjBuilder& result);
private:
/**
diff --git a/src/mongo/db/commands/cleanup_orphaned_cmd.cpp b/src/mongo/db/commands/cleanup_orphaned_cmd.cpp
index 3294bec5b92..876297e2d56 100644
--- a/src/mongo/db/commands/cleanup_orphaned_cmd.cpp
+++ b/src/mongo/db/commands/cleanup_orphaned_cmd.cpp
@@ -216,8 +216,7 @@ namespace mongo {
BSONObj &cmdObj,
int,
string &errmsg,
- BSONObjBuilder &result,
- bool ) {
+ BSONObjBuilder &result) {
string ns;
if ( !FieldParser::extract( cmdObj, nsField, &ns, &errmsg ) ) {
diff --git a/src/mongo/db/commands/clone.cpp b/src/mongo/db/commands/clone.cpp
index bc0b8f70311..78b576553b3 100644
--- a/src/mongo/db/commands/clone.cpp
+++ b/src/mongo/db/commands/clone.cpp
@@ -92,8 +92,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
string from = cmdObj.getStringField("clone");
if ( from.empty() )
@@ -101,7 +100,6 @@ namespace mongo {
CloneOptions opts;
opts.fromDB = dbname;
- opts.logForRepl = ! fromRepl;
opts.slaveOk = cmdObj["slaveOk"].trueValue();
// See if there's any collections we should ignore
diff --git a/src/mongo/db/commands/clone_collection.cpp b/src/mongo/db/commands/clone_collection.cpp
index 734d49ff100..1c5bbfe0bb2 100644
--- a/src/mongo/db/commands/clone_collection.cpp
+++ b/src/mongo/db/commands/clone_collection.cpp
@@ -104,8 +104,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
string fromhost = cmdObj.getStringField("from");
if ( fromhost.empty() ) {
diff --git a/src/mongo/db/commands/collection_to_capped.cpp b/src/mongo/db/commands/collection_to_capped.cpp
index 5538e4b70e0..97e4637d296 100644
--- a/src/mongo/db/commands/collection_to_capped.cpp
+++ b/src/mongo/db/commands/collection_to_capped.cpp
@@ -82,9 +82,7 @@ namespace mongo {
BSONObj& jsobj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
- invariant(!fromRepl == txn->writesAreReplicated());
+ BSONObjBuilder& result) {
string from = jsobj.getStringField( "cloneCollectionAsCapped" );
string to = jsobj.getStringField( "toCollection" );
double size = jsobj.getField( "size" ).number();
@@ -98,8 +96,7 @@ namespace mongo {
ScopedTransaction transaction(txn, MODE_IX);
AutoGetDb autoDb(txn, dbname, MODE_X);
- if (!fromRepl &&
- !repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(dbname)) {
+ if (!repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(dbname)) {
return appendCommandStatus(result, Status(ErrorCodes::NotMaster, str::stream()
<< "Not primary while cloning collection " << from << " to " << to
<< " (as capped)"));
@@ -156,8 +153,7 @@ namespace mongo {
BSONObj& jsobj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl ) {
+ BSONObjBuilder& result) {
string shortSource = jsobj.getStringField( "convertToCapped" );
double size = jsobj.getField( "size" ).number();
diff --git a/src/mongo/db/commands/compact.cpp b/src/mongo/db/commands/compact.cpp
index 12bb7f16a6d..c0986823389 100644
--- a/src/mongo/db/commands/compact.cpp
+++ b/src/mongo/db/commands/compact.cpp
@@ -87,7 +87,12 @@ namespace mongo {
return IndexBuilder::killMatchingIndexBuilds(db->getCollection(ns), criteria);
}
- virtual bool run(OperationContext* txn, const string& db, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string& db,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
const std::string nsToCompact = parseNsCollectionRequired(db, cmdObj);
repl::ReplicationCoordinator* replCoord = repl::getGlobalReplicationCoordinator();
diff --git a/src/mongo/db/commands/connection_status.cpp b/src/mongo/db/commands/connection_status.cpp
index 1ad5d9f4318..06a4367c9ed 100644
--- a/src/mongo/db/commands/connection_status.cpp
+++ b/src/mongo/db/commands/connection_status.cpp
@@ -52,7 +52,7 @@ namespace mongo {
}
bool run(OperationContext* txn, const string&, BSONObj& cmdObj, int, string& errmsg,
- BSONObjBuilder& result, bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationSession* authSession =
AuthorizationSession::get(ClientBasic::getCurrent());
diff --git a/src/mongo/db/commands/copydb.cpp b/src/mongo/db/commands/copydb.cpp
index d043f717ddd..415f3b396c7 100644
--- a/src/mongo/db/commands/copydb.cpp
+++ b/src/mongo/db/commands/copydb.cpp
@@ -126,8 +126,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
string fromhost = cmdObj.getStringField("fromhost");
bool fromSelf = fromhost.empty();
@@ -140,7 +139,6 @@ namespace mongo {
CloneOptions cloneOptions;
cloneOptions.fromDB = cmdObj.getStringField("fromdb");
- cloneOptions.logForRepl = !fromRepl;
cloneOptions.slaveOk = cmdObj["slaveOk"].trueValue();
cloneOptions.useReplAuth = false;
cloneOptions.snapshot = true;
diff --git a/src/mongo/db/commands/copydb_start_commands.cpp b/src/mongo/db/commands/copydb_start_commands.cpp
index 18979fa6022..99c79e9345a 100644
--- a/src/mongo/db/commands/copydb_start_commands.cpp
+++ b/src/mongo/db/commands/copydb_start_commands.cpp
@@ -100,8 +100,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
string fromhost = cmdObj.getStringField("fromhost");
if ( fromhost.empty() ) {
@@ -174,8 +173,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
string fromDb = cmdObj.getStringField("fromdb");
string fromHost = cmdObj.getStringField("fromhost");
diff --git a/src/mongo/db/commands/count.cpp b/src/mongo/db/commands/count.cpp
index 64605e5878a..15700af1d42 100644
--- a/src/mongo/db/commands/count.cpp
+++ b/src/mongo/db/commands/count.cpp
@@ -114,8 +114,7 @@ namespace mongo {
const string& dbname,
BSONObj& cmdObj,
int, string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
CountRequest request;
Status parseStatus = parseRequest(dbname, cmdObj, &request);
diff --git a/src/mongo/db/commands/cpuprofile.cpp b/src/mongo/db/commands/cpuprofile.cpp
index 283e9d7c0b6..b50dd0233a5 100644
--- a/src/mongo/db/commands/cpuprofile.cpp
+++ b/src/mongo/db/commands/cpuprofile.cpp
@@ -100,8 +100,7 @@ namespace mongo {
BSONObj &cmdObj,
int options,
std::string &errmsg,
- BSONObjBuilder &result,
- bool fromRepl );
+ BSONObjBuilder &result);
static char const *const commandName;
} cpuProfilerStartCommandInstance;
@@ -118,8 +117,7 @@ namespace mongo {
BSONObj &cmdObj,
int options,
std::string &errmsg,
- BSONObjBuilder &result,
- bool fromRepl );
+ BSONObjBuilder &result);
static char const *const commandName;
} cpuProfilerStopCommandInstance;
@@ -132,8 +130,7 @@ namespace mongo {
BSONObj &cmdObj,
int options,
std::string &errmsg,
- BSONObjBuilder &result,
- bool fromRepl ) {
+ BSONObjBuilder &result) {
ScopedTransaction transaction(txn, MODE_IX);
Lock::DBLock dbXLock(txn->lockState(), db, MODE_X);
// The lock here is just to prevent concurrency, nothing will write.
@@ -152,8 +149,7 @@ namespace mongo {
BSONObj &cmdObj,
int options,
std::string &errmsg,
- BSONObjBuilder &result,
- bool fromRepl ) {
+ BSONObjBuilder &result) {
ScopedTransaction transaction(txn, MODE_IX);
Lock::DBLock dbXLock(txn->lockState(), db, MODE_X);
OldClientContext ctx(txn, db);
diff --git a/src/mongo/db/commands/create_indexes.cpp b/src/mongo/db/commands/create_indexes.cpp
index 6b0de488273..46ad1759247 100644
--- a/src/mongo/db/commands/create_indexes.cpp
+++ b/src/mongo/db/commands/create_indexes.cpp
@@ -84,10 +84,7 @@ namespace mongo {
}
virtual bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int options,
- string& errmsg, BSONObjBuilder& result,
- bool fromRepl = false ) {
- invariant(!fromRepl == txn->writesAreReplicated());
-
+ string& errmsg, BSONObjBuilder& result) {
// --- parse
NamespaceString ns( dbname, cmdObj[name].String() );
@@ -144,8 +141,7 @@ namespace mongo {
// Note: createIndexes command does not currently respect shard versioning.
ScopedTransaction transaction(txn, MODE_IX);
Lock::DBLock dbLock(txn->lockState(), ns.db(), MODE_X);
- if (!fromRepl &&
- !repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(dbname)) {
+ if (!repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(dbname)) {
return appendCommandStatus(result, Status(ErrorCodes::NotMaster, str::stream()
<< "Not primary while creating indexes in " << ns.ns()));
}
@@ -207,8 +203,7 @@ namespace mongo {
if (indexer.getBuildInBackground()) {
txn->recoveryUnit()->commitAndRestart();
dbLock.relockWithMode(MODE_IX);
- if (!fromRepl &&
- !repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(dbname)) {
+ if (!repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(dbname)) {
return appendCommandStatus(result, Status(ErrorCodes::NotMaster, str::stream()
<< "Not primary while creating background indexes in " << ns.ns()));
}
@@ -228,8 +223,7 @@ namespace mongo {
// that day, to avoid data corruption due to lack of index cleanup.
txn->recoveryUnit()->commitAndRestart();
dbLock.relockWithMode(MODE_X);
- if (!fromRepl &&
- !repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(
+ if (!repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(
dbname)) {
return appendCommandStatus(
result,
@@ -251,7 +245,6 @@ namespace mongo {
dbLock.relockWithMode(MODE_X);
uassert(ErrorCodes::NotMaster,
str::stream() << "Not primary while completing index build in " << dbname,
- fromRepl ||
repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(
dbname));
@@ -266,13 +259,11 @@ namespace mongo {
indexer.commit();
- if ( !fromRepl ) {
- for ( size_t i = 0; i < specs.size(); i++ ) {
- std::string systemIndexes = ns.getSystemIndexesCollection();
- getGlobalServiceContext()->getOpObserver()->onCreateIndex(txn,
- systemIndexes,
- specs[i]);
- }
+ for ( size_t i = 0; i < specs.size(); i++ ) {
+ std::string systemIndexes = ns.getSystemIndexesCollection();
+ getGlobalServiceContext()->getOpObserver()->onCreateIndex(txn,
+ systemIndexes,
+ specs[i]);
}
wunit.commit();
diff --git a/src/mongo/db/commands/current_op.cpp b/src/mongo/db/commands/current_op.cpp
index 6648aa7d869..f5306d9dbe0 100644
--- a/src/mongo/db/commands/current_op.cpp
+++ b/src/mongo/db/commands/current_op.cpp
@@ -74,8 +74,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) final {
+ BSONObjBuilder& result) final {
const bool includeAll = cmdObj["$all"].trueValue();
diff --git a/src/mongo/db/commands/dbhash.cpp b/src/mongo/db/commands/dbhash.cpp
index 9f12c82d699..b99d8305a40 100644
--- a/src/mongo/db/commands/dbhash.cpp
+++ b/src/mongo/db/commands/dbhash.cpp
@@ -143,7 +143,12 @@ namespace mongo {
return hash;
}
- bool DBHashCmd::run(OperationContext* txn, const string& dbname , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool) {
+ bool DBHashCmd::run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Timer timer;
set<string> desiredCollections;
diff --git a/src/mongo/db/commands/dbhash.h b/src/mongo/db/commands/dbhash.h
index 2063cfeca22..35e5c9302fb 100644
--- a/src/mongo/db/commands/dbhash.h
+++ b/src/mongo/db/commands/dbhash.h
@@ -46,7 +46,12 @@ namespace mongo {
const BSONObj& cmdObj,
std::vector<Privilege>* out);
- virtual bool run(OperationContext* txn, const std::string& dbname , BSONObj& cmdObj, int, std::string& errmsg, BSONObjBuilder& result, bool);
+ virtual bool run(OperationContext* txn,
+ const std::string& dbname,
+ BSONObj& cmdObj,
+ int,
+ std::string& errmsg,
+ BSONObjBuilder& result);
void wipeCacheForCollection(OperationContext* txn, StringData ns);
diff --git a/src/mongo/db/commands/distinct.cpp b/src/mongo/db/commands/distinct.cpp
index 3bf0220c8c9..778bfdd723d 100644
--- a/src/mongo/db/commands/distinct.cpp
+++ b/src/mongo/db/commands/distinct.cpp
@@ -71,8 +71,12 @@ namespace mongo {
help << "{ distinct : 'collection name' , key : 'a.b' , query : {} }";
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result,
- bool fromRepl ) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Timer t;
diff --git a/src/mongo/db/commands/drop_indexes.cpp b/src/mongo/db/commands/drop_indexes.cpp
index 8b1a898be1e..d4558145bce 100644
--- a/src/mongo/db/commands/drop_indexes.cpp
+++ b/src/mongo/db/commands/drop_indexes.cpp
@@ -83,9 +83,12 @@ namespace mongo {
}
CmdDropIndexes() : Command("dropIndexes", false, "deleteIndexes") { }
- bool run(OperationContext* txn, const string& dbname, BSONObj& jsobj, int, string& errmsg,
- BSONObjBuilder& result, bool fromRepl) {
- invariant(!fromRepl == txn->writesAreReplicated());
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& jsobj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
const std::string ns = parseNsCollectionRequired(dbname, jsobj);
return appendCommandStatus(result,
dropIndexes(txn,
@@ -121,7 +124,12 @@ namespace mongo {
return IndexBuilder::killMatchingIndexBuilds(db->getCollection(ns), criteria);
}
- bool run(OperationContext* txn, const string& dbname , BSONObj& jsobj, int, string& errmsg, BSONObjBuilder& result, bool /*fromRepl*/) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& jsobj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
DBDirectClient db(txn);
const std::string toDeleteNs = parseNsCollectionRequired(dbname, jsobj);
diff --git a/src/mongo/db/commands/explain_cmd.cpp b/src/mongo/db/commands/explain_cmd.cpp
index 9a411c8fa26..b7184152110 100644
--- a/src/mongo/db/commands/explain_cmd.cpp
+++ b/src/mongo/db/commands/explain_cmd.cpp
@@ -67,15 +67,7 @@ namespace mongo {
const string& dbname,
BSONObj& cmdObj, int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
- // Should never get explain commands issued from replication.
- if (fromRepl) {
- Status commandStat(ErrorCodes::IllegalOperation,
- "explain command should not be from repl");
- appendCommandStatus(result, commandStat);
- return false;
- }
+ BSONObjBuilder& result) {
ExplainCommon::Verbosity verbosity;
Status parseStatus = ExplainCommon::parseCmdBSON(cmdObj, &verbosity);
diff --git a/src/mongo/db/commands/explain_cmd.h b/src/mongo/db/commands/explain_cmd.h
index 5fab99fc8ff..24edec205ca 100644
--- a/src/mongo/db/commands/explain_cmd.h
+++ b/src/mongo/db/commands/explain_cmd.h
@@ -82,8 +82,7 @@ namespace mongo {
const std::string& dbname,
BSONObj& cmdObj, int options,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl);
+ BSONObjBuilder& result);
};
diff --git a/src/mongo/db/commands/fail_point_cmd.cpp b/src/mongo/db/commands/fail_point_cmd.cpp
index 4b570c828e9..944d3ca491c 100644
--- a/src/mongo/db/commands/fail_point_cmd.cpp
+++ b/src/mongo/db/commands/fail_point_cmd.cpp
@@ -88,8 +88,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
const string failPointName(cmdObj.firstElement().str());
FailPointRegistry* registry = getGlobalFailPointRegistry();
FailPoint* failPoint = registry->getFailPoint(failPointName);
diff --git a/src/mongo/db/commands/find_and_modify.cpp b/src/mongo/db/commands/find_and_modify.cpp
index 227f684e16d..b8e76b8e0a2 100644
--- a/src/mongo/db/commands/find_and_modify.cpp
+++ b/src/mongo/db/commands/find_and_modify.cpp
@@ -395,9 +395,9 @@ namespace {
BSONObj& cmdObj,
int options,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) override {
- invariant(!fromRepl); // findAndModify command is not replicated directly.
+ BSONObjBuilder& result) override {
+ // findAndModify command is not replicated directly.
+ invariant(txn->writesAreReplicated());
const std::string fullNs = parseNsCollectionRequired(dbName, cmdObj);
StatusWith<FindAndModifyRequest> parseStatus =
diff --git a/src/mongo/db/commands/find_cmd.cpp b/src/mongo/db/commands/find_cmd.cpp
index 3e41d395090..e856c9639a8 100644
--- a/src/mongo/db/commands/find_cmd.cpp
+++ b/src/mongo/db/commands/find_cmd.cpp
@@ -174,8 +174,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) override {
+ BSONObjBuilder& result) override {
const std::string fullns = parseNs(dbname, cmdObj);
const NamespaceString nss(fullns);
diff --git a/src/mongo/db/commands/fsync.cpp b/src/mongo/db/commands/fsync.cpp
index 3307e96b80e..fb4e1dd167b 100644
--- a/src/mongo/db/commands/fsync.cpp
+++ b/src/mongo/db/commands/fsync.cpp
@@ -105,7 +105,12 @@ namespace mongo {
actions.addAction(ActionType::fsync);
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- virtual bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
if (txn->lockState()->isLocked()) {
errmsg = "fsync: Cannot execute fsync command from contexts that hold a data lock";
@@ -191,8 +196,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) override {
+ BSONObjBuilder& result) override {
log() << "command: unlock requested";
diff --git a/src/mongo/db/commands/geo_near_cmd.cpp b/src/mongo/db/commands/geo_near_cmd.cpp
index 066386779de..d543772e0ae 100644
--- a/src/mongo/db/commands/geo_near_cmd.cpp
+++ b/src/mongo/db/commands/geo_near_cmd.cpp
@@ -77,7 +77,12 @@ namespace mongo {
out->push_back(Privilege(parseResourcePattern(dbname, cmdObj), actions));
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
if (!cmdObj["start"].eoo()) {
errmsg = "using deprecated 'start' argument to geoNear";
return false;
diff --git a/src/mongo/db/commands/get_last_error.cpp b/src/mongo/db/commands/get_last_error.cpp
index 065fc484d58..25a2069dee6 100644
--- a/src/mongo/db/commands/get_last_error.cpp
+++ b/src/mongo/db/commands/get_last_error.cpp
@@ -66,7 +66,12 @@ namespace mongo {
help << "reset error state (used with getpreverror)";
}
CmdResetError() : Command("resetError", false, "reseterror") {}
- bool run(OperationContext* txn, const string& db, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool run(OperationContext* txn,
+ const string& db,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
LastError *le = lastError.get();
verify( le );
le->reset();
@@ -97,8 +102,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl ) {
+ BSONObjBuilder& result) {
//
// Correct behavior here is very finicky.
@@ -275,7 +279,12 @@ namespace mongo {
const BSONObj& cmdObj,
std::vector<Privilege>* out) {} // No auth required
CmdGetPrevError() : Command("getPrevError", false, "getpreverror") {}
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
LastError *le = lastError.disableForCommand();
le->appendSelf( result );
if ( le->valid )
diff --git a/src/mongo/db/commands/getmore_cmd.cpp b/src/mongo/db/commands/getmore_cmd.cpp
index 190e9bac1e6..4e96ae4544c 100644
--- a/src/mongo/db/commands/getmore_cmd.cpp
+++ b/src/mongo/db/commands/getmore_cmd.cpp
@@ -110,8 +110,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) override {
+ BSONObjBuilder& result) override {
// Counted as a getMore, not as a command.
globalOpCounters.gotGetMore();
diff --git a/src/mongo/db/commands/group.cpp b/src/mongo/db/commands/group.cpp
index d7310e69ab8..4dd4f5a1956 100644
--- a/src/mongo/db/commands/group.cpp
+++ b/src/mongo/db/commands/group.cpp
@@ -132,8 +132,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
std::string& errmsg,
- BSONObjBuilder& out,
- bool fromRepl) {
+ BSONObjBuilder& out) {
GroupRequest groupRequest;
Status parseRequestStatus = parseRequest(dbname, cmdObj, &groupRequest);
if (!parseRequestStatus.isOK()) {
diff --git a/src/mongo/db/commands/group.h b/src/mongo/db/commands/group.h
index 55da71df1d0..d6486a8d978 100644
--- a/src/mongo/db/commands/group.h
+++ b/src/mongo/db/commands/group.h
@@ -68,8 +68,7 @@ namespace mongo {
BSONObj& jsobj,
int,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl);
+ BSONObjBuilder& result);
virtual Status explain(OperationContext* txn,
const std::string& dbname,
diff --git a/src/mongo/db/commands/hashcmd.cpp b/src/mongo/db/commands/hashcmd.cpp
index 94d9267ded7..21fc475469d 100644
--- a/src/mongo/db/commands/hashcmd.cpp
+++ b/src/mongo/db/commands/hashcmd.cpp
@@ -78,8 +78,7 @@ namespace mongo {
bool run(OperationContext* txn, const string& db,
BSONObj& cmdObj,
int options, string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl = false ){
+ BSONObjBuilder& result){
result.appendAs(cmdObj.firstElement(),"key");
int seed = 0;
diff --git a/src/mongo/db/commands/index_filter_commands.cpp b/src/mongo/db/commands/index_filter_commands.cpp
index 8532a22df36..5aa1301b0cf 100644
--- a/src/mongo/db/commands/index_filter_commands.cpp
+++ b/src/mongo/db/commands/index_filter_commands.cpp
@@ -126,8 +126,12 @@ namespace mongo {
: Command(name),
helpText(helpText) { }
- bool IndexFilterCommand::run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int options,
- string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool IndexFilterCommand::run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int options,
+ string& errmsg,
+ BSONObjBuilder& result) {
string ns = parseNs(dbname, cmdObj);
Status status = runIndexFilterCommand(txn, ns, cmdObj, &result);
diff --git a/src/mongo/db/commands/index_filter_commands.h b/src/mongo/db/commands/index_filter_commands.h
index cb46b8d4e46..1ed6fa506c0 100644
--- a/src/mongo/db/commands/index_filter_commands.h
+++ b/src/mongo/db/commands/index_filter_commands.h
@@ -63,8 +63,12 @@ namespace mongo {
* implement plan cache command functionality.
*/
- bool run(OperationContext* txn, const std::string& dbname, BSONObj& cmdObj, int options,
- std::string& errmsg, BSONObjBuilder& result, bool fromRepl);
+ bool run(OperationContext* txn,
+ const std::string& dbname,
+ BSONObj& cmdObj,
+ int options,
+ std::string& errmsg,
+ BSONObjBuilder& result);
virtual bool isWriteCommandForConfigServer() const;
diff --git a/src/mongo/db/commands/isself.cpp b/src/mongo/db/commands/isself.cpp
index 8b6c6fd6d9f..ebec8ae4fdb 100644
--- a/src/mongo/db/commands/isself.cpp
+++ b/src/mongo/db/commands/isself.cpp
@@ -50,7 +50,12 @@ namespace mongo {
virtual void addRequiredPrivileges(const std::string& dbname,
const BSONObj& cmdObj,
std::vector<Privilege>* out) {} // No auth required
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl ) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
result.append( "id" , repl::instanceId );
return true;
}
diff --git a/src/mongo/db/commands/kill_op.cpp b/src/mongo/db/commands/kill_op.cpp
index afcc12c4a9f..efa43986d0d 100644
--- a/src/mongo/db/commands/kill_op.cpp
+++ b/src/mongo/db/commands/kill_op.cpp
@@ -71,8 +71,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) final {
+ BSONObjBuilder& result) final {
long long op;
uassertStatusOK(bsonExtractIntegerField(cmdObj, "op", &op));
diff --git a/src/mongo/db/commands/list_collections.cpp b/src/mongo/db/commands/list_collections.cpp
index 64767c6cb07..1e98b719214 100644
--- a/src/mongo/db/commands/list_collections.cpp
+++ b/src/mongo/db/commands/list_collections.cpp
@@ -93,8 +93,7 @@ namespace mongo {
BSONObj& jsobj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool /*fromRepl*/) {
+ BSONObjBuilder& result) {
boost::scoped_ptr<MatchExpression> matcher;
BSONElement filterElt = jsobj["filter"];
if (!filterElt.eoo()) {
diff --git a/src/mongo/db/commands/list_databases.cpp b/src/mongo/db/commands/list_databases.cpp
index e5997e36d2c..81779a83a76 100644
--- a/src/mongo/db/commands/list_databases.cpp
+++ b/src/mongo/db/commands/list_databases.cpp
@@ -74,8 +74,7 @@ namespace mongo {
BSONObj& jsobj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool /*fromRepl*/) {
+ BSONObjBuilder& result) {
vector< string > dbNames;
StorageEngine* storageEngine = getGlobalServiceContext()->getGlobalStorageEngine();
diff --git a/src/mongo/db/commands/list_indexes.cpp b/src/mongo/db/commands/list_indexes.cpp
index fddf6cc6cba..c53303b04c7 100644
--- a/src/mongo/db/commands/list_indexes.cpp
+++ b/src/mongo/db/commands/list_indexes.cpp
@@ -91,8 +91,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool /*fromRepl*/) {
+ BSONObjBuilder& result) {
BSONElement first = cmdObj.firstElement();
uassert(
diff --git a/src/mongo/db/commands/merge_chunks_cmd.cpp b/src/mongo/db/commands/merge_chunks_cmd.cpp
index 9212b4183ff..87721b11469 100644
--- a/src/mongo/db/commands/merge_chunks_cmd.cpp
+++ b/src/mongo/db/commands/merge_chunks_cmd.cpp
@@ -88,8 +88,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool ) {
+ BSONObjBuilder& result) {
string ns = parseNs(dbname, cmdObj);
diff --git a/src/mongo/db/commands/mr.cpp b/src/mongo/db/commands/mr.cpp
index 259cb19a314..34b4ad96904 100644
--- a/src/mongo/db/commands/mr.cpp
+++ b/src/mongo/db/commands/mr.cpp
@@ -1266,8 +1266,12 @@ namespace mongo {
addPrivilegesRequiredForMapReduce(this, dbname, cmdObj, out);
}
- bool run(OperationContext* txn, const string& dbname , BSONObj& cmd, int, string& errmsg, BSONObjBuilder& result, bool fromRepl ) {
- invariant(!fromRepl == txn->writesAreReplicated());
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmd,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Timer t;
if (txn->getClient()->isInDirectClient()) {
@@ -1546,7 +1550,12 @@ namespace mongo {
actions.addAction(ActionType::internal);
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- bool run(OperationContext* txn, const string& dbname , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
ShardedConnectionInfo::addHook();
// legacy name
string shardedOutputCollection = cmdObj["shardedOutputCollection"].valuestrsafe();
diff --git a/src/mongo/db/commands/oplog_note.cpp b/src/mongo/db/commands/oplog_note.cpp
index c57d43c86bb..c512c2a8c8b 100644
--- a/src/mongo/db/commands/oplog_note.cpp
+++ b/src/mongo/db/commands/oplog_note.cpp
@@ -67,8 +67,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
if (!repl::getGlobalReplicationCoordinator()->isReplEnabled()) {
return appendCommandStatus(result, Status(
ErrorCodes::NoReplicationEnabled,
diff --git a/src/mongo/db/commands/parallel_collection_scan.cpp b/src/mongo/db/commands/parallel_collection_scan.cpp
index a84e9070a21..49ebeb9de5a 100644
--- a/src/mongo/db/commands/parallel_collection_scan.cpp
+++ b/src/mongo/db/commands/parallel_collection_scan.cpp
@@ -71,9 +71,12 @@ namespace mongo {
return Status(ErrorCodes::Unauthorized, "Unauthorized");
}
- virtual bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int options,
- string& errmsg, BSONObjBuilder& result,
- bool fromRepl = false ) {
+ virtual bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int options,
+ string& errmsg,
+ BSONObjBuilder& result) {
NamespaceString ns( dbname, cmdObj[name].String() );
diff --git a/src/mongo/db/commands/parameters.cpp b/src/mongo/db/commands/parameters.cpp
index 5ee17f6c962..c9048ee54c2 100644
--- a/src/mongo/db/commands/parameters.cpp
+++ b/src/mongo/db/commands/parameters.cpp
@@ -80,7 +80,12 @@ namespace mongo {
appendParameterNames( help );
help << "{ getParameter:'*' } to get everything\n";
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl ) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
bool all = *cmdObj.firstElement().valuestrsafe() == '*';
int before = result.len();
@@ -118,7 +123,12 @@ namespace mongo {
help << "{ setParameter:1, <param>:<value> }\n";
appendParameterNames( help );
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl ) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
int numSet = 0;
bool found = false;
diff --git a/src/mongo/db/commands/pipeline_command.cpp b/src/mongo/db/commands/pipeline_command.cpp
index a67620e6343..f94eec9d11d 100644
--- a/src/mongo/db/commands/pipeline_command.cpp
+++ b/src/mongo/db/commands/pipeline_command.cpp
@@ -180,8 +180,12 @@ namespace mongo {
Pipeline::addRequiredPrivileges(this, dbname, cmdObj, out);
}
- virtual bool run(OperationContext* txn, const string &db, BSONObj &cmdObj, int options,
- string &errmsg, BSONObjBuilder &result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string &db,
+ BSONObj &cmdObj,
+ int options,
+ string &errmsg,
+ BSONObjBuilder &result) {
NamespaceString nss(parseNs(db, cmdObj));
if (nss.coll().empty()) {
errmsg = "missing collection name";
diff --git a/src/mongo/db/commands/plan_cache_commands.cpp b/src/mongo/db/commands/plan_cache_commands.cpp
index 9098299c800..0f7003e3dd9 100644
--- a/src/mongo/db/commands/plan_cache_commands.cpp
+++ b/src/mongo/db/commands/plan_cache_commands.cpp
@@ -124,8 +124,12 @@ namespace mongo {
helpText(helpText),
actionType(actionType) { }
- bool PlanCacheCommand::run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int options,
- string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool PlanCacheCommand::run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int options,
+ string& errmsg,
+ BSONObjBuilder& result) {
string ns = parseNs(dbname, cmdObj);
Status status = runPlanCacheCommand(txn, ns, cmdObj, &result);
diff --git a/src/mongo/db/commands/plan_cache_commands.h b/src/mongo/db/commands/plan_cache_commands.h
index 34660d9a48b..05b7c5969a8 100644
--- a/src/mongo/db/commands/plan_cache_commands.h
+++ b/src/mongo/db/commands/plan_cache_commands.h
@@ -58,8 +58,12 @@ namespace mongo {
* implement plan cache command functionality.
*/
- bool run(OperationContext* txn, const std::string& dbname, BSONObj& cmdObj, int options,
- std::string& errmsg, BSONObjBuilder& result, bool fromRepl);
+ bool run(OperationContext* txn,
+ const std::string& dbname,
+ BSONObj& cmdObj,
+ int options,
+ std::string& errmsg,
+ BSONObjBuilder& result);
virtual bool isWriteCommandForConfigServer() const;
diff --git a/src/mongo/db/commands/rename_collection.cpp b/src/mongo/db/commands/rename_collection.cpp
index 2cc098bf621..91d7ac3254f 100644
--- a/src/mongo/db/commands/rename_collection.cpp
+++ b/src/mongo/db/commands/rename_collection.cpp
@@ -112,9 +112,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
- invariant(!fromRepl == txn->writesAreReplicated());
+ BSONObjBuilder& result) {
string source = cmdObj.getStringField( name.c_str() );
string target = cmdObj.getStringField( "to" );
@@ -145,18 +143,16 @@ namespace mongo {
return false;
}
- if (!fromRepl) { // If it got through on the master, need to allow it here too
- Status sourceStatus = userAllowedWriteNS(source);
- if (!sourceStatus.isOK()) {
- errmsg = "error with source namespace: " + sourceStatus.reason();
- return false;
- }
+ Status sourceStatus = userAllowedWriteNS(source);
+ if (!sourceStatus.isOK()) {
+ errmsg = "error with source namespace: " + sourceStatus.reason();
+ return false;
+ }
- Status targetStatus = userAllowedWriteNS(target);
- if (!targetStatus.isOK()) {
- errmsg = "error with target namespace: " + targetStatus.reason();
- return false;
- }
+ Status targetStatus = userAllowedWriteNS(target);
+ if (!targetStatus.isOK()) {
+ errmsg = "error with target namespace: " + targetStatus.reason();
+ return false;
}
if (NamespaceString(source).coll() == "system.indexes"
diff --git a/src/mongo/db/commands/repair_cursor.cpp b/src/mongo/db/commands/repair_cursor.cpp
index cc2cf8d183b..1c7c653081b 100644
--- a/src/mongo/db/commands/repair_cursor.cpp
+++ b/src/mongo/db/commands/repair_cursor.cpp
@@ -59,9 +59,12 @@ namespace mongo {
return Status(ErrorCodes::Unauthorized, "Unauthorized");
}
- virtual bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int options,
- string& errmsg, BSONObjBuilder& result,
- bool fromRepl = false ) {
+ virtual bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int options,
+ string& errmsg,
+ BSONObjBuilder& result) {
NamespaceString ns(parseNs(dbname, cmdObj));
diff --git a/src/mongo/db/commands/server_status.cpp b/src/mongo/db/commands/server_status.cpp
index 5b3973753b3..d2bf917f6c4 100644
--- a/src/mongo/db/commands/server_status.cpp
+++ b/src/mongo/db/commands/server_status.cpp
@@ -81,7 +81,12 @@ namespace mongo {
actions.addAction(ActionType::serverStatus);
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
_runCalled = true;
diff --git a/src/mongo/db/commands/test_commands.cpp b/src/mongo/db/commands/test_commands.cpp
index 6ab83549325..e0eeb67c365 100644
--- a/src/mongo/db/commands/test_commands.cpp
+++ b/src/mongo/db/commands/test_commands.cpp
@@ -67,7 +67,12 @@ namespace mongo {
virtual void help( stringstream &help ) const {
help << "internal. for testing only.";
}
- virtual bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool) {
+ virtual bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
string coll = cmdObj[ "godinsert" ].valuestrsafe();
log() << "test only command godinsert invoked coll:" << coll << endl;
uassert( 13049, "godinsert must specify a collection", !coll.empty() );
@@ -113,7 +118,12 @@ namespace mongo {
const BSONObj& cmdObj,
std::vector<Privilege>* out) {}
CmdSleep() : Command("sleep") { }
- bool run(OperationContext* txn, const string& ns, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool run(OperationContext* txn,
+ const string& ns,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
log() << "test only command sleep invoked" << endl;
long long millis = 10 * 1000;
@@ -155,7 +165,12 @@ namespace mongo {
virtual void addRequiredPrivileges(const std::string& dbname,
const BSONObj& cmdObj,
std::vector<Privilege>* out) {}
- virtual bool run(OperationContext* txn, const string& dbname , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool) {
+ virtual bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
string coll = cmdObj[ "captrunc" ].valuestrsafe();
uassert( 13416, "captrunc must specify a collection", !coll.empty() );
NamespaceString nss( dbname, coll );
@@ -191,7 +206,6 @@ namespace mongo {
EmptyCapped() : Command( "emptycapped" ) {}
virtual bool slaveOk() const { return false; }
virtual bool isWriteCommandForConfigServer() const { return false; }
- virtual bool logTheOp() { return true; }
// No auth needed because it only works when enabled via command line.
virtual void addRequiredPrivileges(const std::string& dbname,
const BSONObj& cmdObj,
@@ -202,8 +216,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
const std::string ns = parseNsCollectionRequired(dbname, cmdObj);
return appendCommandStatus(result, emptyCapped(txn, NamespaceString(ns)));
diff --git a/src/mongo/db/commands/touch.cpp b/src/mongo/db/commands/touch.cpp
index 2288d54551d..1b71e55ab53 100644
--- a/src/mongo/db/commands/touch.cpp
+++ b/src/mongo/db/commands/touch.cpp
@@ -81,8 +81,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
const std::string ns = parseNsCollectionRequired(dbname, cmdObj);
const NamespaceString nss(ns);
diff --git a/src/mongo/db/commands/user_management_commands.cpp b/src/mongo/db/commands/user_management_commands.cpp
index 366b1760f69..d0813279a0f 100644
--- a/src/mongo/db/commands/user_management_commands.cpp
+++ b/src/mongo/db/commands/user_management_commands.cpp
@@ -359,8 +359,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
auth::CreateOrUpdateUserArgs args;
Status status = auth::parseCreateOrUpdateUserCommands(cmdObj,
"createUser",
@@ -568,8 +567,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
auth::CreateOrUpdateUserArgs args;
Status status = auth::parseCreateOrUpdateUserCommands(cmdObj,
"updateUser",
@@ -712,8 +710,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
AuthzDocumentsUpdateGuard updateGuard(authzManager);
if (!updateGuard.tryLock("Drop user")) {
@@ -799,8 +796,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
AuthzDocumentsUpdateGuard updateGuard(authzManager);
if (!updateGuard.tryLock("Drop all users from database")) {
@@ -882,8 +878,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
AuthzDocumentsUpdateGuard updateGuard(authzManager);
if (!updateGuard.tryLock("Grant roles to user")) {
@@ -980,8 +975,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
AuthzDocumentsUpdateGuard updateGuard(authzManager);
if (!updateGuard.tryLock("Revoke roles from user")) {
@@ -1096,8 +1090,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
auth::UsersInfoArgs args;
Status status = auth::parseUsersInfoCommand(cmdObj, dbname, &args);
@@ -1231,8 +1224,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
auth::CreateOrUpdateRoleArgs args;
Status status = auth::parseCreateOrUpdateRoleCommands(cmdObj,
"createRole",
@@ -1377,8 +1369,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
auth::CreateOrUpdateRoleArgs args;
Status status = auth::parseCreateOrUpdateRoleCommands(cmdObj,
"updateRole",
@@ -1499,8 +1490,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
AuthzDocumentsUpdateGuard updateGuard(authzManager);
if (!updateGuard.tryLock("Grant privileges to role")) {
@@ -1636,8 +1626,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
AuthzDocumentsUpdateGuard updateGuard(authzManager);
if (!updateGuard.tryLock("Revoke privileges from role")) {
@@ -1774,8 +1763,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
std::string roleNameString;
std::vector<RoleName> rolesToAdd;
BSONObj writeConcern;
@@ -1894,8 +1882,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
AuthzDocumentsUpdateGuard updateGuard(authzManager);
if (!updateGuard.tryLock("Revoke roles from role")) {
@@ -2014,8 +2001,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
AuthzDocumentsUpdateGuard updateGuard(authzManager);
if (!updateGuard.tryLock("Drop role")) {
@@ -2185,8 +2171,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
BSONObj writeConcern;
Status status = auth::parseDropAllRolesFromDatabaseCommand(cmdObj,
dbname,
@@ -2343,8 +2328,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
auth::RolesInfoArgs args;
Status status = auth::parseRolesInfoCommand(cmdObj, dbname, &args);
@@ -2424,8 +2408,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
authzManager->invalidateUserCache();
@@ -2469,8 +2452,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
result.append("cacheGeneration", authzManager->getCacheGeneration());
@@ -2911,8 +2893,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
auth::MergeAuthzCollectionsArgs args;
Status status = auth::parseMergeAuthzCollectionsCommand(cmdObj, &args);
diff --git a/src/mongo/db/commands/validate.cpp b/src/mongo/db/commands/validate.cpp
index f8509b394f3..5fc7a871de0 100644
--- a/src/mongo/db/commands/validate.cpp
+++ b/src/mongo/db/commands/validate.cpp
@@ -66,7 +66,12 @@ namespace mongo {
}
//{ validate: "collectionnamewithoutthedbpart" [, scandata: <bool>] [, full: <bool> } */
- bool run(OperationContext* txn, const string& dbname , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl ) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
string ns = dbname + "." + cmdObj.firstElement().valuestrsafe();
NamespaceString ns_string(ns);
diff --git a/src/mongo/db/commands/write_commands/batch_executor.cpp b/src/mongo/db/commands/write_commands/batch_executor.cpp
index 010f44deb04..72bdb1fc144 100644
--- a/src/mongo/db/commands/write_commands/batch_executor.cpp
+++ b/src/mongo/db/commands/write_commands/batch_executor.cpp
@@ -1238,8 +1238,7 @@ namespace mongo {
cmd,
0,
errmsg,
- resultBuilder,
- false /* fromrepl */);
+ resultBuilder);
Command::appendCommandStatus(resultBuilder, success, errmsg);
BSONObj cmdResult = resultBuilder.done();
uassertStatusOK(Command::getStatusFromCommandResult(cmdResult));
diff --git a/src/mongo/db/commands/write_commands/write_commands.cpp b/src/mongo/db/commands/write_commands/write_commands.cpp
index 0fdecdf7786..d6d6d7ff137 100644
--- a/src/mongo/db/commands/write_commands/write_commands.cpp
+++ b/src/mongo/db/commands/write_commands/write_commands.cpp
@@ -118,12 +118,9 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errMsg,
- BSONObjBuilder& result,
- bool fromRepl) {
- invariant(!fromRepl == txn->writesAreReplicated());
-
- // Can't be run on secondaries (logTheOp() == false, slaveOk() == false).
- dassert( !fromRepl );
+ BSONObjBuilder& result) {
+ // Can't be run on secondaries.
+ dassert(txn->writesAreReplicated());
BatchedCommandRequest request( _writeType );
BatchedCommandResponse response;
diff --git a/src/mongo/db/commands/write_commands/write_commands.h b/src/mongo/db/commands/write_commands/write_commands.h
index 1ea34cb77e7..cbb2db6cac6 100644
--- a/src/mongo/db/commands/write_commands/write_commands.h
+++ b/src/mongo/db/commands/write_commands/write_commands.h
@@ -78,8 +78,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl);
+ BSONObjBuilder& result);
// Write commands can be explained.
virtual Status explain(OperationContext* txn,
diff --git a/src/mongo/db/commands/writeback_compatibility_shim.cpp b/src/mongo/db/commands/writeback_compatibility_shim.cpp
index 63bb3ba2718..99feccfad58 100644
--- a/src/mongo/db/commands/writeback_compatibility_shim.cpp
+++ b/src/mongo/db/commands/writeback_compatibility_shim.cpp
@@ -79,7 +79,11 @@ namespace mongo {
}
virtual bool run(OperationContext* opCtx,
- const string&, BSONObj&, int, string&, BSONObjBuilder& result, bool) {
+ const string&,
+ BSONObj&,
+ int,
+ string&,
+ BSONObjBuilder& result) {
string errMsg = stream()
<< "Writeback functionality is no longer present in v3.0 mongod, "
diff --git a/src/mongo/db/dbcommands.cpp b/src/mongo/db/dbcommands.cpp
index 40eb29ed6dc..ecd5d00df21 100644
--- a/src/mongo/db/dbcommands.cpp
+++ b/src/mongo/db/dbcommands.cpp
@@ -51,6 +51,7 @@
#include "mongo/db/catalog/coll_mod.h"
#include "mongo/db/catalog/collection.h"
#include "mongo/db/catalog/collection_catalog_entry.h"
+#include "mongo/db/catalog/create_collection.h"
#include "mongo/db/catalog/drop_collection.h"
#include "mongo/db/catalog/drop_database.h"
#include "mongo/db/catalog/database_catalog_entry.h"
@@ -105,7 +106,6 @@ namespace mongo {
using std::string;
using std::stringstream;
-
class CmdShutdownMongoD : public CmdShutdown {
public:
virtual void help(stringstream& help) const {
@@ -122,10 +122,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
-
- invariant(!fromRepl == txn->writesAreReplicated());
+ BSONObjBuilder& result) {
bool force = cmdObj.hasField("force") && cmdObj["force"].trueValue();
long long timeoutSecs = 0;
@@ -175,8 +172,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
// disallow dropping the config database
if (serverGlobalParams.configsvr && (dbname == "config")) {
return appendCommandStatus(result,
@@ -258,8 +254,12 @@ namespace mongo {
return allKilledIndexes;
}
- bool run(OperationContext* txn, const string& dbname , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
- invariant(!fromRepl == txn->writesAreReplicated());
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
BSONElement e = cmdObj.firstElement();
if ( e.numberInt() != 1 ) {
errmsg = "bad option";
@@ -347,10 +347,7 @@ namespace mongo {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
- invariant(!fromRepl == txn->writesAreReplicated());
-
+ BSONObjBuilder& result) {
// Needs to be locked exclusively, because creates the system.profile collection
// in the local database.
ScopedTransaction transaction(txn, MODE_IX);
@@ -406,7 +403,12 @@ namespace mongo {
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- bool run(OperationContext* txn, const string& dbname , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
const char* deprecationWarning =
"CMD diagLogging is deprecated and will be removed in a future release";
warning() << deprecationWarning << startupWarningsLog;
@@ -455,9 +457,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
- invariant(!fromRepl == txn->writesAreReplicated());
+ BSONObjBuilder& result) {
const std::string nsToDrop = parseNsCollectionRequired(dbname, cmdObj);
if (nsToDrop.find('$') != string::npos) {
@@ -522,57 +522,9 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
- invariant(!fromRepl == txn->writesAreReplicated());
- BSONObjIterator it(cmdObj);
-
- // Extract ns from first cmdObj element.
- BSONElement firstElt = it.next();
- uassert(15888,
- "must pass name of collection to create",
- firstElt.valuestrsafe()[0] != '\0');
-
- Status status = userAllowedWriteNS( dbname, firstElt.valuestr() );
- if ( !status.isOK() ) {
- return appendCommandStatus( result, status );
- }
-
- const std::string ns = dbname + '.' + firstElt.valuestrsafe();
-
- // Build options object from remaining cmdObj elements.
- BSONObjBuilder optionsBuilder;
- while (it.more()) {
- optionsBuilder.append(it.next());
- }
-
- BSONObj options = optionsBuilder.obj();
- uassert(14832,
- "specify size:<n> when capped is true",
- !options["capped"].trueValue() || options["size"].isNumber() ||
- options.hasField("$nExtents"));
-
- MONGO_WRITE_CONFLICT_RETRY_LOOP_BEGIN {
- ScopedTransaction transaction(txn, MODE_IX);
- Lock::DBLock dbXLock(txn->lockState(), dbname, MODE_X);
- OldClientContext ctx(txn, ns);
- if (!fromRepl &&
- !repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(dbname)) {
- return appendCommandStatus(result, Status(ErrorCodes::NotMaster, str::stream()
- << "Not primary while creating collection " << ns));
- }
-
- WriteUnitOfWork wunit(txn);
-
- // Create collection.
- status = userCreateNS(txn, ctx.db(), ns.c_str(), options);
- if ( !status.isOK() ) {
- return appendCommandStatus( result, status );
- }
-
- wunit.commit();
- } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "create", ns);
- return true;
+ BSONObjBuilder& result) {
+ return appendCommandStatus(result,
+ createCollection(txn, dbname, cmdObj));
}
} cmdCreate;
@@ -607,8 +559,12 @@ namespace mongo {
out->push_back(Privilege(parseResourcePattern(dbname, cmdObj), ActionType::find));
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& jsobj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl ) {
- invariant(!fromRepl == txn->writesAreReplicated());
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& jsobj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
const std::string ns = parseNs(dbname, jsobj);
md5digest d;
@@ -761,8 +717,12 @@ namespace mongo {
out->push_back(Privilege(parseResourcePattern(dbname, cmdObj), actions));
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& jsobj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl ) {
- invariant(!fromRepl == txn->writesAreReplicated());
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& jsobj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Timer timer;
string ns = jsobj.firstElement().String();
@@ -886,8 +846,12 @@ namespace mongo {
out->push_back(Privilege(parseResourcePattern(dbname, cmdObj), actions));
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& jsobj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl ) {
- invariant(!fromRepl == txn->writesAreReplicated());
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& jsobj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
int scale = 1;
if ( jsobj["scale"].isNumber() ) {
scale = jsobj["scale"].numberInt();
@@ -998,10 +962,7 @@ namespace mongo {
BSONObj& jsobj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
- invariant(!fromRepl == txn->writesAreReplicated());
-
+ BSONObjBuilder& result) {
const std::string ns = parseNsCollectionRequired(dbname, jsobj);
return appendCommandStatus(result,
collMod(txn, NamespaceString(ns), jsobj, &result));
@@ -1032,8 +993,12 @@ namespace mongo {
out->push_back(Privilege(ResourcePattern::forDatabaseName(dbname), actions));
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& jsobj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl ) {
- invariant(!fromRepl == txn->writesAreReplicated());
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& jsobj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
int scale = 1;
if ( jsobj["scale"].isNumber() ) {
scale = jsobj["scale"].numberInt();
@@ -1104,7 +1069,12 @@ namespace mongo {
virtual void addRequiredPrivileges(const std::string& dbname,
const BSONObj& cmdObj,
std::vector<Privilege>* out) {} // No auth required
- virtual bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool) {
+ virtual bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
result << "you" << txn->getCurOp()->getRemoteString();
return true;
}
@@ -1130,8 +1100,7 @@ namespace mongo {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool) {
+ BSONObjBuilder& result) {
result << "options" << QueryOption_AllSupported;
return true;
}
@@ -1143,11 +1112,10 @@ namespace mongo {
BSONObj& cmdObj,
int queryOptions,
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
try {
- return c->run(txn, dbname, cmdObj, queryOptions, errmsg, result, fromRepl);
+ return c->run(txn, dbname, cmdObj, queryOptions, errmsg, result);
}
catch (const SendStaleConfigException& e) {
LOG(1) << "command failed because of stale config, can retry" << causedBy(e);
@@ -1240,8 +1208,7 @@ namespace mongo {
int queryOptions,
const char *cmdns,
BSONObj& cmdObj,
- BSONObjBuilder& result,
- bool fromRepl ) {
+ BSONObjBuilder& result) {
std::string dbname = nsToDatabase( cmdns );
scoped_ptr<MaintenanceModeSetter> mmSetter;
@@ -1285,7 +1252,10 @@ namespace mongo {
parsedUserNames,
parsedRoleNames);
- Status status = _checkAuthorization(c, txn->getClient(), dbname, cmdObj, fromRepl);
+ Status status = _checkAuthorization(c,
+ txn->getClient(),
+ dbname,
+ cmdObj);
if (!status.isOK()) {
appendCommandStatus(result, status);
return;
@@ -1295,8 +1265,8 @@ namespace mongo {
bool canRunHere =
replCoord->canAcceptWritesForDatabase(dbname) ||
c->slaveOk() ||
- ( c->slaveOverrideOk() && ( queryOptions & QueryOption_SlaveOk ) ) ||
- fromRepl;
+ ( c->slaveOverrideOk() && ( queryOptions & QueryOption_SlaveOk ) ) ||
+ !txn->writesAreReplicated();
if ( ! canRunHere ) {
result.append( "note" , "from execCommand" );
@@ -1329,9 +1299,7 @@ namespace mongo {
}
if (c->shouldAffectCommandCounter()) {
- // If !fromRepl, globalOpCounters need to be incremented. Otherwise, replOpCounters
- // need to be incremented.
- OpCounters* opCounters = fromRepl ? &replOpCounters : &globalOpCounters;
+ OpCounters* opCounters = &globalOpCounters;
opCounters->gotCommand();
}
@@ -1365,7 +1333,7 @@ namespace mongo {
c->_commandsExecuted.increment();
- retval = _execCommand(txn, c, dbname, cmdObj, queryOptions, errmsg, result, fromRepl);
+ retval = _execCommand(txn, c, dbname, cmdObj, queryOptions, errmsg, result);
if ( !retval ){
c->_commandsFailed.increment();
@@ -1396,7 +1364,7 @@ namespace mongo {
BSONObj& _cmdobj,
BufBuilder& b,
BSONObjBuilder& anObjBuilder,
- bool fromRepl, int queryOptions) {
+ int queryOptions) {
string dbname = nsToDatabase( ns );
const char *p = strchr(ns, '.');
@@ -1439,7 +1407,12 @@ namespace mongo {
if ( c ) {
LOG(2) << "run command " << ns << ' ' << c->getRedactedCopyForLogging(_cmdobj);
- Command::execCommand(txn, c, queryOptions, ns, jsobj, anObjBuilder, fromRepl);
+ Command::execCommand(txn,
+ c,
+ queryOptions,
+ ns,
+ jsobj,
+ anObjBuilder);
}
else {
// In the absence of a Command object, no redaction is possible. Therefore
@@ -1466,10 +1439,9 @@ namespace mongo {
CurOp& curop,
BufBuilder& b,
BSONObjBuilder& anObjBuilder,
- bool fromRepl,
int queryOptions) {
try {
- return _runCommands(txn, ns, jsobj, b, anObjBuilder, fromRepl, queryOptions);
+ return _runCommands(txn, ns, jsobj, b, anObjBuilder, queryOptions);
}
catch (const SendStaleConfigException&){
throw;
diff --git a/src/mongo/db/dbcommands_generic.cpp b/src/mongo/db/dbcommands_generic.cpp
index 396ccbca7eb..fa640d0fa47 100644
--- a/src/mongo/db/dbcommands_generic.cpp
+++ b/src/mongo/db/dbcommands_generic.cpp
@@ -70,7 +70,6 @@ namespace mongo {
using std::stringstream;
using std::vector;
-
class CmdBuildInfo : public Command {
public:
CmdBuildInfo() : Command( "buildInfo", true, "buildinfo" ) {}
@@ -89,8 +88,7 @@ namespace mongo {
BSONObj& jsobj,
int, // options
std::string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
appendBuildInfo(result);
return true;
@@ -108,7 +106,12 @@ namespace mongo {
virtual void addRequiredPrivileges(const std::string& dbname,
const BSONObj& cmdObj,
std::vector<Privilege>* out) {} // No auth required
- virtual bool run(OperationContext* txn, const string& badns, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool) {
+ virtual bool run(OperationContext* txn,
+ const string& badns,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
// IMPORTANT: Don't put anything in here that might lock db - including authentication
return true;
}
@@ -123,7 +126,12 @@ namespace mongo {
virtual void addRequiredPrivileges(const std::string& dbname,
const BSONObj& cmdObj,
std::vector<Privilege>* out) {} // No auth required
- virtual bool run(OperationContext* txn, const string& ns, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string& ns,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
if ( globalScriptEngine ) {
BSONObjBuilder bb( result.subobjStart( "js" ) );
result.append( "utf8" , globalScriptEngine->utf8Ok() );
@@ -158,7 +166,12 @@ namespace mongo {
actions.addAction(ActionType::hostInfo);
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
ProcessInfo p;
BSONObjBuilder bSys, bOs;
@@ -195,7 +208,12 @@ namespace mongo {
actions.addAction(ActionType::logRotate);
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- virtual bool run(OperationContext* txn, const string& ns, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string& ns,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
bool didRotate = rotateLogs(serverGlobalParams.logRenameOnRotate);
if (didRotate)
logProcessDetailsForLogRotate();
@@ -214,7 +232,12 @@ namespace mongo {
virtual void addRequiredPrivileges(const std::string& dbname,
const BSONObj& cmdObj,
std::vector<Privilege>* out) {} // No auth required
- virtual bool run(OperationContext* txn, const string& ns, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string& ns,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
BSONObjBuilder b( result.subobjStart( "commands" ) );
for ( CommandMap::const_iterator i=_commands->begin(); i!=_commands->end(); ++i ) {
Command * c = i->second;
@@ -305,7 +328,12 @@ namespace mongo {
const BSONObj& cmdObj,
std::vector<Privilege>* out) {} // No auth required
CmdForceError() : Command("forceerror") {}
- bool run(OperationContext* txn, const string& dbnamne, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool run(OperationContext* txn,
+ const string& dbnamne,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
setLastError(10038, "forced error");
return false;
}
@@ -329,7 +357,12 @@ namespace mongo {
help << "{ getLog : '*' } OR { getLog : 'global' }";
}
- virtual bool run(OperationContext* txn, const string& dbname , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool) {
+ virtual bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
BSONElement val = cmdObj.firstElement();
if (val.type() != String) {
return appendCommandStatus(result, Status(ErrorCodes::TypeMismatch, str::stream()
@@ -383,7 +416,12 @@ namespace mongo {
actions.addAction(ActionType::getCmdLineOpts);
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- virtual bool run(OperationContext* txn, const string&, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
result.append("argv", serverGlobalParams.argvArray);
result.append("parsed", serverGlobalParams.parsedOpts);
return true;
diff --git a/src/mongo/db/dbdirectclient.cpp b/src/mongo/db/dbdirectclient.cpp
index b20fdf07092..41b75377060 100644
--- a/src/mongo/db/dbdirectclient.cpp
+++ b/src/mongo/db/dbdirectclient.cpp
@@ -187,8 +187,7 @@ namespace mongo {
std::string errmsg;
BSONObjBuilder result;
- bool fromRepl = false;
- bool runRetval = countCmd->run(_txn, dbname, cmdObj, options, errmsg, result, fromRepl);
+ bool runRetval = countCmd->run(_txn, dbname, cmdObj, options, errmsg, result);
if (!runRetval) {
Command::appendCommandStatus(result, runRetval, errmsg);
Status commandStatus = Command::getStatusFromCommandResult(result.obj());
diff --git a/src/mongo/db/dbeval.cpp b/src/mongo/db/dbeval.cpp
index b0852a004b3..2bc695030c5 100644
--- a/src/mongo/db/dbeval.cpp
+++ b/src/mongo/db/dbeval.cpp
@@ -175,8 +175,7 @@ namespace {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
if (cmdObj["nolock"].trueValue()) {
return dbEval(txn, dbname, cmdObj, result, errmsg);
diff --git a/src/mongo/db/dbwebserver.cpp b/src/mongo/db/dbwebserver.cpp
index d7066322b02..ef14455bcfa 100644
--- a/src/mongo/db/dbwebserver.cpp
+++ b/src/mongo/db/dbwebserver.cpp
@@ -166,7 +166,7 @@ namespace {
string errmsg;
BSONObjBuilder sub;
- if (!c->run(txn, "admin.$cmd", co, 0, errmsg, sub, false))
+ if (!c->run(txn, "admin.$cmd", co, 0, errmsg, sub))
buf.append(cmd, errmsg);
else
buf.append(cmd, sub.obj());
@@ -253,7 +253,7 @@ namespace {
BSONObj cmdObj = BSON(cmd << 1);
BSONObjBuilder result;
- Command::execCommand(txn, c, 0, "admin.", cmdObj, result, false);
+ Command::execCommand(txn, c, 0, "admin.", cmdObj, result);
responseCode = 200;
diff --git a/src/mongo/db/driverHelpers.cpp b/src/mongo/db/driverHelpers.cpp
index f3a5cdd05e7..77f04ee2860 100644
--- a/src/mongo/db/driverHelpers.cpp
+++ b/src/mongo/db/driverHelpers.cpp
@@ -67,7 +67,12 @@ namespace mongo {
virtual void addRequiredPrivileges(const std::string& dbname,
const BSONObj& cmdObj,
std::vector<Privilege>* out) {} // No auth required
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string& ,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
if ( cmdObj.firstElement().type() != jstOID ) {
errmsg = "not oid";
return false;
diff --git a/src/mongo/db/exec/stagedebug_cmd.cpp b/src/mongo/db/exec/stagedebug_cmd.cpp
index 0e2bf932edb..9db17d3d920 100644
--- a/src/mongo/db/exec/stagedebug_cmd.cpp
+++ b/src/mongo/db/exec/stagedebug_cmd.cpp
@@ -110,8 +110,12 @@ namespace mongo {
// check needed.
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result,
- bool fromRepl) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
BSONElement argElt = cmdObj["stageDebug"];
if (argElt.eoo() || !argElt.isABSONObj()) { return false; }
BSONObj argObj = argElt.Obj();
diff --git a/src/mongo/db/exec/update.cpp b/src/mongo/db/exec/update.cpp
index 0430202a241..2b37efb746c 100644
--- a/src/mongo/db/exec/update.cpp
+++ b/src/mongo/db/exec/update.cpp
@@ -247,7 +247,6 @@ namespace mongo {
<< " updatedFields: " << updatedFields
<< " immutableAndSingleValueFields.size:"
<< (immutableAndSingleValueFields ? immutableAndSingleValueFields->size() : 0)
- << " fromRepl: " << opts.fromReplication
<< " validate:" << opts.enforceOkForStorage;
// 1.) Loop through each updated field and validate for storage
diff --git a/src/mongo/db/geo/haystack.cpp b/src/mongo/db/geo/haystack.cpp
index 0998e610803..531595d8719 100644
--- a/src/mongo/db/geo/haystack.cpp
+++ b/src/mongo/db/geo/haystack.cpp
@@ -73,8 +73,12 @@ namespace mongo {
out->push_back(Privilege(parseResourcePattern(dbname, cmdObj), actions));
}
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int,
- string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
const std::string ns = parseNsCollectionRequired(dbname, cmdObj);
AutoGetCollectionForRead ctx(txn, ns);
diff --git a/src/mongo/db/instance.cpp b/src/mongo/db/instance.cpp
index a1ddfc65817..4085ffbed55 100644
--- a/src/mongo/db/instance.cpp
+++ b/src/mongo/db/instance.cpp
@@ -241,7 +241,12 @@ namespace {
bb.skip(sizeof(QueryResult::Value));
BSONObjBuilder cmdResBuf;
- if (!runCommands(txn, queryMessage.ns, queryMessage.query, *op, bb, cmdResBuf, false,
+ if (!runCommands(txn,
+ queryMessage.ns,
+ queryMessage.query,
+ *op,
+ bb,
+ cmdResBuf,
queryMessage.queryOptions)) {
uasserted(13530, "bad or malformed command request?");
}
@@ -1068,8 +1073,7 @@ namespace {
0, /* what should I use for query option? */
d.getns(),
cmdObj,
- resultBuilder,
- false /* fromRepl */);
+ resultBuilder);
uassertStatusOK(Command::getStatusFromCommandResult(resultBuilder.done()));
}
catch (const DBException& ex) {
diff --git a/src/mongo/db/repl/master_slave.cpp b/src/mongo/db/repl/master_slave.cpp
index 10f7eef2088..10497525c89 100644
--- a/src/mongo/db/repl/master_slave.cpp
+++ b/src/mongo/db/repl/master_slave.cpp
@@ -374,8 +374,7 @@ namespace repl {
BSONObj& cmdObj,
int options,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
HandshakeArgs handshake;
Status status = handshake.initialize(cmdObj);
@@ -477,7 +476,6 @@ namespace repl {
int errCode = 0;
CloneOptions cloneOptions;
cloneOptions.fromDB = db;
- cloneOptions.logForRepl = false;
cloneOptions.slaveOk = true;
cloneOptions.useReplAuth = true;
cloneOptions.snapshot = true;
diff --git a/src/mongo/db/repl/oplog.cpp b/src/mongo/db/repl/oplog.cpp
index b4bfd2376d1..08738f70da6 100644
--- a/src/mongo/db/repl/oplog.cpp
+++ b/src/mongo/db/repl/oplog.cpp
@@ -43,8 +43,16 @@
#include "mongo/db/auth/authorization_manager_global.h"
#include "mongo/db/auth/privilege.h"
#include "mongo/db/background.h"
+#include "mongo/db/catalog/apply_ops.h"
+#include "mongo/db/catalog/capped_utils.h"
+#include "mongo/db/catalog/create_collection.h"
+#include "mongo/db/catalog/coll_mod.h"
#include "mongo/db/catalog/collection.h"
#include "mongo/db/catalog/collection_catalog_entry.h"
+#include "mongo/db/catalog/drop_collection.h"
+#include "mongo/db/catalog/drop_database.h"
+#include "mongo/db/catalog/drop_indexes.h"
+#include "mongo/db/catalog/rename_collection.h"
#include "mongo/db/commands.h"
#include "mongo/db/commands/dbhash.h"
#include "mongo/db/concurrency/write_conflict_exception.h"
@@ -440,17 +448,107 @@ namespace {
// -------------------------------------
- // @param fromRepl false if from ApplyOpsCmd
+namespace {
+ NamespaceString parseNs(const string& dbname, const BSONObj& cmdObj) {
+ BSONElement first = cmdObj.firstElement();
+ uassert(28631,
+ "no collection name specified",
+ first.canonicalType() == canonicalizeBSONType(mongo::String)
+ && first.valuestrsize() > 0);
+ std::string coll = first.valuestr();
+ return NamespaceString(NamespaceString(dbname).db().toString(), coll);
+ }
+
+ using opApplyFn = stdx::function<Status (OperationContext*, const char*, BSONObj&)>;
+
+ std::map<std::string, opApplyFn> opsMap = {
+ {"create",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ return createCollection(txn, NamespaceString(dbName).db().toString(), cmd);
+ }
+ },
+ {"collMod",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ BSONObjBuilder resultWeDontCareAbout;
+ return collMod(txn, parseNs(dbName, cmd), cmd, &resultWeDontCareAbout);
+ }
+ },
+ {"dropDatabase",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ return dropDatabase(txn, NamespaceString(dbName).db().toString());
+ }
+ },
+ {"drop",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ BSONObjBuilder resultWeDontCareAbout;
+ return dropCollection(txn, parseNs(dbName, cmd), resultWeDontCareAbout);
+ }
+ },
+ // deleteIndex(es) is deprecated but still works as of April 10, 2015
+ {"deleteIndex",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ BSONObjBuilder resultWeDontCareAbout;
+ return dropIndexes(txn, parseNs(dbName, cmd), cmd, &resultWeDontCareAbout);
+ }
+ },
+ {"deleteIndexes",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ BSONObjBuilder resultWeDontCareAbout;
+ return dropIndexes(txn, parseNs(dbName, cmd), cmd, &resultWeDontCareAbout);
+ }
+ },
+ {"dropIndex",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ BSONObjBuilder resultWeDontCareAbout;
+ return dropIndexes(txn, parseNs(dbName, cmd), cmd, &resultWeDontCareAbout);
+ }
+ },
+ {"dropIndexes",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ BSONObjBuilder resultWeDontCareAbout;
+ return dropIndexes(txn, parseNs(dbName, cmd), cmd, &resultWeDontCareAbout);
+ }
+ },
+ {"renameCollection",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ return renameCollection(txn,
+ NamespaceString(cmd.firstElement().valuestrsafe()),
+ NamespaceString(cmd["to"].valuestrsafe()),
+ cmd["stayTemp"].trueValue(),
+ cmd["dropTarget"].trueValue());
+ }
+ },
+ {"applyOps",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ BSONObjBuilder resultWeDontCareAbout;
+ return applyOps(txn, dbName, cmd, &resultWeDontCareAbout);
+ }
+ },
+ {"convertToCapped",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ return convertToCapped(txn,
+ parseNs(dbName, cmd),
+ cmd["size"].number());
+ }
+ },
+ {"emptycapped",
+ [](OperationContext* txn, const char* dbName, BSONObj& cmd) -> Status {
+ return emptyCapped(txn, parseNs(dbName, cmd));
+ }
+ },
+ };
+
+} // namespace
+
// @return failure status if an update should have happened and the document DNE.
// See replset initial sync code.
Status applyOperation_inlock(OperationContext* txn,
Database* db,
const BSONObj& op,
- bool fromRepl,
bool convertUpdateToUpsert) {
LOG(3) << "applying op: " << op << endl;
- OpCounters * opCounters = fromRepl ? &replOpCounters : &globalOpCounters;
+ OpCounters * opCounters = txn->writesAreReplicated() ? &globalOpCounters : &replOpCounters;
const char *names[] = { "o", "ns", "op", "b", "o2" };
BSONElement fields[5];
@@ -618,18 +716,14 @@ namespace {
verify( opType[1] == 'b' ); // "db" advertisement
}
else if ( *opType == 'c' ) {
+ // Applying commands in repl is done under Global W-lock, so it is safe to not
+ // perform the current DB checks after reacquiring the lock.
+ invariant(txn->lockState()->isW());
+
bool done = false;
- while (!done) {
- BufBuilder bb;
- BSONObjBuilder runCommandResult;
- // Applying commands in repl is done under Global W-lock, so it is safe to not
- // perform the current DB checks after reacquiring the lock.
- invariant(txn->lockState()->isW());
-
- _runCommands(txn, ns, o, bb, runCommandResult, true, 0);
- // _runCommands takes care of adjusting opcounters for command counting.
- Status status = Command::getStatusFromCommandResult(runCommandResult.done());
+ while (!done) {
+ Status status = opsMap.find(o.firstElementFieldName())->second(txn, ns, o);
switch (status.code()) {
case ErrorCodes::WriteConflict: {
// Need to throw this up to a higher level where it will be caught and the
diff --git a/src/mongo/db/repl/oplog.h b/src/mongo/db/repl/oplog.h
index f587ae074df..5d1477ff287 100644
--- a/src/mongo/db/repl/oplog.h
+++ b/src/mongo/db/repl/oplog.h
@@ -93,14 +93,12 @@ namespace repl {
/**
* take an op and apply locally
* used for applying from an oplog
- * @param fromRepl really from replication or for testing/internal/command/etc...
* @param convertUpdateToUpsert convert some updates to upserts for idempotency reasons
* Returns failure status if the op was an update that could not be applied.
*/
Status applyOperation_inlock(OperationContext* txn,
Database* db,
const BSONObj& op,
- bool fromRepl = true,
bool convertUpdateToUpsert = false);
/**
diff --git a/src/mongo/db/repl/replication_info.cpp b/src/mongo/db/repl/replication_info.cpp
index dfba98f56aa..f4cd02426a2 100644
--- a/src/mongo/db/repl/replication_info.cpp
+++ b/src/mongo/db/repl/replication_info.cpp
@@ -206,7 +206,12 @@ namespace repl {
const BSONObj& cmdObj,
std::vector<Privilege>* out) {} // No auth required
CmdIsMaster() : Command("isMaster", true, "ismaster") { }
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool /*fromRepl*/) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
/* currently request to arbiter is (somewhat arbitrarily) an ismaster request that is not
authenticated.
*/
diff --git a/src/mongo/db/repl/replset_commands.cpp b/src/mongo/db/repl/replset_commands.cpp
index 6530c491902..9e187001513 100644
--- a/src/mongo/db/repl/replset_commands.cpp
+++ b/src/mongo/db/repl/replset_commands.cpp
@@ -94,7 +94,12 @@ namespace repl {
return Status::OK();
}
CmdReplSetTest() : ReplSetCommand("replSetTest") { }
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
log() << "replSetTest command received: " << cmdObj.toString();
if( cmdObj.hasElement("forceInitialSyncFailure") ) {
@@ -124,7 +129,12 @@ namespace repl {
class CmdReplSetGetRBID : public ReplSetCommand {
public:
CmdReplSetGetRBID() : ReplSetCommand("replSetGetRBID") {}
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Status status = getGlobalReplicationCoordinator()->checkReplEnabledForCommand(&result);
if (!status.isOK())
return appendCommandStatus(result, status);
@@ -153,7 +163,12 @@ namespace repl {
return Status::OK();
}
CmdReplSetGetStatus() : ReplSetCommand("replSetGetStatus", true) { }
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
if ( cmdObj["forShell"].trueValue() )
lastError.disableForCommand();
@@ -185,8 +200,12 @@ namespace repl {
return Status::OK();
}
CmdReplSetGetConfig() : ReplSetCommand("replSetGetConfig", true) { }
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj,
- int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Status status = getGlobalReplicationCoordinator()->checkReplEnabledForCommand(&result);
if (!status.isOK())
return appendCommandStatus(result, status);
@@ -295,9 +314,9 @@ namespace {
virtual bool run(OperationContext* txn,
const string& ,
BSONObj& cmdObj,
- int, string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
BSONObj configObj;
if( cmdObj["replSetInitiate"].type() == Object ) {
@@ -378,7 +397,12 @@ namespace {
return Status::OK();
}
CmdReplSetReconfig() : ReplSetCommand("replSetReconfig") { }
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Status status = getGlobalReplicationCoordinator()->checkReplEnabledForCommand(&result);
if (!status.isOK()) {
return appendCommandStatus(result, status);
@@ -434,7 +458,12 @@ namespace {
return Status::OK();
}
CmdReplSetFreeze() : ReplSetCommand("replSetFreeze") { }
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Status status = getGlobalReplicationCoordinator()->checkReplEnabledForCommand(&result);
if (!status.isOK())
return appendCommandStatus(result, status);
@@ -466,7 +495,12 @@ namespace {
return Status::OK();
}
CmdReplSetStepDown() : ReplSetCommand("replSetStepDown") { }
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Status status = getGlobalReplicationCoordinator()->checkReplEnabledForCommand(&result);
if (!status.isOK())
return appendCommandStatus(result, status);
@@ -541,7 +575,12 @@ namespace {
return Status::OK();
}
CmdReplSetMaintenance() : ReplSetCommand("replSetMaintenance") { }
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Status status = getGlobalReplicationCoordinator()->checkReplEnabledForCommand(&result);
if (!status.isOK())
return appendCommandStatus(result, status);
@@ -571,12 +610,12 @@ namespace {
return Status::OK();
}
CmdReplSetSyncFrom() : ReplSetCommand("replSetSyncFrom") { }
- virtual bool run(OperationContext* txn, const string&,
+ virtual bool run(OperationContext* txn,
+ const string&,
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
Status status = getGlobalReplicationCoordinator()->checkReplEnabledForCommand(&result);
if (!status.isOK())
return appendCommandStatus(result, status);
@@ -596,8 +635,12 @@ namespace {
class CmdReplSetUpdatePosition: public ReplSetCommand {
public:
CmdReplSetUpdatePosition() : ReplSetCommand("replSetUpdatePosition") { }
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg,
- BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
Status status = getGlobalReplicationCoordinator()->checkReplEnabledForCommand(&result);
if (!status.isOK())
return appendCommandStatus(result, status);
@@ -659,7 +702,12 @@ namespace {
class CmdReplSetHeartbeat : public ReplSetCommand {
public:
CmdReplSetHeartbeat() : ReplSetCommand("replSetHeartbeat") { }
- virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
MONGO_FAIL_POINT_BLOCK(rsDelayHeartbeatResponse, delay) {
const BSONObj& data = delay.getData();
@@ -713,8 +761,7 @@ namespace {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
Status status = getGlobalReplicationCoordinator()->checkReplEnabledForCommand(&result);
if (!status.isOK())
return appendCommandStatus(result, status);
@@ -745,8 +792,7 @@ namespace {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
DEV log() << "received elect msg " << cmdObj.toString();
else LOG(2) << "received elect msg " << cmdObj.toString();
diff --git a/src/mongo/db/repl/resync.cpp b/src/mongo/db/repl/resync.cpp
index 16e385c9b48..0daa1ef3197 100644
--- a/src/mongo/db/repl/resync.cpp
+++ b/src/mongo/db/repl/resync.cpp
@@ -68,8 +68,7 @@ namespace repl {
BSONObj& cmdObj,
int,
string& errmsg,
- BSONObjBuilder& result,
- bool fromRepl) {
+ BSONObjBuilder& result) {
ScopedTransaction transaction(txn, MODE_X);
Lock::GlobalWrite globalWriteLock(txn->lockState());
diff --git a/src/mongo/db/repl/rs_initialsync.cpp b/src/mongo/db/repl/rs_initialsync.cpp
index 69cef872dee..d85bef6b746 100644
--- a/src/mongo/db/repl/rs_initialsync.cpp
+++ b/src/mongo/db/repl/rs_initialsync.cpp
@@ -169,7 +169,6 @@ namespace {
int errCode;
CloneOptions options;
options.fromDB = db;
- options.logForRepl = false;
options.slaveOk = true;
options.useReplAuth = true;
options.snapshot = false;
diff --git a/src/mongo/db/repl/rs_rollback.cpp b/src/mongo/db/repl/rs_rollback.cpp
index 82b1da7a5d5..ed92efd5785 100644
--- a/src/mongo/db/repl/rs_rollback.cpp
+++ b/src/mongo/db/repl/rs_rollback.cpp
@@ -378,7 +378,7 @@ namespace {
uassert(15908, errmsg,
tmpConn->connect(HostAndPort(host), errmsg) && replAuthenticate(tmpConn));
- return cloner.copyCollection(txn, ns, BSONObj(), errmsg, true, false, true, false);
+ return cloner.copyCollection(txn, ns, BSONObj(), errmsg, true, false, true);
}
void syncFixUp(OperationContext* txn,
diff --git a/src/mongo/db/repl/sync_tail.cpp b/src/mongo/db/repl/sync_tail.cpp
index fe173e5430d..5a997a32a09 100644
--- a/src/mongo/db/repl/sync_tail.cpp
+++ b/src/mongo/db/repl/sync_tail.cpp
@@ -199,8 +199,10 @@ namespace repl {
// For non-initial-sync, we convert updates to upserts
// to suppress errors when replaying oplog entries.
+ txn->setReplicatedWrites(false);
+
Status status =
- applyOperation_inlock(txn, ctx.db(), op, true, convertUpdateToUpsert);
+ applyOperation_inlock(txn, ctx.db(), op, convertUpdateToUpsert);
opsAppliedStats.increment();
return status.isOK();
}
diff --git a/src/mongo/db/stats/top.cpp b/src/mongo/db/stats/top.cpp
index 24cd4ef8e65..01bc0ab3da8 100644
--- a/src/mongo/db/stats/top.cpp
+++ b/src/mongo/db/stats/top.cpp
@@ -194,7 +194,12 @@ namespace mongo {
actions.addAction(ActionType::top);
out->push_back(Privilege(ResourcePattern::forClusterResource(), actions));
}
- virtual bool run(OperationContext* txn, const string&, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
+ virtual bool run(OperationContext* txn,
+ const string&,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
{
BSONObjBuilder b( result.subobjStart( "totals" ) );
b.append( "note", "all times in microseconds" );
diff --git a/src/mongo/db/storage/mmap_v1/journal_latency_test_cmd.cpp b/src/mongo/db/storage/mmap_v1/journal_latency_test_cmd.cpp
index 6f82110b5d3..bbabd11c179 100644
--- a/src/mongo/db/storage/mmap_v1/journal_latency_test_cmd.cpp
+++ b/src/mongo/db/storage/mmap_v1/journal_latency_test_cmd.cpp
@@ -76,7 +76,12 @@ namespace mongo {
virtual void addRequiredPrivileges(const std::string& dbname,
const BSONObj& cmdObj,
std::vector<Privilege>* out) {}
- bool run(OperationContext* txn, const string& dbname, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl ) {
+ bool run(OperationContext* txn,
+ const string& dbname,
+ BSONObj& cmdObj,
+ int,
+ string& errmsg,
+ BSONObjBuilder& result) {
boost::filesystem::path p = dur::getJournalDir();
p /= "journalLatencyTest";