mongo/jstests/sharding/zero_shard_version.js

171 lines
4.7 KiB
JavaScript

/**
* Tests the setShardVersion logic on the this shard side, specifically when comparing
* against a major version of zero or incompatible epochs.
*/
import {FeatureFlagUtil} from "jstests/libs/feature_flag_util.js";
import {ShardingTest} from "jstests/libs/shardingtest.js";
let st = new ShardingTest({shards: 2, mongos: 2});
let testDB_s0 = st.s.getDB("test");
assert.commandWorked(testDB_s0.adminCommand({enableSharding: "test", primaryShard: st.shard1.shardName}));
assert.commandWorked(testDB_s0.adminCommand({shardCollection: "test.user", key: {x: 1}}));
let checkShardMajorVersion = function (conn, expectedMajorVersion) {
const shardVersion = assert.commandWorked(conn.adminCommand({getShardVersion: "test.user"})).global;
assert.eq(
shardVersion.getTime(),
expectedMajorVersion,
"Node " +
conn +
" expected to have major version " +
expectedMajorVersion +
" but has version " +
tojson(shardVersion),
);
};
// Routing information:
// - mongos0: 1|0|a
// - mongos1: UNKNOWN
// Shard information:
// - shard0: UNKNOWN
// - shard1: 1|0|a, [-inf, inf)
///////////////////////////////////////////////////////
// Test shard with empty chunk
let testDB_s1 = st.s1.getDB("test");
assert.commandWorked(testDB_s1.user.insert({x: 1}));
assert.commandWorked(testDB_s1.adminCommand({moveChunk: "test.user", find: {x: 0}, to: st.shard0.shardName}));
st.configRS.awaitLastOpCommitted();
// Routing information:
// - mongos0: 1|0|a
// - mongos1: 2|0|a
// Shard information:
// - shard0: 2|0|a, [-inf, inf)
// - shard1: 0|0|a
checkShardMajorVersion(st.rs0.getPrimary(), 2);
checkShardMajorVersion(st.rs1.getPrimary(), 0);
// mongos0 still thinks that { x: 1 } belong to st.shard1.shardName, but should be able to
// refresh it's metadata correctly.
assert.neq(null, testDB_s0.user.findOne({x: 1}));
// Routing information:
// - mongos0: 2|0|a
// - mongos1: 2|0|a
// Shard information:
// - shard0: 2|0|a, [-inf, inf)
// - shard1: 0|0|a
///////////////////////////////////////////////////////
// Test unsharded collection
// mongos versions: s0, s2, s3: 2|0|a
testDB_s1.user.drop();
assert.commandWorked(testDB_s1.user.insert({x: 10}));
// Routing information:
// - mongos0: 2|0|a
// - mongos1: 1|0|b
// Shard information:
// - shard0: UNKNOWN
// - shard1: 1|0|b
checkShardMajorVersion(st.rs1.getPrimary(), 0);
// mongos0 still thinks { x: 10 } belong to st.shard0.shardName, but since coll is dropped,
// query should be routed to primary shard.
assert.neq(null, testDB_s0.user.findOne({x: 10}));
checkShardMajorVersion(st.rs0.getPrimary(), 0);
checkShardMajorVersion(st.rs1.getPrimary(), 0);
// Routing information:
// - mongos0: 0|0|b
// - mongos1: 0|0|b
// Shard information:
// - shard0: 0|0|b
// - shard1: 0|0|b
///////////////////////////////////////////////////////
// Test 2 shards with 1 chunk
// mongos versions: s0: 0|0|0, s2, s3: 2|0|a
testDB_s1.user.drop();
testDB_s1.adminCommand({shardCollection: "test.user", key: {x: 1}});
testDB_s1.adminCommand({split: "test.user", middle: {x: 0}});
// Routing information:
// - mongos0: 0|0|b
// - mongos1: 1|2|c
// Shard information:
// - shard0: UNKNOWN
// - shard1: 1|2|c, [-inf, 0), [0, inf)
testDB_s1.user.insert({x: 1});
testDB_s1.user.insert({x: -11});
assert.commandWorked(testDB_s1.adminCommand({moveChunk: "test.user", find: {x: -1}, to: st.shard0.shardName}));
st.configRS.awaitLastOpCommitted();
// Routing information:
// - mongos0: 0|0|b
// - mongos1: 2|0|c
// Shard information:
// - shard0: 2|0|c, [-inf, 0)
// - shard1: 2|1|c, [0, inf)
checkShardMajorVersion(st.rs0.getPrimary(), 2);
checkShardMajorVersion(st.rs1.getPrimary(), 2);
// Routing information:
// - mongos0: 0|0|b
// - mongos1: 2|0|c
// Shard information:
// - shard0: 2|0|c, [-inf, 0)
// - shard1: 2|1|c, [0, inf)
///////////////////////////////////////////////////////
// Test mongos thinks unsharded when it's actually sharded
// Set mongos0 to version 0|0|0
testDB_s0.user.drop();
assert.eq(null, testDB_s0.user.findOne({x: 1}));
// Needs to also set mongos1 to version 0|0|0, otherwise it'll complain that collection is
// already sharded.
assert.eq(null, testDB_s1.user.findOne({x: 1}));
assert.commandWorked(testDB_s1.adminCommand({shardCollection: "test.user", key: {x: 1}}));
testDB_s1.user.insert({x: 1});
assert.commandWorked(testDB_s1.adminCommand({moveChunk: "test.user", find: {x: 0}, to: st.shard0.shardName}));
st.configRS.awaitLastOpCommitted();
// Routing information:
// - mongos0: 0|0|b
// - mongos1: 2|0|d
// Shard information:
// - shard0: 2|0|d, [-inf, inf)
// - shard1: 0|0|d
checkShardMajorVersion(st.rs0.getPrimary(), 2);
checkShardMajorVersion(st.rs1.getPrimary(), 0);
st.stop();