Files
mongo/jstests/sharding/balancer_window.js
Kaloian Manassiev 42f4b98498 SERVER-24652 Expose the balancer state through serverStatus section
This change exposes some of the internal state of the balancer through
section only available on the config server. It also enables previously
disabled tests, which needed to wait for a balancer round to complete.
2016-06-20 22:15:56 -04:00

93 lines
3.6 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.
*/
(function() {
'use strict';
/**
* Simple representation for wall clock time. Hour and minutes should be integers.
*/
var HourAndMinute = function(hour, minutes) {
return {
/**
* Returns a new HourAndMinute object with the amount of hours added.
* Amount can be negative.
*/
addHour: function(amount) {
var 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() {
var minStr = (minutes < 10) ? ('0' + minutes) : ('' + minutes);
var hourStr = (hour < 10) ? ('0' + hour) : ('' + hour);
return hourStr + ':' + minStr;
}
};
};
var st = new ShardingTest({shards: 2});
var configDB = st.s.getDB('config');
assert.commandWorked(configDB.adminCommand({enableSharding: 'test'}));
assert.commandWorked(configDB.adminCommand({shardCollection: 'test.user', key: {_id: 1}}));
for (var x = 0; x < 150; x += 10) {
configDB.adminCommand({split: 'test.user', middle: {_id: x}});
}
var shard0Chunks = configDB.chunks.find({ns: 'test.user', shard: 'shard0000'}).count();
var startDate = new Date();
var hourMinStart = new HourAndMinute(startDate.getHours(), startDate.getMinutes());
assert.writeOK(configDB.settings.update({_id: 'balancer'},
{
$set: {
activeWindow: {
start: hourMinStart.addHour(-2).toString(),
stop: hourMinStart.addHour(-1).toString()
},
}
},
true));
st.startBalancer();
st.awaitBalancerRound();
var shard0ChunksAfter = configDB.chunks.find({ns: 'test.user', shard: 'shard0000'}).count();
assert.eq(shard0Chunks, shard0ChunksAfter);
assert.writeOK(configDB.settings.update(
{_id: 'balancer'},
{
$set: {
activeWindow:
{start: hourMinStart.toString(), stop: hourMinStart.addHour(2).toString()}
}
},
true));
st.awaitBalancerRound();
shard0ChunksAfter = configDB.chunks.find({ns: 'test.user', shard: 'shard0000'}).count();
assert.neq(shard0Chunks, shard0ChunksAfter);
st.stop();
})();