mirror of https://github.com/mongodb/mongo
87 lines
3.6 KiB
JavaScript
87 lines
3.6 KiB
JavaScript
// This test requires persistence because it assumes standalone shards will still have their data
|
|
// after restarting.
|
|
// @tags: [
|
|
// requires_persistence,
|
|
// ]
|
|
|
|
import {ShardingTest} from "jstests/libs/shardingtest.js";
|
|
|
|
let st = new ShardingTest({name: "write_commands", mongos: 2, shards: 2});
|
|
|
|
let dbTestName = "WriteCommandsTestDB";
|
|
let collName = dbTestName + ".TestColl";
|
|
|
|
assert.commandWorked(st.s0.adminCommand({enablesharding: dbTestName, primaryShard: st.shard0.shardName}));
|
|
|
|
assert.commandWorked(st.s0.adminCommand({shardCollection: collName, key: {Key: 1}, unique: true}));
|
|
|
|
// Split at keys 10 and 20
|
|
assert.commandWorked(st.s0.adminCommand({split: collName, middle: {Key: 10}}));
|
|
assert.commandWorked(st.s0.adminCommand({split: collName, middle: {Key: 20}}));
|
|
|
|
printjson(st.config.getSiblingDB("config").chunks.find().toArray());
|
|
|
|
// Move 10 and 20 to st.shard0.shardName1
|
|
assert.commandWorked(
|
|
st.s0.adminCommand({moveChunk: collName, find: {Key: 19}, to: st.shard1.shardName, _waitForDelete: true}),
|
|
);
|
|
assert.commandWorked(
|
|
st.s0.adminCommand({moveChunk: collName, find: {Key: 21}, to: st.shard1.shardName, _waitForDelete: true}),
|
|
);
|
|
|
|
printjson(st.config.getSiblingDB("config").chunks.find().toArray());
|
|
|
|
// Insert one document in each chunk, which we will use to change
|
|
assert(st.s1.getDB(dbTestName).TestColl.insert({Key: 1}));
|
|
assert(st.s1.getDB(dbTestName).TestColl.insert({Key: 11}));
|
|
assert(st.s1.getDB(dbTestName).TestColl.insert({Key: 21}));
|
|
|
|
// Make sure the documents are correctly placed
|
|
printjson(st.shard0.getDB(dbTestName).TestColl.find().toArray());
|
|
printjson(st.shard1.getDB(dbTestName).TestColl.find().toArray());
|
|
|
|
assert.eq(1, st.shard0.getDB(dbTestName).TestColl.count());
|
|
assert.eq(2, st.shard1.getDB(dbTestName).TestColl.count());
|
|
|
|
assert.eq(1, st.shard0.getDB(dbTestName).TestColl.find({Key: 1}).count());
|
|
assert.eq(1, st.shard1.getDB(dbTestName).TestColl.find({Key: 11}).count());
|
|
assert.eq(1, st.shard1.getDB(dbTestName).TestColl.find({Key: 21}).count());
|
|
|
|
// Move chunk [0, 19] to st.shard0.shardName and make sure the documents are correctly placed
|
|
assert.commandWorked(
|
|
st.s0.adminCommand({moveChunk: collName, find: {Key: 19}, _waitForDelete: true, to: st.shard0.shardName}),
|
|
);
|
|
|
|
printjson(st.config.getSiblingDB("config").chunks.find().toArray());
|
|
printjson(st.shard0.getDB(dbTestName).TestColl.find({}).toArray());
|
|
printjson(st.shard1.getDB(dbTestName).TestColl.find({}).toArray());
|
|
|
|
// Now restart all mongod instances, so they don't know yet that they are sharded
|
|
st.restartShardRS(0);
|
|
st.restartShardRS(1);
|
|
|
|
// Now that both mongod shards are restarted, they don't know yet that they are part of a
|
|
// sharded
|
|
// cluster until they get a setShardVerion command. Mongos instance s1 has stale metadata and
|
|
// doesn't know that chunk with key 19 has moved to st.shard0.shardName so it will send it to
|
|
// st.shard1.shardName at
|
|
// first.
|
|
//
|
|
// Shard0001 would only send back a stale config exception if it receives a setShardVersion
|
|
// command. The bug that this test validates is that setShardVersion is indeed being sent (for
|
|
// more
|
|
// information, see SERVER-19395).
|
|
st.s1.getDB(dbTestName).TestColl.update({Key: 11}, {$inc: {Counter: 1}}, {upsert: true});
|
|
|
|
printjson(st.shard0.getDB(dbTestName).TestColl.find({}).toArray());
|
|
printjson(st.shard1.getDB(dbTestName).TestColl.find({}).toArray());
|
|
|
|
assert.eq(2, st.shard0.getDB(dbTestName).TestColl.count());
|
|
assert.eq(1, st.shard1.getDB(dbTestName).TestColl.count());
|
|
|
|
assert.eq(1, st.shard0.getDB(dbTestName).TestColl.find({Key: 1}).count());
|
|
assert.eq(1, st.shard0.getDB(dbTestName).TestColl.find({Key: 11}).count());
|
|
assert.eq(1, st.shard1.getDB(dbTestName).TestColl.find({Key: 21}).count());
|
|
|
|
st.stop();
|