summaryrefslogtreecommitdiff
path: root/jstests/multiVersion/minor_version_upgrade_replset.js
blob: a0dffdf776e86268a881578ffb1fc543b74f6653 (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
//
// Tests upgrading a replica set
//

load('./jstests/multiVersion/libs/multi_rs.js');
load('./jstests/libs/test_background_ops.js');

var oldVersion = "last-lts";

var nodes = {
    n1: {binVersion: oldVersion},
    n2: {binVersion: oldVersion},
    a3: {binVersion: oldVersion}
};

var rst = new ReplSetTest({nodes: nodes});

rst.startSet();
rst.initiate();

// Wait for a primary node...
var primary = rst.getPrimary();
var otherOpConn = new Mongo(rst.getURL());
var insertNS = "test.foo";

jsTest.log("Starting parallel operations during upgrade...");

function findAndInsert(rsURL, coll) {
    var coll = new Mongo(rsURL).getCollection(coll + "");
    var count = 0;

    jsTest.log("Starting finds and inserts...");

    while (!isFinished()) {
        try {
            assert.commandWorked(coll.insert({_id: count, hello: "world"}));
            assert.neq(null, coll.findOne({_id: count}));
        } catch (e) {
            printjson(e);
        }

        count++;
    }

    jsTest.log("Finished finds and inserts...");
    return count;
}

var joinFindInsert =
    startParallelOps(primary,  // The connection where the test info is passed and stored
                     findAndInsert,
                     [rst.getURL(), insertNS]);

jsTest.log("Upgrading replica set...");

rst.upgradeSet({binVersion: "latest"});

jsTest.log("Replica set upgraded.");

// We save a reference to the old primary so that we can call reconnect() on it before
// joinFindInsert() would attempt to send the node an update operation that signals the parallel
// shell running the background operations to stop.
var oldPrimary = primary;

// Wait for primary
var primary = rst.getPrimary();

printjson(rst.status());

// Allow more valid writes to go through
sleep(10 * 1000);

// Since the old primary was restarted as part of the upgrade process, we explicitly reconnect to it
// so that sending it an update operation silently fails with an unchecked NotWritablePrimary error
// rather than a network error.
reconnect(oldPrimary.getDB("admin"));
joinFindInsert();

var totalInserts = primary.getCollection(insertNS).find().sort({_id: -1}).next()._id + 1;
var dataFound = primary.getCollection(insertNS).count();

jsTest.log("Found " + dataFound + " docs out of " + tojson(totalInserts) + " inserted.");

assert.gt(dataFound / totalInserts, 0.5);

rst.stopSet();