File: multi_rs.js

package info (click to toggle)
mongodb 1%3A2.4.10-5
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 82,464 kB
  • sloc: cpp: 740,225; ansic: 152,098; sh: 13,820; python: 11,864; makefile: 1,012; perl: 922; pascal: 617; java: 452; lisp: 222; asm: 174
file content (90 lines) | stat: -rw-r--r-- 2,480 bytes parent folder | download | duplicates (3)
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
//
// 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 ]
}