summaryrefslogtreecommitdiff
path: root/jstests/concurrency/fsm_workload_helpers/balancer.js
blob: bb7e023e5946440ecfd058ad7b366bd294b1aa72 (plain)
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,
    };
})();