diff options
Diffstat (limited to 'jstests/gle/gle_sharded_wc.js')
-rw-r--r-- | jstests/gle/gle_sharded_wc.js | 250 |
1 files changed, 126 insertions, 124 deletions
diff --git a/jstests/gle/gle_sharded_wc.js b/jstests/gle/gle_sharded_wc.js index 71883b12c0f..ba7594588e3 100644 --- a/jstests/gle/gle_sharded_wc.js +++ b/jstests/gle/gle_sharded_wc.js @@ -6,129 +6,131 @@ // @tags: [SERVER-21420] (function() { -'use strict'; - -// Options for a cluster with two replica set shards, the first with two nodes the second with one -// This lets us try a number of GLE scenarios -var options = { rs : true, - rsOptions : { nojournal : "" }, - // Options for each replica set shard - rs0 : { nodes : 3 }, - rs1 : { nodes : 3 } }; - -var st = new ShardingTest({ shards: 2, other : options }); - -var mongos = st.s0; -var admin = mongos.getDB( "admin" ); -var config = mongos.getDB( "config" ); -var coll = mongos.getCollection( jsTestName() + ".coll" ); -var shards = config.shards.find().toArray(); - -assert.commandWorked( admin.runCommand({ enableSharding : coll.getDB().toString() }) ); -printjson( admin.runCommand({ movePrimary : coll.getDB().toString(), to : shards[0]._id }) ); -assert.commandWorked( admin.runCommand({ shardCollection : coll.toString(), key : { _id : 1 } }) ); -assert.commandWorked( admin.runCommand({ split : coll.toString(), middle : { _id : 0 } }) ); -assert.commandWorked( admin.runCommand({ moveChunk : coll.toString(), - find : { _id : 0 }, - to : shards[1]._id }) ); - -st.printShardingStatus(); - -var gle = null; - -// -// No journal insert, GLE fails -coll.remove({}); -coll.insert({ _id : 1 }); -printjson(gle = coll.getDB().runCommand({ getLastError : 1, j : true })); -assert(!gle.ok); -assert(gle.errmsg); - -// -// Successful insert, write concern mode invalid -coll.remove({}); -coll.insert({ _id : -1 }); -printjson(gle = coll.getDB().runCommand({ getLastError : 1, w : 'invalid' })); -assert(!gle.ok); -assert(!gle.err); -assert(gle.errmsg); -assert.eq(gle.code, 79); // UnknownReplWriteConcern - needed for backwards compatibility -assert.eq(coll.count(), 1); - -// -// Error on insert (dup key), write concern error not reported -coll.remove({}); -coll.insert({ _id : -1 }); -coll.insert({ _id : -1 }); -printjson(gle = coll.getDB().runCommand({ getLastError : 1, w : 'invalid' })); -assert(gle.ok); -assert(gle.err); -assert(gle.code); -assert(!gle.errmsg); -assert.eq(coll.count(), 1); - -// -// Successful remove on one shard, write concern timeout on the other -var s0Id = st.rs0.getNodeId(st.rs0.liveNodes.slaves[0]); -st.rs0.stop(s0Id); -coll.remove({}); -st.rs1.awaitReplication(); // To ensure the first shard won't timeout -printjson(gle = coll.getDB().runCommand({ getLastError : 1, w : 3, wtimeout : 5 * 1000 })); -assert(gle.ok); -assert.eq(gle.err, 'timeout'); -assert(gle.wtimeout); -assert(gle.shards); -assert.eq(coll.count(), 0); - -// -// Successful remove on two hosts, write concern timeout on both -// We don't aggregate two timeouts together -var s1Id = st.rs1.getNodeId(st.rs1.liveNodes.slaves[0]); -st.rs1.stop(s1Id); -// new writes to both shards to ensure that remove will do something on both of them -coll.insert({ _id : -1 }); -coll.insert({ _id : 1 }); - -coll.remove({}); -printjson(gle = coll.getDB().runCommand({ getLastError : 1, w : 3, wtimeout : 5 * 1000 })); - -assert(!gle.ok); -assert(gle.errmsg); -assert.eq(gle.code, 64); // WriteConcernFailed - needed for backwards compatibility -assert(!gle.wtimeout); -assert(gle.shards); -assert(gle.errs); -assert.eq(coll.count(), 0); - -// -// First replica set with no primary -// - -// -// Successful bulk insert on two hosts, host changes before gle (error contacting host) -coll.remove({}); -coll.insert([{ _id : 1 }, { _id : -1 }]); -// Wait for write to be written to shards before shutting it down. -printjson(gle = coll.getDB().runCommand({ getLastError : 1 })); -st.rs0.stop(st.rs0.getPrimary(), true); // wait for stop -printjson(gle = coll.getDB().runCommand({ getLastError : 1 })); -// Should get an error about contacting dead host. -assert(!gle.ok); -assert(gle.errmsg); -assert.eq(coll.count({ _id : 1 }), 1); - -// -// Failed insert on two hosts, first replica set with no primary -// NOTE: This is DIFFERENT from 2.4, since we don't need to contact a host we didn't get -// successful writes from. -coll.remove({ _id : 1 }); -coll.insert([{ _id : 1 }, { _id : -1 }]); - -printjson(gle = coll.getDB().runCommand({ getLastError : 1 })); -assert(gle.ok); -assert(gle.err); -assert.eq(coll.count({ _id : 1 }), 1); - -st.stop(); + 'use strict'; + + // Options for a cluster with two replica set shards, the first with two nodes the second with + // one + // This lets us try a number of GLE scenarios + var options = { + rs: true, + rsOptions: {nojournal: ""}, + // Options for each replica set shard + rs0: {nodes: 3}, + rs1: {nodes: 3} + }; + + var st = new ShardingTest({shards: 2, other: options}); + + var mongos = st.s0; + var admin = mongos.getDB("admin"); + var config = mongos.getDB("config"); + var coll = mongos.getCollection(jsTestName() + ".coll"); + var shards = config.shards.find().toArray(); + + assert.commandWorked(admin.runCommand({enableSharding: coll.getDB().toString()})); + printjson(admin.runCommand({movePrimary: coll.getDB().toString(), to: shards[0]._id})); + assert.commandWorked(admin.runCommand({shardCollection: coll.toString(), key: {_id: 1}})); + assert.commandWorked(admin.runCommand({split: coll.toString(), middle: {_id: 0}})); + assert.commandWorked( + admin.runCommand({moveChunk: coll.toString(), find: {_id: 0}, to: shards[1]._id})); + + st.printShardingStatus(); + + var gle = null; + + // + // No journal insert, GLE fails + coll.remove({}); + coll.insert({_id: 1}); + printjson(gle = coll.getDB().runCommand({getLastError: 1, j: true})); + assert(!gle.ok); + assert(gle.errmsg); + + // + // Successful insert, write concern mode invalid + coll.remove({}); + coll.insert({_id: -1}); + printjson(gle = coll.getDB().runCommand({getLastError: 1, w: 'invalid'})); + assert(!gle.ok); + assert(!gle.err); + assert(gle.errmsg); + assert.eq(gle.code, 79); // UnknownReplWriteConcern - needed for backwards compatibility + assert.eq(coll.count(), 1); + + // + // Error on insert (dup key), write concern error not reported + coll.remove({}); + coll.insert({_id: -1}); + coll.insert({_id: -1}); + printjson(gle = coll.getDB().runCommand({getLastError: 1, w: 'invalid'})); + assert(gle.ok); + assert(gle.err); + assert(gle.code); + assert(!gle.errmsg); + assert.eq(coll.count(), 1); + + // + // Successful remove on one shard, write concern timeout on the other + var s0Id = st.rs0.getNodeId(st.rs0.liveNodes.slaves[0]); + st.rs0.stop(s0Id); + coll.remove({}); + st.rs1.awaitReplication(); // To ensure the first shard won't timeout + printjson(gle = coll.getDB().runCommand({getLastError: 1, w: 3, wtimeout: 5 * 1000})); + assert(gle.ok); + assert.eq(gle.err, 'timeout'); + assert(gle.wtimeout); + assert(gle.shards); + assert.eq(coll.count(), 0); + + // + // Successful remove on two hosts, write concern timeout on both + // We don't aggregate two timeouts together + var s1Id = st.rs1.getNodeId(st.rs1.liveNodes.slaves[0]); + st.rs1.stop(s1Id); + // new writes to both shards to ensure that remove will do something on both of them + coll.insert({_id: -1}); + coll.insert({_id: 1}); + + coll.remove({}); + printjson(gle = coll.getDB().runCommand({getLastError: 1, w: 3, wtimeout: 5 * 1000})); + + assert(!gle.ok); + assert(gle.errmsg); + assert.eq(gle.code, 64); // WriteConcernFailed - needed for backwards compatibility + assert(!gle.wtimeout); + assert(gle.shards); + assert(gle.errs); + assert.eq(coll.count(), 0); + + // + // First replica set with no primary + // + + // + // Successful bulk insert on two hosts, host changes before gle (error contacting host) + coll.remove({}); + coll.insert([{_id: 1}, {_id: -1}]); + // Wait for write to be written to shards before shutting it down. + printjson(gle = coll.getDB().runCommand({getLastError: 1})); + st.rs0.stop(st.rs0.getPrimary(), true); // wait for stop + printjson(gle = coll.getDB().runCommand({getLastError: 1})); + // Should get an error about contacting dead host. + assert(!gle.ok); + assert(gle.errmsg); + assert.eq(coll.count({_id: 1}), 1); + + // + // Failed insert on two hosts, first replica set with no primary + // NOTE: This is DIFFERENT from 2.4, since we don't need to contact a host we didn't get + // successful writes from. + coll.remove({_id: 1}); + coll.insert([{_id: 1}, {_id: -1}]); + + printjson(gle = coll.getDB().runCommand({getLastError: 1})); + assert(gle.ok); + assert(gle.err); + assert.eq(coll.count({_id: 1}), 1); + + st.stop(); })(); |