mirror of https://github.com/mongodb/mongo
139 lines
6.2 KiB
JavaScript
139 lines
6.2 KiB
JavaScript
//
|
|
// Tests mongos's failure tolerance for single-node shards
|
|
//
|
|
// Sets up a cluster with three shards, the first shard of which has an unsharded collection and
|
|
// half a sharded collection. The second shard has the second half of the sharded collection, and
|
|
// the third shard has nothing. Progressively shuts down each shard to see the impact on the
|
|
// cluster.
|
|
//
|
|
// Three different connection states are tested - active (connection is active through whole
|
|
// sequence), idle (connection is connected but not used before a shard change), and new
|
|
// (connection connected after shard change).
|
|
//
|
|
// The following checks involve talking to shards, but this test shuts down shards.
|
|
import {ShardingTest} from "jstests/libs/shardingtest.js";
|
|
|
|
TestData.skipCheckingUUIDsConsistentAcrossCluster = true;
|
|
TestData.skipCheckingIndexesConsistentAcrossCluster = true;
|
|
TestData.skipCheckShardFilteringMetadata = true;
|
|
|
|
let st = new ShardingTest({shards: 3, mongos: 1});
|
|
|
|
let admin = st.s0.getDB("admin");
|
|
|
|
const dbCollSharded = "fooSharded";
|
|
const dbCollUnsharded = "fooUnsharded";
|
|
assert.commandWorked(admin.runCommand({enableSharding: dbCollSharded, primaryShard: st.shard0.shardName}));
|
|
assert.commandWorked(admin.runCommand({enableSharding: dbCollUnsharded, primaryShard: st.shard0.shardName}));
|
|
let collSharded = st.s0.getCollection(dbCollSharded + ".barSharded");
|
|
let collUnsharded = st.s0.getCollection(dbCollUnsharded + ".barUnsharded");
|
|
|
|
assert.commandWorked(admin.runCommand({shardCollection: collSharded.toString(), key: {_id: 1}}));
|
|
assert.commandWorked(admin.runCommand({split: collSharded.toString(), middle: {_id: 0}}));
|
|
assert.commandWorked(admin.runCommand({moveChunk: collSharded.toString(), find: {_id: 0}, to: st.shard1.shardName}));
|
|
|
|
// Create the unsharded database
|
|
assert.commandWorked(collUnsharded.insert({some: "doc"}));
|
|
assert.commandWorked(collUnsharded.remove({}));
|
|
|
|
//
|
|
// Setup is complete
|
|
//
|
|
|
|
jsTest.log("Inserting initial data...");
|
|
|
|
let mongosConnActive = new Mongo(st.s0.host);
|
|
let mongosConnIdle = null;
|
|
let mongosConnNew = null;
|
|
|
|
assert.commandWorked(mongosConnActive.getCollection(collSharded.toString()).insert({_id: -1}));
|
|
assert.commandWorked(mongosConnActive.getCollection(collSharded.toString()).insert({_id: 1}));
|
|
assert.commandWorked(mongosConnActive.getCollection(collUnsharded.toString()).insert({_id: 1}));
|
|
|
|
jsTest.log("Stopping third shard...");
|
|
|
|
mongosConnIdle = new Mongo(st.s0.host);
|
|
|
|
st.rs2.stopSet();
|
|
|
|
jsTest.log("Testing active connection...");
|
|
|
|
assert.neq(null, mongosConnActive.getCollection(collSharded.toString()).findOne({_id: -1}));
|
|
assert.neq(null, mongosConnActive.getCollection(collSharded.toString()).findOne({_id: 1}));
|
|
assert.neq(null, mongosConnActive.getCollection(collUnsharded.toString()).findOne({_id: 1}));
|
|
|
|
assert.commandWorked(mongosConnActive.getCollection(collSharded.toString()).insert({_id: -2}));
|
|
assert.commandWorked(mongosConnActive.getCollection(collSharded.toString()).insert({_id: 2}));
|
|
assert.commandWorked(mongosConnActive.getCollection(collUnsharded.toString()).insert({_id: 2}));
|
|
|
|
jsTest.log("Testing idle connection...");
|
|
|
|
assert.commandWorked(mongosConnIdle.getCollection(collSharded.toString()).insert({_id: -3}));
|
|
assert.commandWorked(mongosConnIdle.getCollection(collSharded.toString()).insert({_id: 3}));
|
|
assert.commandWorked(mongosConnIdle.getCollection(collUnsharded.toString()).insert({_id: 3}));
|
|
|
|
assert.neq(null, mongosConnIdle.getCollection(collSharded.toString()).findOne({_id: -1}));
|
|
assert.neq(null, mongosConnIdle.getCollection(collSharded.toString()).findOne({_id: 1}));
|
|
assert.neq(null, mongosConnIdle.getCollection(collUnsharded.toString()).findOne({_id: 1}));
|
|
|
|
jsTest.log("Testing new connections...");
|
|
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.neq(null, mongosConnNew.getCollection(collSharded.toString()).findOne({_id: -1}));
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.neq(null, mongosConnNew.getCollection(collSharded.toString()).findOne({_id: 1}));
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.neq(null, mongosConnNew.getCollection(collUnsharded.toString()).findOne({_id: 1}));
|
|
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.commandWorked(mongosConnNew.getCollection(collSharded.toString()).insert({_id: -4}));
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.commandWorked(mongosConnNew.getCollection(collSharded.toString()).insert({_id: 4}));
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.commandWorked(mongosConnNew.getCollection(collUnsharded.toString()).insert({_id: 4}));
|
|
|
|
gc(); // Clean up new connections
|
|
|
|
jsTest.log("Stopping second shard...");
|
|
|
|
mongosConnIdle = new Mongo(st.s0.host);
|
|
|
|
st.rs1.stopSet();
|
|
jsTest.log("Testing active connection...");
|
|
|
|
assert.neq(null, mongosConnActive.getCollection(collSharded.toString()).findOne({_id: -1}));
|
|
assert.neq(null, mongosConnActive.getCollection(collUnsharded.toString()).findOne({_id: 1}));
|
|
|
|
assert.commandWorked(mongosConnActive.getCollection(collSharded.toString()).insert({_id: -5}));
|
|
|
|
assert.writeError(mongosConnActive.getCollection(collSharded.toString()).insert({_id: 5}));
|
|
assert.commandWorked(mongosConnActive.getCollection(collUnsharded.toString()).insert({_id: 5}));
|
|
|
|
jsTest.log("Testing idle connection...");
|
|
|
|
assert.commandWorked(mongosConnIdle.getCollection(collSharded.toString()).insert({_id: -6}));
|
|
assert.writeError(mongosConnIdle.getCollection(collSharded.toString()).insert({_id: 6}));
|
|
assert.commandWorked(mongosConnIdle.getCollection(collUnsharded.toString()).insert({_id: 6}));
|
|
|
|
assert.neq(null, mongosConnIdle.getCollection(collSharded.toString()).findOne({_id: -1}));
|
|
assert.neq(null, mongosConnIdle.getCollection(collUnsharded.toString()).findOne({_id: 1}));
|
|
|
|
jsTest.log("Testing new connections...");
|
|
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.neq(null, mongosConnNew.getCollection(collSharded.toString()).findOne({_id: -1}));
|
|
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.neq(null, mongosConnNew.getCollection(collUnsharded.toString()).findOne({_id: 1}));
|
|
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.commandWorked(mongosConnNew.getCollection(collSharded.toString()).insert({_id: -7}));
|
|
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.writeError(mongosConnNew.getCollection(collSharded.toString()).insert({_id: 7}));
|
|
|
|
mongosConnNew = new Mongo(st.s0.host);
|
|
assert.commandWorked(mongosConnNew.getCollection(collUnsharded.toString()).insert({_id: 7}));
|
|
|
|
st.stop();
|