91 lines
2.4 KiB
JavaScript
91 lines
2.4 KiB
JavaScript
//
|
|
// 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 )
|
|
|
|
this.upgradeNode( node, binVersion, true )
|
|
|
|
if( noDowntimePossible )
|
|
assert.eq( this.getNodeId( primary ), prevPrimaryId )
|
|
}
|
|
}
|
|
|
|
ReplSetTest.prototype.upgradeNode = function( node, binVersion, waitForState ){
|
|
|
|
var node = this.restart( node, { binVersion : binVersion } )
|
|
|
|
// 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 ]
|
|
}
|