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
|
//
// Utility functions for multi-version replica sets
//
ReplSetTest.prototype.upgradeSet = function( binVersion, options ){
options = options || {}
if( options.primaryStepdown == undefined ) options.primaryStepdown = true
var nodes = this.nodes
var primary = this.getPrimary()
// Upgrade secondaries first
var nodesToUpgrade = this.getSecondaries()
// Then upgrade primaries
nodesToUpgrade.push( primary )
// We can upgrade with no primary downtime if we have enough nodes
var noDowntimePossible = nodes.length > 2
for( var i = 0; i < nodesToUpgrade.length; i++ ){
var node = nodesToUpgrade[ i ]
if( node == primary && options.primaryStepdown ){
node = this.stepdown( node )
primary = this.getPrimary()
}
var prevPrimaryId = this.getNodeId( primary )
if( options.custom ){
options.custom.binVersion = binVersion;
for( var nodeName in this.nodeOptions ){
this.nodeOptions[ nodeName ] = options.custom
}
}
this.upgradeNode( node, binVersion, true, options )
if( noDowntimePossible )
assert.eq( this.getNodeId( primary ), prevPrimaryId )
}
}
ReplSetTest.prototype.upgradeNode = function( node, binVersion, waitForState, options ){
var node;
if (options.custom) {
node = this.restart( node, options.custom );
} else {
node = this.restart( node, { binVersion : binVersion } );
}
if (options.auth) {
// Hardcode admin database, because otherwise can't get repl set status
node.getDB("admin").auth(options.auth);
}
// By default, wait for primary or secondary state
if( waitForState == undefined ) waitForState = true
if( waitForState == true ) waitForState = [ ReplSetTest.State.PRIMARY,
ReplSetTest.State.SECONDARY,
ReplSetTest.State.ARBITER ]
if( waitForState )
this.waitForState( node, waitForState )
return node
}
ReplSetTest.prototype.stepdown = function( nodeId ){
nodeId = this.getNodeId( nodeId )
assert.eq( this.getNodeId( this.getPrimary() ), nodeId )
var node = this.nodes[ nodeId ]
try {
node.getDB("admin").runCommand({ replSetStepDown: 50, force : true })
assert( false )
}
catch( e ){
printjson( e );
}
return this.reconnect( node )
}
ReplSetTest.prototype.reconnect = function( node ){
var nodeId = this.getNodeId( node )
this.nodes[ nodeId ] = new Mongo( node.host )
// TODO
var except = {}
for( var i in node ){
if( typeof( node[i] ) == "function" ) continue
this.nodes[ nodeId ][ i ] = node[ i ]
}
return this.nodes[ nodeId ]
}
|