summaryrefslogtreecommitdiff
path: root/jstests/replsets/slavedelay1.js
blob: ae97d3373bcf2c46a247c091bdae2d9467897048 (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
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);