diff options
author | Max Hirschhorn <max.hirschhorn@mongodb.com> | 2019-02-11 18:52:28 -0500 |
---|---|---|
committer | Max Hirschhorn <max.hirschhorn@mongodb.com> | 2019-02-11 18:52:28 -0500 |
commit | e4f593b3dee7808d27c9db54c517ab198f5d9f89 (patch) | |
tree | 2f2a20a2008bed44a29aa3bb227def0d25ade0b9 /jstests | |
parent | 8a02cc431f30168a80b22f109f6430761858734d (diff) | |
download | mongo-e4f593b3dee7808d27c9db54c517ab198f5d9f89.tar.gz |
SERVER-35551 Avoid restarting mongobridge processes.
Changes ReplSetTest, RollbackTest, and RollbackTestDeluxe to avoid
restarting the mongobridge process associated with the mongod process
being restarted. This ensures that any partitioning which has been
configured remains intact after the server is restarted.
Diffstat (limited to 'jstests')
-rw-r--r-- | jstests/noPassthrough/restart_node_with_bridge.js | 57 | ||||
-rw-r--r-- | jstests/replsets/libs/rollback_test.js | 2 | ||||
-rw-r--r-- | jstests/replsets/libs/rollback_test_deluxe.js | 2 |
3 files changed, 51 insertions, 10 deletions
diff --git a/jstests/noPassthrough/restart_node_with_bridge.js b/jstests/noPassthrough/restart_node_with_bridge.js index 1774ce50167..004b595a208 100644 --- a/jstests/noPassthrough/restart_node_with_bridge.js +++ b/jstests/noPassthrough/restart_node_with_bridge.js @@ -1,23 +1,64 @@ /** - * Tests that a node can be successfully restarted when the bridge is enabled. + * Tests that a node can be successfully restarted when the bridge is enabled. Also verifies the + * bridge configuration is left intact even after the node is restarted. + * * @tags: [requires_persistence, requires_replication] */ (function() { "use strict"; - const name = "restart_node_with_bridge"; - const rst = new ReplSetTest({name: name, nodes: 1, useBridge: true}); + load("jstests/replsets/rslib.js"); // for reconnect + + const rst = new ReplSetTest({ + nodes: [{}, {rsConfig: {priority: 0, votes: 0}}], + useBridge: true, + }); + rst.startSet(); rst.initiate(); rst.awaitNodesAgreeOnPrimary(); - let primary = rst.getPrimary(); - assert.commandWorked(primary.getDB("test").getCollection(name).insert({_id: 1})); + const primary = rst.getPrimary(); + const secondary = rst.getSecondary(); + + const primaryDB = primary.getDB("test"); + const primaryColl = primaryDB.getCollection("restart_node_with_bridge"); + + function assertWriteReplicates() { + assert.commandWorked(primaryColl.update( + {_id: 0}, {$inc: {counter: 1}}, {upsert: true, writeConcern: {w: 2}})); + } + + function assertWriteFailsToReplicate() { + assert.commandFailedWithCode( + primaryColl.update( + {_id: 0}, {$inc: {counter: 1}}, {writeConcern: {w: 2, wtimeout: 1000}}), + ErrorCodes.WriteConcernFailed); + } + // By default, the primary should be connected to the secondary. Replicating a write should + // therefore succeed. + assertWriteReplicates(); + + // We disconnect the primary from the secondary and verify that replicating a write fails. + primary.disconnect(secondary); + assertWriteFailsToReplicate(); + + // We restart the secondary and verify that replicating a write still fails. + rst.restart(secondary); + assertWriteFailsToReplicate(); + + // We restart the primary and verify that replicating a write still fails. rst.restart(primary); - rst.awaitNodesAgreeOnPrimary(); - primary = rst.getPrimary(); - assert.eq(primary.getDB("test").getCollection(name).count({_id: 1}), 1); + rst.getPrimary(); + // Note that we specify 'primaryDB' to avoid having reconnect() send a message directly to the + // mongod process rather than going through the mongobridge process as well. + reconnect(primaryDB); + assertWriteFailsToReplicate(); + + // We reconnect the primary to the secondary and verify that replicating a write succeeds. + primary.reconnect(secondary); + assertWriteReplicates(); rst.stopSet(); }()); diff --git a/jstests/replsets/libs/rollback_test.js b/jstests/replsets/libs/rollback_test.js index 41717a664cd..a7db988e0e7 100644 --- a/jstests/replsets/libs/rollback_test.js +++ b/jstests/replsets/libs/rollback_test.js @@ -396,7 +396,7 @@ function RollbackTest(name = "RollbackTest", replSet) { } log(`Stopping node ${hostName} with signal ${signal}`); - rst.stop(nodeId, signal, opts); + rst.stop(nodeId, signal, opts, {forRestart: true}); log(`Restarting node ${hostName}`); rst.start(nodeId, {}, true /* restart */); diff --git a/jstests/replsets/libs/rollback_test_deluxe.js b/jstests/replsets/libs/rollback_test_deluxe.js index 0c4cb988dfc..b3b85de152d 100644 --- a/jstests/replsets/libs/rollback_test_deluxe.js +++ b/jstests/replsets/libs/rollback_test_deluxe.js @@ -572,7 +572,7 @@ function RollbackTestDeluxe(name = "FiveNodeDoubleRollbackTest", replSet) { } log(`Stopping node ${hostName} with signal ${signal}`); - rst.stop(nodeId, signal, opts); + rst.stop(nodeId, signal, opts, {forRestart: true}); log(`Restarting node ${hostName}`); const restart = true; |