summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEsha Maharishi <esha.maharishi@mongodb.com>2016-10-11 13:07:12 -0400
committerEsha Maharishi <esha.maharishi@mongodb.com>2016-10-11 13:07:12 -0400
commitd08e9c66c53f5e7fb0cbf9bae98cca3494927596 (patch)
tree3c4ab3dc9117390b514bde4b48c6af07bba4b6ab
parent9ba1c43cc03b1b283d798a8f3035efcdf73c15e9 (diff)
downloadmongo-d08e9c66c53f5e7fb0cbf9bae98cca3494927596.tar.gz
SERVER-26286 rewrite addshard2.js to shut down each replica set or standalone after testing it
-rw-r--r--jstests/sharding/addshard2.js311
1 files changed, 188 insertions, 123 deletions
diff --git a/jstests/sharding/addshard2.js b/jstests/sharding/addshard2.js
index 7af23a4ab5b..e0b56431fee 100644
--- a/jstests/sharding/addshard2.js
+++ b/jstests/sharding/addshard2.js
@@ -1,129 +1,194 @@
(function() {
- // Don't start any shards, yet
- var s =
- new ShardingTest({name: "add_shard2", shards: 1, mongos: 1, other: {useHostname: true}});
-
- // Start two new instances, which will be used for shards
- var conn1 = MongoRunner.runMongod({useHostname: true});
- var conn2 = MongoRunner.runMongod({useHostname: true});
-
- var rs1 = new ReplSetTest({"name": "add_shard2_rs1", nodes: 3});
- rs1.startSet();
- rs1.initiate();
- var master1 = rs1.getPrimary();
-
- var rs2 = new ReplSetTest({"name": "add_shard2_rs2", nodes: 3});
- rs2.startSet();
- rs2.initiate();
- var master2 = rs2.getPrimary();
-
- // replica set with set name = 'config'
- var rs3 = new ReplSetTest({'name': 'config', nodes: 3});
- rs3.startSet();
- rs3.initiate();
-
- // replica set with set name = 'admin'
- var rs4 = new ReplSetTest({'name': 'admin', nodes: 3});
- rs4.startSet();
- rs4.initiate();
-
- // replica set with configsvr: true should *not* be allowed to be added as a shard
- var rs5 = new ReplSetTest({
- name: 'csrs',
- nodes: 3,
- nodeOptions: {configsvr: "", journal: "", storageEngine: "wiredTiger"}
+ var addShardRes;
+ var rst;
+
+ var assertAddShardSucceeded = function(res, shardName) {
+ assert.commandWorked(res);
+
+ // If a shard name was specified, make sure that the name the addShard command reports the
+ // shard was added with matches the specified name.
+ if (shardName) {
+ assert.eq(shardName,
+ res.shardAdded,
+ "name returned by addShard does not match name specified in addShard");
+ }
+
+ // Make sure the shard shows up in config.shards with the shardName reported by the
+ // addShard command.
+ assert.neq(null,
+ st.s.getDB('config').shards.findOne({_id: res.shardAdded}),
+ "newly added shard " + res.shardAdded + " not found in config.shards");
+ };
+
+ // Note: this method expects that the failure is *not* that the specified shardName is already
+ // the shardName of an existing shard.
+ var assertAddShardFailed = function(res, shardName) {
+ assert.commandFailed(res);
+
+ // If a shard name was specified in the addShard, make sure no shard with its name shows up
+ // in config.shards.
+ if (shardName) {
+ assert.eq(null,
+ st.s.getDB('config').shards.findOne({_id: shardName}),
+ "addShard for " + shardName +
+ " reported failure, but shard shows up in config.shards");
+ }
+ };
+
+ var removeShardWithName = function(shardName) {
+ var res = st.s.adminCommand({removeShard: shardName});
+ assert.commandWorked(res);
+ assert.eq('started', res.state);
+ assert.soon(function() {
+ res = st.s.adminCommand({removeShard: shardName});
+ assert.commandWorked(res);
+ return ('completed' === res.state);
+ }, "removeShard never completed for shard " + shardName);
+ };
+
+ var st = new ShardingTest({
+ shards: 0,
+ mongos: 1
});
- rs5.startSet();
- var conf = rs5.getReplSetConfig();
- conf.configsvr = true;
- rs5.initiate(conf);
-
- // step 1. name given. maxSize zero means no limit. Make sure it is allowed.
- assert.commandWorked(
- s.admin.runCommand({addshard: getHostName() + ":" + conn1.port, name: "bar", maxSize: 0}));
- var shard = s.getDB("config").shards.findOne({"_id": {"$nin": ["shard0000"]}});
- assert(shard, "shard wasn't found");
- assert.eq("bar", shard._id, "shard has incorrect name");
-
- // step 2. replica set
- assert(
- s.admin.runCommand({"addshard": "add_shard2_rs1/" + getHostName() + ":" + master1.port}).ok,
- "failed to add shard in step 2");
- shard = s.getDB("config").shards.findOne({"_id": {"$nin": ["shard0000", "bar"]}});
- assert(shard, "shard wasn't found");
- assert.eq("add_shard2_rs1", shard._id, "t2 name");
-
- // step 3. replica set w/ name given
- assert(s.admin.runCommand({
- "addshard": "add_shard2_rs2/" + getHostName() + ":" + master2.port,
- "name": "myshard"
- }).ok,
- "failed to add shard in step 4");
- shard = s.getDB("config")
- .shards.findOne({"_id": {"$nin": ["shard0000", "bar", "add_shard2_rs1"]}});
- assert(shard, "shard wasn't found");
- assert.eq("myshard", shard._id, "t3 name");
-
- // step 4. no name given
- assert(s.admin.runCommand({"addshard": getHostName() + ":" + conn2.port}).ok,
- "failed to add shard in step 4");
- shard = s.getDB("config").shards.findOne(
- {"_id": {"$nin": ["shard0000", "bar", "add_shard2_rs1", "myshard"]}});
- assert(shard, "shard wasn't found");
- assert.eq("shard0001", shard._id, "t4 name");
-
- assert.eq(s.getDB("config").shards.count(), 5, "unexpected number of shards");
-
- // step 5. replica set w/ a wrong host
+
+ // Add one shard since the last shard cannot be removed.
+ var normalShard = MongoRunner.runMongod();
+ st.s.adminCommand({addShard: normalShard.name, name: 'normalShard'});
+
+ // Allocate a port that can be used to test adding invalid hosts.
var portWithoutHostRunning = allocatePort();
- assert(!s.admin.runCommand(
- {addshard: "add_shard2_rs2/NonExistingHost:" + portWithoutHostRunning}).ok,
- "accepted bad hostname in step 5");
-
- // step 6. replica set w/ mixed wrong/right hosts
- assert(!s.admin.runCommand({
- addshard: "add_shard2_rs2/" + getHostName() + ":" + master2.port + ",foo:" +
- portWithoutHostRunning
- }).ok,
- "accepted bad hostname in step 6");
-
- // Cannot add invalid stand alone host.
- assert.commandFailed(s.admin.runCommand({addshard: 'dummy:12345'}));
-
- //
- // SERVER-17231 Adding replica set w/ set name = 'config'
- //
- var configReplURI = 'config/' + getHostName() + ':' + rs3.getPrimary().port;
-
- assert(!s.admin.runCommand({'addshard': configReplURI}).ok,
- 'accepted replica set shard with set name "config"');
- // but we should be allowed to add that replica set using a different shard name
- assert(s.admin.runCommand({'addshard': configReplURI, name: 'not_config'}).ok,
- 'unable to add replica set using valid replica set name');
-
- shard = s.getDB('config').shards.findOne({'_id': 'not_config'});
- assert(shard, 'shard with name "not_config" not found');
-
- //
- // SERVER-17232 Try inserting into shard with name 'admin'
- //
- assert(
- s.admin.runCommand({'addshard': 'admin/' + getHostName() + ':' + rs4.getPrimary().port}).ok,
- 'adding replica set with name "admin" should work');
- var wRes = s.getDB('test').foo.insert({x: 1});
- assert(!wRes.hasWriteError() && wRes.nInserted === 1,
- 'failed to insert document into "test.foo" unsharded collection');
-
- // SERVER-19545 Should not be able to add config server replsets as shards.
- assert.commandFailed(s.admin.runCommand({addshard: rs5.getURL()}));
-
- s.stop();
-
- rs1.stopSet();
- rs2.stopSet();
- rs3.stopSet();
- rs4.stopSet();
- rs5.stopSet();
+
+ // 1. Test adding a *standalone*
+
+ // 1.a. with or without specifying the shardName.
+
+ var standalone = MongoRunner.runMongod();
+
+ jsTest.log("Adding a standalone *without* a specified shardName should succeed.");
+ addShardRes = st.s.adminCommand({addshard: standalone.name});
+ assertAddShardSucceeded(addShardRes);
+ removeShardWithName(addShardRes.shardAdded);
+
+ jsTest.log("Adding a standalone *with* a specified shardName should succeed.");
+ addShardRes = st.s.adminCommand({addshard: standalone.name, name: "shardName"});
+ assertAddShardSucceeded(addShardRes, "shardName");
+ removeShardWithName(addShardRes.shardAdded);
+
+ MongoRunner.stopMongod(standalone);
+
+ // 1.b. with an invalid hostname.
+
+ jsTest.log("Adding a standalone with a non-existing host should fail.");
+ addShardRes = st.s.adminCommand({addShard: getHostName() + ":" + portWithoutHostRunning});
+ assertAddShardFailed(addShardRes);
+
+ // 2. Test adding a *replica set* with an ordinary set name
+
+ // 2.a. with or without specifying the shardName.
+
+ rst = new ReplSetTest({nodes: 1});
+ rst.startSet();
+ rst.initiate();
+
+ jsTest.log("Adding a replica set without a specified shardName should succeed.");
+ addShardRes = st.s.adminCommand({addShard: rst.getURL()});
+ assertAddShardSucceeded(addShardRes);
+ assert.eq(rst.name, addShardRes.shardAdded);
+ removeShardWithName(addShardRes.shardAdded);
+
+ jsTest.log(
+ "Adding a replica set with a specified shardName that matches the set's name should succeed.");
+ addShardRes = st.s.adminCommand({addShard: rst.getURL(), name: rst.name});
+ assertAddShardSucceeded(addShardRes, rst.name);
+ removeShardWithName(addShardRes.shardAdded);
+
+ jsTest.log(
+ "Adding a replica set with a specified shardName that differs from the set's name should succeed.");
+ addShardRes = st.s.adminCommand({addShard: rst.getURL(), name: "differentShardName"});
+ assertAddShardSucceeded(addShardRes, "differentShardName");
+ removeShardWithName(addShardRes.shardAdded);
+
+ jsTest.log("Adding a replica with a specified shardName of 'config' should fail.");
+ addShardRes = st.s.adminCommand({addShard: rst.getURL(), name: "config"});
+ assertAddShardFailed(addShardRes, "config");
+
+ // 2.b. with invalid hostnames.
+
+ jsTest.log("Adding a replica set with only non-existing hosts should fail.");
+ addShardRes =
+ st.s.adminCommand({addShard: rst.name + "/NonExistingHost:" + portWithoutHostRunning});
+ assertAddShardFailed(addShardRes);
+
+ jsTest.log("Adding a replica set with mixed existing/non-existing hosts should fail.");
+ addShardRes = st.s.adminCommand({
+ addShard:
+ rst.name + "/" + rst.getPrimary().name + ",NonExistingHost:" + portWithoutHostRunning
+ });
+ assertAddShardFailed(addShardRes);
+
+ rst.stopSet();
+
+ // 3. Test adding a replica set whose *set name* is "config" with or without specifying the
+ // shardName.
+
+ rst = new ReplSetTest({name: "config", nodes: 1});
+ rst.startSet();
+ rst.initiate();
+
+ jsTest.log(
+ "Adding a replica set whose setName is config without specifying shardName should fail.");
+ addShardRes = st.s.adminCommand({addShard: rst.getURL()});
+ assertAddShardFailed(addShardRes);
+
+ jsTest.log(
+ "Adding a replica set whose setName is config with specified shardName 'config' should fail.");
+ addShardRes = st.s.adminCommand({addShard: rst.getURL(), name: rst.name});
+ assertAddShardFailed(addShardRes, rst.name);
+
+ jsTest.log(
+ "Adding a replica set whose setName is config with a non-'config' shardName should succeed");
+ addShardRes = st.s.adminCommand({addShard: rst.getURL(), name: "nonConfig"});
+ assertAddShardSucceeded(addShardRes, "nonConfig");
+ removeShardWithName(addShardRes.shardAdded);
+
+ rst.stopSet();
+
+ // 4. Test that a replica set whose *set name* is "admin" can be written to (SERVER-17232).
+
+ rst = new ReplSetTest({name: "admin", nodes: 1});
+ rst.startSet();
+ rst.initiate();
+
+ jsTest.log("A replica set whose set name is 'admin' should be able to be written to.");
+ addShardRes = st.s.adminCommand({addShard: rst.getURL()});
+ assertAddShardSucceeded(addShardRes);
+ assert.writeOK(st.s.getDB('test').foo.insert({x: 1}));
+
+ rst.stopSet();
+
+ // 5. Test adding a --configsvr replica set.
+
+ var configRS = new ReplSetTest({nodes: 1});
+ configRS.startSet({configsvr: '', storageEngine: 'wiredTiger'});
+ configRS.initiate();
+
+ jsTest.log("Adding a config server replica set without a specified shardName should fail.");
+ addShardRes = st.s.adminCommand({addShard: configRS.getURL()});
+ assertAddShardFailed(addShardRes);
+
+ jsTest.log(
+ "Adding a config server replica set with a shardName that matches the set's name should fail.");
+ addShardRes = st.s.adminCommand({addShard: configRS.getURL(), name: configRS.name});
+ assertAddShardFailed(addShardRes, configRS.name);
+
+ jsTest.log(
+ "Adding a config server replica set even with a non-'config' shardName should fail.");
+ addShardRes = st.s.adminCommand({addShard: configRS.getURL(), name: "nonConfig"});
+ assertAddShardFailed(addShardRes, "nonConfig");
+
+ configRS.stopSet();
+
+ st.stop();
})();