summaryrefslogtreecommitdiff
path: root/jstests/replsets/resync_with_write_load.js
blob: 392c7254bc5a410b9c6d405e6821ab7e2a3308ab (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
/**
 * This test creates a 2 node replica set and then puts load on the primary with writes during 
 * the resync in order to verify that all phases of the initial sync work correctly.
 * 
 * We cannot test each phase of the initial sync directly but by providing constant writes we can 
 * assume that each individual phase will have data to work with, and therefore tested.
 */
var testName = "resync_with_write_load";
var replTest = new ReplSetTest({name: testName, nodes: 3, oplogSize: 100});
var nodes = replTest.nodeList();

var conns = replTest.startSet();
var config = { "_id": testName,
               "members": [
                            {"_id": 0, "host": nodes[0], priority:4},
                            {"_id": 1, "host": nodes[1]},
                            {"_id": 2, "host": nodes[2]}]
              };
var r = replTest.initiate(config);
replTest.waitForState(replTest.nodes[0], ReplSetTest.State.PRIMARY, 60 * 1000);
// Make sure we have a master
var master = replTest.getPrimary();
var a_conn = conns[0];
var b_conn = conns[1];
a_conn.setSlaveOk();
b_conn.setSlaveOk();
var A = a_conn.getDB("test");
var B = b_conn.getDB("test");
var AID = replTest.getNodeId(a_conn);
var BID = replTest.getNodeId(b_conn);

assert(master == conns[0], "conns[0] assumed to be master");
assert(a_conn.host == master.host);

// create an oplog entry with an insert
assert.writeOK( A.foo.insert({ x: 1 }, { writeConcern: { w: 1, wtimeout: 60000 }}));
replTest.stop(BID);

print("******************** starting load for 30 secs *********************");
var work = function() {
                print("starting loadgen");
                var start=new Date().getTime();
                
                assert.writeOK(db.timeToStartTrigger.insert({_id:1}));

                while (true) {
                    for (x=0; x < 100; x++) { 
                        db["a" + x].insert({a:x});
                    }
                    
                    var runTime = (new Date().getTime() - start);
                    if (runTime > 30000) 
                        break; 
                    else if (runTime < 5000) // back-off more during first 2 seconds
                        sleep(50);
                    else
                        sleep(1);

                } 
                print("finshing loadgen");
            };
//insert enough that resync node has to go through oplog replay in each step
var loadGen = startParallelShell(work, replTest.ports[0]);

// wait for document to appear to continue
assert.soon(function() {
    try {
        return 1 == master.getDB("test")["timeToStartTrigger"].count();
    } catch ( e ) {
        print( e );
        return false;
    }
}, "waited too long for start trigger", 90 * 1000 /* 90 secs */ );

print("*************** STARTING node without data ***************");
replTest.start(BID);
// check that it is up
assert.soon(function() {
    try {
        var result = b_conn.getDB("admin").runCommand({replSetGetStatus: 1});
        return true;
    } catch ( e ) {
        print( e );
        return false;
    }
}, "node didn't come up");

print("waiting for load generation to finish");
loadGen();

// load must stop before we await replication.
replTest.awaitReplication(60 * 1000);

// Make sure oplogs match
try {
    replTest.ensureOplogsMatch();
} catch (e) {
    var aDBHash = A.runCommand("dbhash");
    var bDBHash = B.runCommand("dbhash");
    assert.eq(aDBHash.md5, bDBHash.md5, 
              "hashes differ: " + tojson(aDBHash) + " to " + tojson(bDBHash));
}
replTest.stopSet();

print("*****test done******");