mongo/jstests/sharding/balancer_window.js

104 lines
3.5 KiB
JavaScript

/**
* Tests that the balancer should not be moving chunks outside of the active window.
* The outline of the test goes like this:
* 1. Disable balancer to make sure that it will not try to move chunk on the setup phase.
* 2. Setup the sharded collections by splitting it into 16 chunks. Since none of the chunks
* are being moved, all of them will end up on a single shard.
* 3. Turn the balancer setting to on and set the active balancing window to a time that is
* outside of the current time at the same time.
* 4. Make sure that no chunks have moved for at least one balancing round.
* 5. Reset the active balancing window to a setting that overlaps the current time and make
* sure that some chunks are moved.
*/
import {ShardingTest} from "jstests/libs/shardingtest.js";
import {findChunksUtil} from "jstests/sharding/libs/find_chunks_util.js";
/**
* Simple representation for wall clock time. Hour and minutes should be integers.
*/
let HourAndMinute = function (hour, minutes) {
return {
/**
* Returns a new HourAndMinute object with the amount of hours added.
* Amount can be negative.
*/
addHour: function (amount) {
let newHour = (hour + amount) % 24;
if (newHour < 0) {
newHour += 24;
}
return new HourAndMinute(newHour, minutes);
},
/**
* Returns a string representation that is compatible with the format for the balancer
* window settings.
*/
toString: function () {
let minStr = minutes < 10 ? "0" + minutes : "" + minutes;
let hourStr = hour < 10 ? "0" + hour : "" + hour;
return hourStr + ":" + minStr;
},
};
};
const st = new ShardingTest({shards: 2, other: {chunkSize: 1}});
const dbName = "test";
const collName = "user";
const ns = dbName + "." + collName;
const configDB = st.s.getDB("config");
assert.commandWorked(configDB.adminCommand({enableSharding: dbName}));
assert.commandWorked(configDB.adminCommand({shardCollection: ns, key: {_id: 1}}));
const bigString = "X".repeat(1024 * 1024); // 1MB
const coll = st.s.getDB(dbName).getCollection(collName);
for (let x = 0; x < 150; x += 10) {
coll.insert({_id: x, s: bigString});
configDB.adminCommand({split: ns, middle: {_id: x}});
}
let shard0Chunks = findChunksUtil.findChunksByNs(configDB, ns, {shard: st.shard0.shardName}).count();
let startDate = new Date();
let hourMinStart = new HourAndMinute(startDate.getHours(), startDate.getMinutes());
assert.commandWorked(
configDB.settings.update(
{_id: "balancer"},
{
$set: {
activeWindow: {
start: hourMinStart.addHour(-2).toString(),
stop: hourMinStart.addHour(-1).toString(),
},
},
},
true,
),
);
st.startBalancer();
st.awaitBalancerRound();
let shard0ChunksAfter = findChunksUtil.findChunksByNs(configDB, ns, {shard: st.shard0.shardName}).count();
assert.eq(shard0Chunks, shard0ChunksAfter);
assert.commandWorked(
configDB.settings.update(
{_id: "balancer"},
{
$set: {
activeWindow: {start: hourMinStart.toString(), stop: hourMinStart.addHour(2).toString()},
},
},
true,
),
);
st.awaitBalancerRound();
shard0ChunksAfter = findChunksUtil.findChunksByNs(configDB, ns, {shard: st.shard0.shardName}).count();
assert.neq(shard0Chunks, shard0ChunksAfter);
st.stop();