1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
'use strict';
/**
* Provides helpers for configuring the balancer.
*
* Intended for use by workloads testing sharding (i.e., workloads starting with 'sharded_').
*/
var BalancerHelper = (function() {
// Disables balancing for a given collection.
function disableBalancerForCollection(db, ns) {
assertAlways.commandWorked(
db.getSiblingDB('config').collections.update({_id: ns}, {$set: {"noBalance": true}}));
}
// Enables balancing for a given collection.
function enableBalancerForCollection(db, ns) {
assertAlways.commandWorked(
db.getSiblingDB('config').collections.update({_id: ns}, {$unset: {"noBalance": 1}}));
}
// Joins the ongoing balancer round (if enabled at all).
function joinBalancerRound(db, timeout) {
timeout = timeout || 60000;
var initialStatus = db.adminCommand({balancerStatus: 1});
var currentStatus;
assert.soon(function() {
currentStatus = db.adminCommand({balancerStatus: 1});
if (currentStatus.mode === 'off') {
// Balancer is disabled.
return true;
}
if (!friendlyEqual(currentStatus.term, initialStatus.term)) {
// A new primary of the csrs has been elected
initialStatus = currentStatus;
return false;
}
assert.gte(
currentStatus.numBalancerRounds,
initialStatus.numBalancerRounds,
'Number of balancer rounds moved back in time unexpectedly. Current status: ' +
tojson(currentStatus) + ', initial status: ' + tojson(initialStatus));
return currentStatus.numBalancerRounds > initialStatus.numBalancerRounds;
}, 'Latest balancer status: ' + tojson(currentStatus), timeout);
}
return {
disableBalancerForCollection: disableBalancerForCollection,
enableBalancerForCollection: enableBalancerForCollection,
joinBalancerRound: joinBalancerRound,
};
})();
|