~ubuntu-branches/ubuntu/trusty/mongodb/trusty-proposed

« back to all changes in this revision

Viewing changes to jstests/repl/pair3.js

  • Committer: Bazaar Package Importer
  • Author(s): Antonin Kral
  • Date: 2010-01-29 19:48:45 UTC
  • Revision ID: james.westby@ubuntu.com-20100129194845-8wbmkf626fwcavc9
Tags: upstream-1.3.1
ImportĀ upstreamĀ versionĀ 1.3.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// test arbitration
 
2
 
 
3
var baseName = "jstests_pair3test";
 
4
 
 
5
ismaster = function( n ) {
 
6
    var im = n.getDB( "admin" ).runCommand( { "ismaster" : 1 } );
 
7
    print( "ismaster: " + tojson( im ) );
 
8
    assert( im, "command ismaster failed" );
 
9
    return im.ismaster;
 
10
}
 
11
 
 
12
// bring up node connections before arbiter connections so that arb can forward to node when expected
 
13
connect = function() {
 
14
    if ( lp == null ) {
 
15
        lp = startMongoProgram( "mongobridge", "--port", lpPort, "--dest", "localhost:" + lPort );
 
16
    }
 
17
    if ( rp == null ) {
 
18
        rp = startMongoProgram( "mongobridge", "--port", rpPort, "--dest", "localhost:" + rPort );
 
19
    }
 
20
    if ( al == null ) {
 
21
        al = startMongoProgram( "mongobridge", "--port", alPort, "--dest", "localhost:" + aPort );
 
22
    }
 
23
    if ( ar == null ) {
 
24
        ar = startMongoProgram( "mongobridge", "--port", arPort, "--dest", "localhost:" + aPort );
 
25
    }
 
26
}
 
27
 
 
28
disconnectNode = function( mongo ) {
 
29
    if ( lp ) {
 
30
        stopMongoProgram( lpPort );
 
31
        lp = null;
 
32
    }
 
33
    if ( rp ) {
 
34
        stopMongoProgram( rpPort );
 
35
        rp = null;
 
36
    }
 
37
    if ( mongo.host.match( new RegExp( "^127.0.0.1:" + lPort + "$" ) ) ) {
 
38
        stopMongoProgram( alPort );
 
39
        al = null;
 
40
    } else if ( mongo.host.match( new RegExp( "^127.0.0.1:" + rPort + "$" ) ) ) {
 
41
        stopMongoProgram( arPort );
 
42
        ar = null;
 
43
    } else {
 
44
        assert( false, "don't know how to disconnect node: " + mongo );
 
45
    }
 
46
}
 
47
 
 
48
doTest1 = function() {
 
49
    al = ar = lp = rp = null;
 
50
    ports = allocatePorts( 7 );
 
51
    aPort = ports[ 0 ];
 
52
    alPort = ports[ 1 ];
 
53
    arPort = ports[ 2 ];
 
54
    lPort = ports[ 3 ];
 
55
    lpPort = ports[ 4 ];
 
56
    rPort = ports[ 5 ];
 
57
    rpPort = ports[ 6 ];
 
58
    
 
59
    connect();
 
60
    
 
61
    a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" );
 
62
    l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + alPort );
 
63
    r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + arPort );
 
64
 
 
65
    pair = new ReplPair( l, r, a );
 
66
 
 
67
    // normal startup
 
68
    pair.start();
 
69
    pair.waitForSteadyState();
 
70
    
 
71
    // disconnect slave
 
72
    disconnectNode( pair.slave() );
 
73
    pair.waitForSteadyState( [ 1, -3 ], pair.master().host );
 
74
    
 
75
    // disconnect master
 
76
    disconnectNode( pair.master() );
 
77
    pair.waitForSteadyState( [ -3, -3 ] );
 
78
    
 
79
    // reconnect
 
80
    connect();
 
81
    pair.waitForSteadyState();
 
82
 
 
83
    // disconnect master
 
84
    disconnectNode( pair.master() );
 
85
    pair.waitForSteadyState( [ 1, -3 ], pair.slave().host, true );
 
86
    
 
87
    // disconnect new master
 
88
    disconnectNode( pair.master() );
 
89
    pair.waitForSteadyState( [ -3, -3 ] );
 
90
    
 
91
    // reconnect
 
92
    connect();
 
93
    pair.waitForSteadyState();
 
94
    
 
95
    // disconnect slave
 
96
    disconnectNode( pair.slave() );
 
97
    pair.waitForSteadyState( [ 1, -3 ], pair.master().host );
 
98
    
 
99
    // reconnect slave
 
100
    connect();
 
101
    pair.waitForSteadyState( [ 1, 0 ], pair.master().host );
 
102
    
 
103
    // disconnect master
 
104
    disconnectNode( pair.master() );
 
105
    pair.waitForSteadyState( [ 1, -3 ], pair.slave().host, true );
 
106
    
 
107
    // reconnect old master
 
108
    connect();
 
109
    pair.waitForSteadyState( [ 1, 0 ], pair.master().host );
 
110
 
 
111
    ports.forEach( function( x ) { stopMongoProgram( x ); } );
 
112
}
 
