Files
mongo/jstests/replsets/protocol_version_upgrade_downgrade.js
Kaloian Manassiev 3ed6635a5f SERVER-21050 Cleanup ReplSetTest
This is just a cleanup work to hide some of the private state of
ReplSetTest so it is easier to encapsulate and add new logic. Also enables
strict mode.
2015-12-08 13:05:00 -05:00

83 lines
2.6 KiB
JavaScript

load("jstests/replsets/rslib.js");
(function() {
"use strict";
var name = "protocol_version_upgrade_downgrade";
var rst = new ReplSetTest({name: name, nodes: 3});
rst.startSet();
// Initiate the replset in protocol version 0.
var conf = rst.getReplSetConfig();
conf.settings = conf.settings || { };
conf.protocolVersion = 0;
// The first node will always be the primary.
conf.members[0].priority = 1;
conf.members[1].priority = 0;
conf.members[2].priority = 0;
rst.initiate(conf);
rst.awaitSecondaryNodes();
var primary = rst.getPrimary();
var primaryColl = primary.getDB("test").coll;
// Set verbosity for replication on all nodes.
var verbosity = {
"setParameter" : 1,
"logComponentVerbosity" : {
"replication" : { "verbosity" : 3 },
}
}
primary.adminCommand(verbosity);
rst.getSecondaries().forEach(function (node) {node.adminCommand(verbosity)});
// Do a write, this will set up sync sources on secondaries.
print("do a write");
assert.writeOK(primaryColl.bar.insert({x: 1}, {writeConcern: {w: 3}}));
// Check optime format in protocol version 0, which is a Timestamp.
var res = primary.adminCommand({replSetGetStatus: 1});
assert.commandWorked(res);
// Check the optime is a Timestamp, not an OpTime { ts: Timestamp, t: int }
assert.eq(res.members[0].optime.ts, null);
//
// Upgrade protocol version
//
res = primary.adminCommand({replSetGetConfig: 1});
assert.commandWorked(res);
conf = res.config;
assert.eq(conf.protocolVersion, undefined);
// Change protocol version
conf.protocolVersion = 1;
conf.version++;
reconfig(rst, conf);
// This write may block until all nodes finish upgrade, because replSetUpdatePosition may be
// rejected by the primary for mismatched config version before secondaries get reconfig.
// This will make secondaries wait for 0.5 seconds and retry.
assert.writeOK(primaryColl.bar.insert({x: 2}, {writeConcern: {w: 3}}));
// Check optime format in protocol version 1, which is an object including the term.
res = primary.adminCommand({replSetGetStatus: 1});
assert.commandWorked(res);
assert.eq(res.members[0].optime.t, NumberLong(0));
//
// Downgrade protocol version
//
res = primary.adminCommand({replSetGetConfig: 1});
assert.commandWorked(res);
conf = res.config;
assert.eq(conf.protocolVersion, 1);
// Change protocol version
conf.protocolVersion = 0;
conf.version++;
reconfig(rst, conf);
assert.writeOK(primaryColl.bar.insert({x: 3}, {writeConcern: {w: 3}}));
// Check optime format in protocol version 0, which is a Timestamp.
res = primary.adminCommand({replSetGetStatus: 1});
assert.commandWorked(res);
assert.eq(res.members[0].optime.ts, null);
})();