diff options
author | Esha Maharishi <esha.maharishi@mongodb.com> | 2016-08-31 14:34:39 -0400 |
---|---|---|
committer | Esha Maharishi <esha.maharishi@mongodb.com> | 2016-09-07 23:03:50 -0400 |
commit | 2d3d3d3a92e2b1549a638a6f06d8c408625a2287 (patch) | |
tree | b2aceb7900bc06add1956aaea6d493db7eb4e211 | |
parent | 410fefd45f65e7899d60ed420a81d6127d687fa8 (diff) | |
download | mongo-2d3d3d3a92e2b1549a638a6f06d8c408625a2287.tar.gz |
SERVER-25910 fail setShardVersion on mongod if not running with --shardsvr
-rw-r--r-- | buildscripts/resmokeconfig/suites/read_only_sharded.yml | 4 | ||||
-rw-r--r-- | jstests/sharding/addshard1.js | 4 | ||||
-rw-r--r-- | jstests/sharding/addshard5.js | 2 | ||||
-rw-r--r-- | jstests/sharding/localhostAuthBypass.js | 3 | ||||
-rw-r--r-- | jstests/sharding/sharding_rs2.js | 2 | ||||
-rw-r--r-- | jstests/sharding/ssv_config_check.js | 28 | ||||
-rw-r--r-- | jstests/sharding/use_rsm_data_for_cs.js | 2 | ||||
-rw-r--r-- | src/mongo/base/error_codes.err | 1 | ||||
-rw-r--r-- | src/mongo/db/commands/dbcommands.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/s/set_shard_version_command.cpp | 6 | ||||
-rw-r--r-- | src/mongo/s/client/version_manager.cpp | 4 |
11 files changed, 24 insertions, 36 deletions
diff --git a/buildscripts/resmokeconfig/suites/read_only_sharded.yml b/buildscripts/resmokeconfig/suites/read_only_sharded.yml index 2d2292e5913..88e709f1237 100644 --- a/buildscripts/resmokeconfig/suites/read_only_sharded.yml +++ b/buildscripts/resmokeconfig/suites/read_only_sharded.yml @@ -4,8 +4,12 @@ selector: - jstests/readonly/*.js exclude_files: # TODO: re-enable in SERVER-25549 + - jstests/readonly/aggregate.js + - jstests/readonly/count.js + - jstests/readonly/distinct.js - jstests/readonly/find.js - jstests/readonly/get_more.js + - jstests/readonly/temp_collection.js executor: js_test: diff --git a/jstests/sharding/addshard1.js b/jstests/sharding/addshard1.js index e8cdf84e9ef..0c9a5236541 100644 --- a/jstests/sharding/addshard1.js +++ b/jstests/sharding/addshard1.js @@ -5,7 +5,7 @@ // Create a shard and add a database; if the database is not duplicated the mongod should accept // it as shard - var conn1 = MongoRunner.runMongod({}); + var conn1 = MongoRunner.runMongod({'shardsvr': ""}); var db1 = conn1.getDB("testDB"); var numObjs = 3; @@ -26,7 +26,7 @@ assert.eq(1024, newShardDoc.maxSize); // a mongod with an existing database name should not be allowed to become a shard - var conn2 = MongoRunner.runMongod({}); + var conn2 = MongoRunner.runMongod({'shardsvr': ""}); var db2 = conn2.getDB("otherDB"); assert.writeOK(db2.foo.save({a: 1})); diff --git a/jstests/sharding/addshard5.js b/jstests/sharding/addshard5.js index 259e1041aba..cedbe721177 100644 --- a/jstests/sharding/addshard5.js +++ b/jstests/sharding/addshard5.js @@ -36,7 +36,7 @@ assert.commandWorked(mongos.adminCommand({removeShard: shards[1]._id})); assert.commandWorked(mongos.adminCommand({removeShard: shards[1]._id})); - var shard2 = MongoRunner.runMongod({}); + var shard2 = MongoRunner.runMongod({'shardsvr': ''}); assert.commandWorked(mongos.adminCommand({addShard: shard2.host, name: shards[1]._id})); jsTest.log('Shard was dropped and re-added with same name...'); diff --git a/jstests/sharding/localhostAuthBypass.js b/jstests/sharding/localhostAuthBypass.js index 26e2c677dbf..cd152410e3c 100644 --- a/jstests/sharding/localhostAuthBypass.js +++ b/jstests/sharding/localhostAuthBypass.js @@ -27,7 +27,8 @@ }; var addShard = function(st, shouldPass) { - var m = MongoRunner.runMongod({auth: "", keyFile: keyfile, useHostname: false}); + var m = + MongoRunner.runMongod({auth: "", keyFile: keyfile, useHostname: false, 'shardsvr': ''}); var res = st.getDB("admin").runCommand({addShard: m.host}); if (shouldPass) { assert.commandWorked(res, "Add shard"); diff --git a/jstests/sharding/sharding_rs2.js b/jstests/sharding/sharding_rs2.js index 58129d9fe46..7da1a239012 100644 --- a/jstests/sharding/sharding_rs2.js +++ b/jstests/sharding/sharding_rs2.js @@ -56,7 +56,7 @@ assert.eq(2, countNodes(), "A1"); var rs = s.rs0; - rs.add(); + rs.add({'shardsvr': ""}); try { rs.reInitiate(); } catch (e) { diff --git a/jstests/sharding/ssv_config_check.js b/jstests/sharding/ssv_config_check.js index edeb559d40d..b909f98f1f6 100644 --- a/jstests/sharding/ssv_config_check.js +++ b/jstests/sharding/ssv_config_check.js @@ -40,33 +40,5 @@ shardHost: shardDoc.host })); - var configAdmin = st.c0.getDB('admin'); - // Initialize internal config string. - assert.commandWorked(configAdmin.runCommand({ - setShardVersion: '', - init: true, - authoritative: true, - configdb: configStr, - shard: 'config' - })); - - // Passing configdb that does not match initialized value is not ok. - assert.commandFailed(configAdmin.runCommand({ - setShardVersion: '', - init: true, - authoritative: true, - configdb: 'bad-rs/local:12,local:34', - shard: 'config' - })); - - // Passing configdb that matches initialized value is ok. - assert.commandWorked(configAdmin.runCommand({ - setShardVersion: '', - init: true, - authoritative: true, - configdb: alternateConfigStr, - shard: 'config' - })); - st.stop(); })(); diff --git a/jstests/sharding/use_rsm_data_for_cs.js b/jstests/sharding/use_rsm_data_for_cs.js index db05f7b5f2d..0b10a0542cd 100644 --- a/jstests/sharding/use_rsm_data_for_cs.js +++ b/jstests/sharding/use_rsm_data_for_cs.js @@ -19,7 +19,7 @@ }); // add a node to shard rs - rs.add(); + rs.add({'shardsvr': ''}); rs.reInitiate(); rs.awaitSecondaryNodes(); diff --git a/src/mongo/base/error_codes.err b/src/mongo/base/error_codes.err index 0cac2a6528f..8f442c018a4 100644 --- a/src/mongo/base/error_codes.err +++ b/src/mongo/base/error_codes.err @@ -191,6 +191,7 @@ error_code("PrimarySteppedDown", 189) error_code("MasterSlaveConnectionFailure", 190) error_code("BalancerLostDistributedLock", 191) error_code("FailPointEnabled", 192) +error_code("NoShardingEnabled", 193) # Non-sequential error codes (for compatibility only) error_code("SocketException", 9001) diff --git a/src/mongo/db/commands/dbcommands.cpp b/src/mongo/db/commands/dbcommands.cpp index 0bbdfb5e1cf..794896db52c 100644 --- a/src/mongo/db/commands/dbcommands.cpp +++ b/src/mongo/db/commands/dbcommands.cpp @@ -1304,14 +1304,14 @@ void Command::execCommand(OperationContext* txn, if (oss.hasShardVersion()) { if (serverGlobalParams.clusterRole != ClusterRole::ShardServer) { uassertStatusOK( - {ErrorCodes::IllegalOperation, + {ErrorCodes::NoShardingEnabled, "Cannot accept sharding commands if not started with --shardsvr"}); } else if (!shardingState->enabled()) { // TODO(esha): Once 3.4 ships, we no longer need to support initializing // sharding awareness through commands, so just reject all sharding commands. if (!shardingState->commandInitializesShardingAwareness( request.getCommandName().toString())) { - uassertStatusOK({ErrorCodes::IllegalOperation, + uassertStatusOK({ErrorCodes::NoShardingEnabled, str::stream() << "Received a command with sharding chunk version " "information but this node is not sharding aware: " diff --git a/src/mongo/db/s/set_shard_version_command.cpp b/src/mongo/db/s/set_shard_version_command.cpp index 723721e67d7..08bb9db3cbe 100644 --- a/src/mongo/db/s/set_shard_version_command.cpp +++ b/src/mongo/db/s/set_shard_version_command.cpp @@ -94,6 +94,12 @@ public: int options, string& errmsg, BSONObjBuilder& result) { + + if (serverGlobalParams.clusterRole != ClusterRole::ShardServer) { + uassertStatusOK({ErrorCodes::NoShardingEnabled, + "Cannot accept sharding commands if not started with --shardsvr"}); + } + // Steps // 1. check basic config // 2. extract params from command diff --git a/src/mongo/s/client/version_manager.cpp b/src/mongo/s/client/version_manager.cpp index d129ba9853d..99a63f0aa17 100644 --- a/src/mongo/s/client/version_manager.cpp +++ b/src/mongo/s/client/version_manager.cpp @@ -361,6 +361,10 @@ bool checkShardVersion(OperationContext* txn, return true; } + // If the shard rejected the setShardVersion, return the error to the user. + int errCode = result["code"].numberInt(); + uassert(errCode, result["errmsg"].String(), errCode != ErrorCodes::NoShardingEnabled); + LOG(1) << " setShardVersion failed!\n" << result; if (result["need_authoritative"].trueValue()) |