summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buildscripts/resmokeconfig/suites/sharding_continuous_config_stepdown.yml1
-rw-r--r--jstests/sharding/convert_to_and_from_sharded.js116
2 files changed, 117 insertions, 0 deletions
diff --git a/buildscripts/resmokeconfig/suites/sharding_continuous_config_stepdown.yml b/buildscripts/resmokeconfig/suites/sharding_continuous_config_stepdown.yml
index 0de2979fde0..490b2ddfb88 100644
--- a/buildscripts/resmokeconfig/suites/sharding_continuous_config_stepdown.yml
+++ b/buildscripts/resmokeconfig/suites/sharding_continuous_config_stepdown.yml
@@ -72,6 +72,7 @@ selector:
- jstests/sharding/bulk_insert.js
- jstests/sharding/printShardingStatus.js
# Balancer writes (direct write to config database with no retries)
+ - jstests/sharding/convert_to_and_from_sharded.js
- jstests/sharding/remove2.js
- jstests/sharding/auto2.js
- jstests/sharding/features3.js
diff --git a/jstests/sharding/convert_to_and_from_sharded.js b/jstests/sharding/convert_to_and_from_sharded.js
new file mode 100644
index 00000000000..e838559e0f8
--- /dev/null
+++ b/jstests/sharding/convert_to_and_from_sharded.js
@@ -0,0 +1,116 @@
+/**
+ * Test that a replica set member can process basic CRUD operations after switching from being
+ * a shardsvr and back to non shardsvr.
+ * @tags: [requires_persistence]
+ */
+(function() {
+
+ "use strict";
+
+ var NUM_NODES = 3;
+
+ /**
+ * Checks that basic CRUD operations work as expected. Expects the collection to have a
+ * { _id: 'marker' } document.
+ */
+ var checkBasicCRUD = function(coll) {
+ var doc = coll.findOne({_id: 'marker', y: {$exists: false}});
+ assert.neq(null, doc);
+
+ assert.writeOK(coll.update({_id: 'marker'}, {$set: {y: 2}}));
+ assert.eq(2, coll.findOne({_id: 'marker'}).y);
+
+ assert.writeOK(coll.remove({_id: 'marker'}));
+ assert.eq(null, coll.findOne({_id: 'marker'}));
+
+ assert.writeOK(coll.insert({_id: 'marker'}, {writeConcern: {w: NUM_NODES}}));
+ assert.eq('marker', coll.findOne({_id: 'marker'})._id);
+ };
+
+ var st = new ShardingTest({shards: {}});
+
+ var replShard = new ReplSetTest({nodes: NUM_NODES});
+ replShard.startSet({verbose: 1});
+ replShard.initiate();
+
+ var priConn = replShard.getPrimary();
+
+ assert.writeOK(priConn.getDB('test').unsharded.insert({_id: 'marker'}));
+ checkBasicCRUD(priConn.getDB('test').unsharded);
+
+ assert.writeOK(priConn.getDB('test').sharded.insert({_id: 'marker'}));
+ checkBasicCRUD(priConn.getDB('test').sharded);
+
+ for (var x = 0; x < NUM_NODES; x++) {
+ replShard.restart(x, {shardsvr: ''});
+ }
+
+ replShard.awaitNodesAgreeOnPrimary();
+ assert.commandWorked(st.s.adminCommand({addShard: replShard.getURL()}));
+
+ priConn = replShard.getPrimary();
+ checkBasicCRUD(priConn.getDB('test').unsharded);
+ checkBasicCRUD(priConn.getDB('test').sharded);
+
+ checkBasicCRUD(st.s.getDB('test').unsharded);
+ checkBasicCRUD(st.s.getDB('test').sharded);
+
+ assert.commandWorked(st.s.adminCommand({enableSharding: 'test'}));
+ assert.commandWorked(st.s.adminCommand({shardCollection: 'test.sharded', key: {_id: 1}}));
+
+ checkBasicCRUD(st.s.getDB('test').unsharded);
+ checkBasicCRUD(st.s.getDB('test').sharded);
+
+ for (x = 0; x < 4; x++) {
+ assert.writeOK(st.s.getDB('test').sharded.insert({_id: x}));
+ assert.commandWorked(st.s.adminCommand({split: 'test.sharded', middle: {_id: x}}));
+ }
+
+ var newMongod = MongoRunner.runMongod({shardsvr: ''});
+
+ assert.commandWorked(st.s.adminCommand({addShard: newMongod.name, name: 'toRemoveLater'}));
+
+ for (x = 0; x < 2; x++) {
+ assert.commandWorked(
+ st.s.adminCommand({moveChunk: 'test.sharded', find: {_id: x}, to: 'toRemoveLater'}));
+ }
+
+ checkBasicCRUD(st.s.getDB('test').unsharded);
+ checkBasicCRUD(st.s.getDB('test').sharded);
+
+ assert.commandWorked(st.s.adminCommand({removeShard: 'toRemoveLater'}));
+
+ // Start the balancer to start draining the chunks.
+ st.startBalancer();
+
+ assert.soon(function() {
+ var res = st.s.adminCommand({removeShard: 'toRemoveLater'});
+ return res.state == 'completed';
+ });
+
+ MongoRunner.stopMongod(newMongod.port);
+
+ checkBasicCRUD(st.s.getDB('test').unsharded);
+ checkBasicCRUD(st.s.getDB('test').sharded);
+
+ st.stop();
+
+ checkBasicCRUD(priConn.getDB('test').unsharded);
+ checkBasicCRUD(priConn.getDB('test').sharded);
+
+ jsTest.log('About to restart repl w/o shardsvr');
+
+ replShard.nodes.forEach(function(node) {
+ delete node.fullOptions.shardsvr;
+ });
+
+ replShard.restart(replShard.nodes);
+ replShard.awaitNodesAgreeOnPrimary();
+
+ priConn = replShard.getPrimary();
+ checkBasicCRUD(priConn.getDB('test').unsharded);
+ checkBasicCRUD(priConn.getDB('test').sharded);
+
+ replShard.stopSet();
+
+})();