summaryrefslogtreecommitdiff
path: root/jstests/multiVersion/libs/multi_rs.js
blob: 73f4ff07531a66f9936f3a5a82487e6dfa536855 (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
//
// 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 ]
}