summaryrefslogtreecommitdiff
path: root/jstests/replsets/maxSyncSourceLagSecs.js
blob: 8d44dd5ddb211ac6842b6c8d946d9963341262d1 (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
54
// Test that setting maxSyncSourceLagSecs causes the set to change sync target
//
// This test requires the fsync command to ensure members experience a delay.
// @tags: [requires_fsync]
(function() {
    "use strict";
    var name = "maxSyncSourceLagSecs";
    var replTest = new ReplSetTest({name: name,
                                    nodes: 3,
                                    oplogSize: 5,
                                    nodeOptions: {setParameter: "maxSyncSourceLagSecs=3"}});
    var nodes = replTest.nodeList();
    replTest.startSet();
    replTest.initiate({"_id": name,
                       "members": [
                           { "_id": 0, "host": nodes[0], priority: 3 },
                           { "_id": 1, "host": nodes[1], priority: 0 },
                           { "_id": 2, "host": nodes[2], priority: 0 }],
                      });

    var master = replTest.getPrimary();
    master.getDB("foo").bar.save({a: 1});
    replTest.awaitReplication();
    var slaves = replTest.liveNodes.slaves;

    // need to put at least maxSyncSourceLagSecs b/w first op and subsequent ops
    // so that the shouldChangeSyncSource logic goes into effect
    sleep(4000);

    jsTestLog("Setting sync target of slave 2 to slave 1");
    assert.commandWorked(slaves[1].getDB("admin").runCommand({replSetSyncFrom: slaves[0].name}));
    assert.soon(function() {
            var res = slaves[1].getDB("admin").runCommand({"replSetGetStatus": 1});
            return res.syncingTo === slaves[0].name;
        }, "sync target not changed to other slave");
    printjson(replTest.status());

    jsTestLog("Lock slave 1 and add some docs. Force sync target for slave 2 to change to primary");
    assert.commandWorked(slaves[0].getDB("admin").runCommand({fsync:1, lock: 1}));
    master.getDB("foo").bar.save({a: 2});

    assert.soon(function() {
            var res = slaves[1].getDB("admin").runCommand({"replSetGetStatus": 1});
            return res.syncingTo === master.name;
        }, "sync target not changed back to primary");
    printjson(replTest.status());

    assert.soon(function() {
            return (slaves[1].getDB("foo").bar.count() === 2);
        }, "slave should have caught up after syncing to primary.");

    assert.commandWorked(slaves[0].getDB("admin").fsyncUnlock());
    replTest.stopSet();
}());