summaryrefslogtreecommitdiff
path: root/jstests/replsets/slavedelay1.js
blob: 040c47d3e78bb0f001ca86908d5d741ece9fc428 (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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
load("jstests/replsets/rslib.js");

doTest = function(signal) {

    var name = "slaveDelay";
    var host = getHostName();

    var replTest = new ReplSetTest({name: name, nodes: 3});

    var nodes = replTest.startSet();

    /* set slaveDelay to 30 seconds */
    var config = replTest.getReplSetConfig();
    config.members[2].priority = 0;
    config.members[2].slaveDelay = 30;

    replTest.initiate(config);

    var master = replTest.getPrimary().getDB(name);
    var slaveConns = replTest.liveNodes.slaves;
    var slaves = [];
    for (var i in slaveConns) {
        var d = slaveConns[i].getDB(name);
        slaves.push(d);
    }

    waitForAllMembers(master);

    // insert a record
    assert.writeOK(master.foo.insert({x: 1}, {writeConcern: {w: 2}}));

    var doc = master.foo.findOne();
    assert.eq(doc.x, 1);

    // make sure slave has it
    var doc = slaves[0].foo.findOne();
    assert.eq(doc.x, 1);

    // make sure delayed slave doesn't have it
    for (var i = 0; i < 8; i++) {
        assert.eq(slaves[1].foo.findOne(), null);
        sleep(1000);
    }

    // within 30 seconds delayed slave should have it
    assert.soon(function() {
        var z = slaves[1].foo.findOne();
        return z && z.x == 1;
    });

    /************* Part 2 *******************/

    // how about if we add a new server?  will it sync correctly?
    conn = replTest.add();

    config = master.getSisterDB("local").system.replset.findOne();
    printjson(config);
    config.version++;
    config.members.push({
        _id: 3,
        host: host + ":" + replTest.ports[replTest.ports.length - 1],
        priority: 0,
        slaveDelay: 30
    });

    master = reconfig(replTest, config);
    master = master.getSisterDB(name);

    // wait for the node to catch up
    replTest.awaitReplication(90 * 1000);

    assert.writeOK(master.foo.insert({_id: 123, x: 'foo'}, {writeConcern: {w: 2}}));

    for (var i = 0; i < 8; i++) {
        assert.eq(conn.getDB(name).foo.findOne({_id: 123}), null);
        sleep(1000);
    }

    assert.soon(function() {
        var z = conn.getDB(name).foo.findOne({_id: 123});
        return z != null && z.x == "foo";
    });

    /************* Part 3 ******************/

    print("reconfigure slavedelay");

    config.version++;
    config.members[3].slaveDelay = 15;

    reconfig(replTest, config);
    master = replTest.getPrimary().getDB(name);
    assert.soon(function() {
        return conn.getDB("local").system.replset.findOne().version == config.version;
    });

    // wait for node to become secondary
    assert.soon(function() {
        var result = conn.getDB("admin").isMaster();
        printjson(result);
        return result.secondary;
    });

    print("testing insert");
    master.foo.insert({_id: 124, "x": "foo"});
    assert(master.foo.findOne({_id: 124}) != null);

    for (var i = 0; i < 10; i++) {
        assert.eq(conn.getDB(name).foo.findOne({_id: 124}), null);
        sleep(1000);
    }

    // the node should have the document in 15 seconds (20 for some safety against races)
    assert.soon(function() {
        return conn.getDB(name).foo.findOne({_id: 124}) != null;
    }, 10 * 1000);

    replTest.stopSet();
};

doTest(15);