113
 
 
114
// this time don't start connected
 
115
doTest2 = function() {
 
116
    al = ar = lp = rp = null;
 
117
    ports = allocatePorts( 7 );
 
118
    aPort = ports[ 0 ];
 
119
    alPort = ports[ 1 ];
 
120
    arPort = ports[ 2 ];
 
121
    lPort = ports[ 3 ];
 
122
    lpPort = ports[ 4 ];
 
123
    rPort = ports[ 5 ];
 
124
    rpPort = ports[ 6 ];
 
125
    
 
126
    a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" );
 
127
    l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + alPort );
 
128
    r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + arPort );
 
129
    
 
130
    pair = new ReplPair( l, r, a );
 
131
    pair.start();
 
132
    pair.waitForSteadyState( [ -3, -3 ] );
 
133
    
 
134
    startMongoProgram( "mongobridge", "--port", arPort, "--dest", "localhost:" + aPort );
 
135
 
 
136
    // there hasn't been an initial sync, no no node will become master
 
137
    
 
138
    for( i = 0; i < 10; ++i ) {
 
139
        assert( pair.isMaster( pair.right() ) == -3 && pair.isMaster( pair.left() ) == -3 );
 
140
        sleep( 500 );
 
141
    }
 
142
 
 
143
    stopMongoProgram( arPort );
 
144
 
 
145
    startMongoProgram( "mongobridge", "--port", alPort, "--dest", "localhost:" + aPort );
 
146
 
 
147
    for( i = 0; i < 10; ++i ) {
 
148
        assert( pair.isMaster( pair.right() ) == -3 && pair.isMaster( pair.left() ) == -3 );
 
149
        sleep( 500 );
 
150
    }    
 
151
 
 
152
    stopMongoProgram( alPort );
 
153
    
 
154
    // connect l and r without a
 
155
    
 
156
    startMongoProgram( "mongobridge", "--port", lpPort, "--dest", "localhost:" + lPort );
 
157
    startMongoProgram( "mongobridge", "--port", rpPort, "--dest", "localhost:" + rPort );
 
158
 
 
159
    pair.waitForSteadyState( [ 1, 0 ] );
 
160
    
 
161
    ports.forEach( function( x ) { stopMongoProgram( x ); } );    
 
162
}
 
163
 
 
164
// recover from master - master setup
 
165
doTest3 = function() {
 
166
    al = ar = lp = rp = null;
 
167
    ports = allocatePorts( 7 );
 
168
    aPort = ports[ 0 ];
 
169
    alPort = ports[ 1 ];
 
170
    arPort = ports[ 2 ];
 
171
    lPort = ports[ 3 ];
 
172
    lpPort = ports[ 4 ];
 
173
    rPort = ports[ 5 ];
 
174
    rpPort = ports[ 6 ];
 
175
    
 
176
    connect();
 
177
    
 
178
    a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" );
 
179
    l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + alPort );
 
180
    r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + arPort );
 
181
    
 
182
    pair = new ReplPair( l, r, a );
 
183
    pair.start();
 
184
    pair.waitForSteadyState();
 
185
 
 
186
    // now can only talk to arbiter
 
187
    stopMongoProgram( lpPort );
 
188
    stopMongoProgram( rpPort );
 
189
    pair.waitForSteadyState( [ 1, 1 ], null, true );
 
190
    
 
191
    // recover
 
192
    startMongoProgram( "mongobridge", "--port", lpPort, "--dest", "localhost:" + lPort );
 
193
    startMongoProgram( "mongobridge", "--port", rpPort, "--dest", "localhost:" + rPort );
 
194
    pair.waitForSteadyState( [ 1, 0 ], null, true );
 
195
 
 
196
    ports.forEach( function( x ) { stopMongoProgram( x ); } );
 
197
}
 
198
 
 
199
// check that initial sync is persistent
 
200
doTest4 = function( signal ) {
 
201
    al = ar = lp = rp = null;
 
202
    ports = allocatePorts( 7 );
 
203
    aPort = ports[ 0 ];
 
204
    alPort = ports[ 1 ];
 
205
    arPort = ports[ 2 ];
 
206
    lPort = ports[ 3 ];
 
207
    lpPort = ports[ 4 ];
 
208
    rPort = ports[ 5 ];
 
209
    rpPort = ports[ 6 ];
 
210
    
 
211
    connect();
 
212
    
 
213
    a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" );
 
214
    l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + alPort );
 
215
    r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + arPort );
 
216
    
 
217
    pair = new ReplPair( l, r, a );
 
218
    pair.start();
 
219
    pair.waitForSteadyState();
 
220
 
 
221
    pair.killNode( pair.left(), signal );
 
222
    pair.killNode( pair.right(), signal );
 
223
    stopMongoProgram( rpPort );
 
224
    stopMongoProgram( lpPort );
 
225
    
 
226
    // now can only talk to arbiter
 
227
    pair.start( true );
 
228
    pair.waitForSteadyState( [ 1, 1 ], null, true );
 
229
}
 
230
 
 
231
doTest1();
 
232
doTest2();
 
233
doTest3();
 
234
doTest4( 15 );
 
235
doTest4( 9 );