summaryrefslogtreecommitdiff
path: root/jstests/sharding
diff options
context:
space:
mode:
authorVesselina Ratcheva <vesselina.ratcheva@10gen.com>2022-09-13 19:37:06 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-09-13 20:33:24 +0000
commit82b02c5b81bdd721600e1f571b3b459a410c753b (patch)
treeb5960d21e00f4a7530c54041380dc9c21f061891 /jstests/sharding
parent5135c8e1b640ac0e8ac5cda714ff17e084a107ec (diff)
downloadmongo-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.js63
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();
+})();