diff options
author | Vesselina Ratcheva <vesselina.ratcheva@10gen.com> | 2022-09-13 19:37:06 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-09-13 20:33:24 +0000 |
commit | 82b02c5b81bdd721600e1f571b3b459a410c753b (patch) | |
tree | b5960d21e00f4a7530c54041380dc9c21f061891 /jstests/sharding | |
parent | 5135c8e1b640ac0e8ac5cda714ff17e084a107ec (diff) | |
download | mongo-82b02c5b81bdd721600e1f571b3b459a410c753b.tar.gz |
SERVER-66030 Add targeted test for startup recovery on a config server replica set
Diffstat (limited to 'jstests/sharding')
-rw-r--r-- | jstests/sharding/live_shard_startup_recovery_config_server.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/jstests/sharding/live_shard_startup_recovery_config_server.js b/jstests/sharding/live_shard_startup_recovery_config_server.js new file mode 100644 index 00000000000..7f546499a09 --- /dev/null +++ b/jstests/sharding/live_shard_startup_recovery_config_server.js @@ -0,0 +1,63 @@ +/** + * Tests that sharding state is properly initialized on config servers that undergo startup + * recovery. + * + * @tags: [requires_persistence] + */ + +(function() { +"use strict"; + +load("jstests/replsets/rslib.js"); // For getLatestOp() +load("jstests/sharding/libs/sharding_state_test.js"); + +const st = new ShardingTest({ + config: 1, + shards: {rs0: {nodes: 1}}, + useHostname: false, +}); +const configRS = st.configRS; +let primary = configRS.getPrimary(); + +jsTestLog("Adding shards so we can force startup recovery on the config primary"); +const rs1 = new ReplSetTest({name: "newShard1", host: 'localhost', nodes: 1}); +rs1.startSet({shardsvr: ""}); +rs1.initiate(); + +assert.commandWorked(st.s.adminCommand({addShard: rs1.getURL(), name: "newShard1"})); + +const ts = getLatestOp(primary).ts; +configureFailPoint(primary, 'holdStableTimestampAtSpecificTimestamp', {timestamp: ts}); + +const rs2 = new ReplSetTest({name: "newShard2", host: 'localhost', nodes: 1}); +rs2.startSet({shardsvr: ""}); +rs2.initiate(); + +assert.commandWorked(st.s.adminCommand({addShard: rs2.getURL(), name: "newShard2"})); + +jsTestLog("Restarting node. It should go into startup recovery."); +configRS.restart(primary); +configRS.waitForState(primary, ReplSetTest.State.PRIMARY); + +jsTestLog("Ensuring node is up as a primary and checking sharding state"); +ShardingStateTest.failoverToMember(configRS, primary); +ShardingStateTest.checkShardingState(st); + +jsTestLog("Adding another shard to check state"); + +const rs3 = new ReplSetTest({name: "newShard3", host: 'localhost', nodes: 1}); +rs3.startSet({shardsvr: ""}); +rs3.initiate(); + +assert.commandWorked(st.s.adminCommand({addShard: rs3.getURL(), name: "newShard3"})); + +const shards = primary.getDB("config").getCollection("shards").find().toArray(); +assert.eq(4, shards.length, () => tojson(shards)); + +jsTestLog("Done with test"); + +st.stop(); +rs1.stopSet(); +rs2.stopSet(); +rs3.stopSet(); +})(); |