// This test ensures that data we add on a replica set is still accessible via mongos when we add it // as a shard. Then it makes sure that we can move the primary for this unsharded database to // another shard that we add later, and after the move the data is still accessible. (function() { "use strict"; var numDocs = 10000; var baseName = "moveprimary-replset"; var testDBName = baseName; var testCollName = 'coll'; jsTest.log("Spinning up a sharded cluster, but not adding the shards"); var shardingTestConfig = { name : baseName, mongos : 1, shards : 2, config : 3, rs : { nodes : 3 }, other : { manualAddShard : true } }; var shardingTest = new ShardingTest(shardingTestConfig); jsTest.log("Geting connections to the individual shards"); var replSet1 = shardingTest.rs0; var replSet2 = shardingTest.rs1; jsTest.log("Adding data to our first replica set"); var repset1DB = replSet1.getPrimary().getDB(testDBName); for (var i = 1; i <= numDocs; i++) { repset1DB[testCollName].insert({ x : i }); } replSet1.awaitReplication(); jsTest.log("Geting connection to mongos for the cluster"); var mongosConn = shardingTest.s; var testDB = mongosConn.getDB(testDBName); jsTest.log("Adding replSet1 as only shard"); mongosConn.adminCommand({ addshard : replSet1.getURL() }); jsTest.log("Updating the data via mongos and making sure all documents are updated and present"); testDB[testCollName].update({}, { $set : { y : 'hello' } }, false/*upsert*/, true/*multi*/); assert.eq(testDB[testCollName].count({ y : 'hello' }), numDocs, 'updating and counting docs via mongos failed'); jsTest.log("Adding replSet2 as second shard"); mongosConn.adminCommand({ addshard : replSet2.getURL() }); mongosConn.getDB('admin').printShardingStatus(); printjson(replSet2.getPrimary().getDBs()); jsTest.log("Moving test db from replSet1 to replSet2"); assert.commandWorked(mongosConn.getDB('admin').runCommand({ moveprimary: testDBName, to: replSet2.getURL() })); mongosConn.getDB('admin').printShardingStatus(); printjson(replSet2.getPrimary().getDBs()); assert.eq(testDB.getSiblingDB("config").databases.findOne({ "_id" : testDBName }).primary, replSet2.name, "Failed to change primary shard for unsharded database."); jsTest.log("Updating the data via mongos and making sure all documents are updated and present"); testDB[testCollName].update({}, { $set : { z : 'world' } }, false/*upsert*/, true/*multi*/); assert.eq(testDB[testCollName].count({ z : 'world' }), numDocs, 'updating and counting docs via mongos failed'); jsTest.log("Shutting down cluster"); shardingTest.stop(); print('moveprimary-replset.js SUCCESS'); })();