summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMisha Tyulenev <misha@mongodb.com>2015-12-14 19:19:03 -0500
committerMisha Tyulenev <misha@mongodb.com>2015-12-14 19:29:59 -0500
commit126cecc6366342ffe9d4561ba6ff7532f596c019 (patch)
treeba7ec82a80d7f1365944ae2bc2ca33bbea0b59f4
parent5770fdcdf73d9576d6e8728ac0bbf12b7fafbbd4 (diff)
downloadmongo-126cecc6366342ffe9d4561ba6ff7532f596c019.tar.gz
SERVER-21706 error when mapReduce outputs to config or admin db
(cherry picked from commit 3e1a3872c996fcc72c8cf20ea38e9fe86a11caa4)
-rw-r--r--jstests/sharding/map_reduce_validation.js16
-rw-r--r--src/mongo/db/commands/mr.cpp8
2 files changed, 24 insertions, 0 deletions
diff --git a/jstests/sharding/map_reduce_validation.js b/jstests/sharding/map_reduce_validation.js
index f85c47f3831..9fe08edd91a 100644
--- a/jstests/sharding/map_reduce_validation.js
+++ b/jstests/sharding/map_reduce_validation.js
@@ -10,4 +10,20 @@ assert.commandFailed(testDB.runCommand({ mapReduce: 'user',
reduce: reduceFunc,
out: { inline: 1, sharded: true }}));
+testDB.bar.insert({i: 1});
+assert.commandFailed(testDB.runCommand({ mapReduce: 'bar',
+ map: function() {emit(this.i, this.i*3);},
+ reduce: function(key, values) {return Array.sum(values)},
+ out: { replace: "foo", db: "admin" }}));
+
+assert.commandFailed(testDB.runCommand({ mapReduce: 'bar',
+ map: function() {emit(this.i, this.i*3);},
+ reduce: function(key, values) {return Array.sum(values)},
+ out: { replace: "foo", db: "config" }}));
+
+assert.commandWorked(testDB.runCommand({ mapReduce: 'bar',
+ map: function() {emit(this.i, this.i*3);},
+ reduce: function(key, values) {return Array.sum(values)},
+ out: { replace: "foo", db: "test" }}));
+
st.stop();
diff --git a/src/mongo/db/commands/mr.cpp b/src/mongo/db/commands/mr.cpp
index 2d050c924f1..d0066e7e066 100644
--- a/src/mongo/db/commands/mr.cpp
+++ b/src/mongo/db/commands/mr.cpp
@@ -1566,6 +1566,14 @@ public:
int,
string& errmsg,
BSONObjBuilder& result) {
+ if (!grid.shardRegistry()) {
+ return appendCommandStatus(
+ result,
+ Status(ErrorCodes::CommandNotSupported,
+ str::stream() << "Can not execute mapReduce with output database "
+ << dbname));
+ }
+
boost::optional<DisableDocumentValidation> maybeDisableValidation;
if (shouldBypassDocumentValidationForCommand(cmdObj))
maybeDisableValidation.emplace(txn);