mirror of https://github.com/mongodb/mongo
162 lines
6.3 KiB
JavaScript
162 lines
6.3 KiB
JavaScript
// requires_fcv_61 since the balancer in v6.0 is still working on the number of chunks,
|
|
// hence the balancer is not triggered and the chunk is not marked as jumbo
|
|
// @tags: [requires_fcv_61]
|
|
|
|
// Cannot run the filtering metadata check on tests that run clearJumboFlag.
|
|
TestData.skipCheckShardFilteringMetadata = true;
|
|
|
|
import {findChunksUtil} from "jstests/sharding/libs/find_chunks_util.js";
|
|
import {ShardingTest} from "jstests/libs/shardingtest.js";
|
|
|
|
let st = new ShardingTest({shards: 2, other: {chunkSize: 1}});
|
|
|
|
const mongosSession = st.s.startSession({retryWrites: true});
|
|
const adminDB = mongosSession.getDatabase("admin");
|
|
const configDB = mongosSession.getDatabase("config");
|
|
const testDB = mongosSession.getDatabase("test");
|
|
const testColl = testDB.getCollection("range");
|
|
const hashedTestColl = testDB.getCollection("hashed");
|
|
|
|
function runBalancer(coll) {
|
|
st.startBalancer();
|
|
|
|
// Let the balancer run until balanced.
|
|
st.printShardingStatus(true);
|
|
st.awaitBalance(coll.getName(), coll.getDB());
|
|
st.printShardingStatus(true);
|
|
|
|
st.stopBalancer();
|
|
}
|
|
|
|
function createJumboChunk(coll, keyValue) {
|
|
const largeString = "X".repeat(1024 * 1024); // 1 MB
|
|
|
|
// Create sufficient documents to create a jumbo chunk, and use the same shard key in all of
|
|
// them so that the chunk cannot be split.
|
|
let bulk = coll.initializeUnorderedBulkOp();
|
|
for (let i = 0; i < 10; i++) {
|
|
bulk.insert({x: keyValue, big: largeString, i: i});
|
|
}
|
|
assert.commandWorked(bulk.execute());
|
|
runBalancer(coll);
|
|
}
|
|
|
|
function validateJumboFlag(ns, query) {
|
|
let jumboChunk = findChunksUtil.findOneChunkByNs(configDB, ns, query);
|
|
assert.eq(jumboChunk.jumbo, true);
|
|
}
|
|
|
|
// Initializing test database
|
|
assert.commandWorked(adminDB.runCommand({enableSharding: "test", primaryShard: st.shard0.shardName}));
|
|
assert.commandWorked(adminDB.runCommand({addShardToZone: st.shard1.shardName, zone: "ZoneShard1"}));
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// Ranged shard key
|
|
let testNs = testColl.getFullName();
|
|
|
|
assert.commandWorked(adminDB.runCommand({shardCollection: testNs, key: {x: 1}}));
|
|
assert.commandWorked(adminDB.runCommand({split: testNs, middle: {x: 0}}));
|
|
|
|
createJumboChunk(testColl, 0);
|
|
validateJumboFlag(testNs, {min: {x: 0}});
|
|
let jumboChunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: 0}});
|
|
let jumboMajorVersionBefore = jumboChunk.lastmod.getTime();
|
|
|
|
// Target non-jumbo chunk should not affect real jumbo chunk.
|
|
assert.commandWorked(adminDB.runCommand({clearJumboFlag: testNs, find: {x: -1}}));
|
|
jumboChunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: 0}});
|
|
assert(jumboChunk.jumbo, tojson(jumboChunk));
|
|
assert.eq(jumboMajorVersionBefore, jumboChunk.lastmod.getTime());
|
|
|
|
// Target real jumbo chunk should bump version.
|
|
assert.commandWorked(adminDB.runCommand({clearJumboFlag: testNs, find: {x: 1}}));
|
|
jumboChunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: 0}});
|
|
assert(!jumboChunk.jumbo, tojson(jumboChunk));
|
|
assert.lt(jumboMajorVersionBefore, jumboChunk.lastmod.getTime());
|
|
|
|
// Delete all documents
|
|
assert.commandWorked(testColl.deleteMany({x: 0}));
|
|
let docCount = assert.commandWorked(adminDB.runCommand({count: testNs}));
|
|
assert.eq(docCount.n, 0);
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// Hashed shard key
|
|
testNs = hashedTestColl.getFullName();
|
|
|
|
assert.commandWorked(adminDB.runCommand({shardCollection: testNs, key: {x: "hashed"}}));
|
|
|
|
createJumboChunk(hashedTestColl, -1);
|
|
validateJumboFlag(testNs, {min: {x: 0}});
|
|
|
|
jumboChunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: 0}});
|
|
jumboMajorVersionBefore = jumboChunk.lastmod.getTime();
|
|
|
|
// Target non-jumbo chunk should not affect real jumbo chunk.
|
|
let unrelatedChunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: MinKey}});
|
|
assert.commandWorked(adminDB.runCommand({clearJumboFlag: testNs, bounds: [unrelatedChunk.min, unrelatedChunk.max]}));
|
|
jumboChunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: 0}});
|
|
assert(jumboChunk.jumbo, tojson(jumboChunk));
|
|
assert.eq(jumboMajorVersionBefore, jumboChunk.lastmod.getTime());
|
|
|
|
// Target real jumbo chunk should bump version.
|
|
assert.commandWorked(adminDB.runCommand({clearJumboFlag: testNs, bounds: [jumboChunk.min, jumboChunk.max]}));
|
|
jumboChunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: 0}});
|
|
assert(!jumboChunk.jumbo, tojson(jumboChunk));
|
|
assert.lt(jumboMajorVersionBefore, jumboChunk.lastmod.getTime());
|
|
|
|
// Ensure clear jumbo flag stores the correct chunk version
|
|
assert.eq(undefined, jumboChunk.lastmodEpoch);
|
|
assert.eq(undefined, jumboChunk.lastmodTimestamp);
|
|
|
|
// Delete all documents
|
|
assert.commandWorked(hashedTestColl.deleteMany({x: 0}));
|
|
docCount = assert.commandWorked(adminDB.runCommand({count: testNs}));
|
|
assert.eq(docCount.n, 0);
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// Balancer with jumbo chunks behavior
|
|
// Forces a jumbo chunk to be on a wrong zone but balancer shouldn't be able to move it until
|
|
// jumbo flag is cleared.
|
|
testNs = testColl.getFullName();
|
|
|
|
st.stopBalancer();
|
|
|
|
assert.commandWorked(
|
|
adminDB.runCommand({updateZoneKeyRange: testNs, min: {x: 0}, max: {x: MaxKey}, zone: "ZoneShard1"}),
|
|
);
|
|
|
|
createJumboChunk(testColl, 0);
|
|
validateJumboFlag(testNs, {min: {x: 0}});
|
|
|
|
let chunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: 0}});
|
|
assert(chunk.jumbo, tojson(chunk));
|
|
assert.eq(st.shard0.shardName, chunk.shard);
|
|
|
|
st.forEachConfigServer((conn) => {
|
|
assert.commandWorked(conn.adminCommand({setParameter: 1, balancerMigrationsThrottlingMs: 200}));
|
|
});
|
|
|
|
runBalancer(testColl);
|
|
|
|
// Verify chunk stays in shard0
|
|
chunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: 0}});
|
|
assert.eq(st.shard0.shardName, chunk.shard);
|
|
|
|
// Delete all documents
|
|
assert.commandWorked(testColl.deleteMany({x: 0}));
|
|
docCount = assert.commandWorked(adminDB.runCommand({count: testNs}));
|
|
assert.eq(docCount.n, 0);
|
|
|
|
// Clear jumbo flag
|
|
assert.commandWorked(adminDB.runCommand({clearJumboFlag: testNs, find: {x: 0}}));
|
|
chunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: 0}});
|
|
assert(!jumboChunk.jumbo, tojson(jumboChunk));
|
|
|
|
runBalancer(testColl);
|
|
|
|
// Verify chunk is moved to shard1
|
|
chunk = findChunksUtil.findOneChunkByNs(configDB, testNs, {min: {x: 0}});
|
|
assert.eq(st.shard1.shardName, chunk.shard);
|
|
|
|
st.stop();
|