summaryrefslogtreecommitdiff
path: root/jstests/replsets/replSetGetStatus_new_term_oplog_entry_fields.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/replsets/replSetGetStatus_new_term_oplog_entry_fields.js')
-rw-r--r--jstests/replsets/replSetGetStatus_new_term_oplog_entry_fields.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/jstests/replsets/replSetGetStatus_new_term_oplog_entry_fields.js b/jstests/replsets/replSetGetStatus_new_term_oplog_entry_fields.js
new file mode 100644
index 00000000000..ec286d323bb
--- /dev/null
+++ b/jstests/replsets/replSetGetStatus_new_term_oplog_entry_fields.js
@@ -0,0 +1,64 @@
+/**
+ * Tests that the 'newTermStartDate' and 'wMajorityWriteAvailabilityDate' fields of the
+ * replSetGetStatus 'electionCandidateMetrics' section are present only when they should be.
+ */
+
+(function() {
+"use strict";
+load("jstests/libs/write_concern_util.js");
+load("jstests/replsets/rslib.js");
+
+const name = jsTestName();
+const rst = new ReplSetTest({name: name, nodes: 3});
+
+rst.startSet();
+rst.initiateWithHighElectionTimeout();
+rst.awaitReplication();
+
+stopServerReplication(rst.nodes);
+
+// Step up one of the secondaries.
+const newPrimary = rst.getSecondary();
+assert.soonNoExcept(function() {
+ assert.commandWorked(newPrimary.adminCommand({replSetStepUp: 1}));
+ rst.awaitNodesAgreeOnPrimary(rst.kDefaultTimeoutMS, rst.nodes, rst.getNodeId(newPrimary));
+ return newPrimary.adminCommand('replSetGetStatus').myState === ReplSetTest.State.PRIMARY;
+}, 'failed to step up node ' + newPrimary.host, rst.kDefaultTimeoutMS);
+
+// Wait until the new primary completes the transition to primary and writes a no-op.
+assert.eq(rst.getPrimary(), newPrimary);
+
+// Check that the 'electionCandidateMetrics' section of the replSetGetStatus response has the
+// 'newTermStartDate' field once the transition to primary is complete.
+let res = assert.commandWorked(newPrimary.adminCommand({replSetGetStatus: 1}));
+assert(res.electionCandidateMetrics,
+ () => "Response should have an 'electionCandidateMetrics' field: " + tojson(res));
+assert(res.electionCandidateMetrics.newTermStartDate,
+ () => "Response should have an 'electionCandidateMetrics.newTermStartDate' field: " +
+ tojson(res.electionCandidateMetrics));
+
+// Check that the 'electionCandidateMetrics' section of the replSetGetStatus response does not have
+// the 'wMajorityWriteAvailabilityDate' field before the new term oplog entry has been replicated.
+assert(
+ !res.electionCandidateMetrics.wMajorityWriteAvailabilityDate,
+ () =>
+ "Response should not have an 'electionCandidateMetrics.wMajorityWriteAvailabilityDate' field: " +
+ tojson(res.electionCandidateMetrics));
+
+restartReplSetReplication(rst);
+rst.awaitLastOpCommitted();
+
+// Check that the 'electionCandidateMetrics' section of the replSetGetStatus response has the
+// 'wMajorityWriteAvailabilityDate' field once the new term oplog entry is in the committed
+// snapshot.
+res = assert.commandWorked(newPrimary.adminCommand({replSetGetStatus: 1}));
+assert(res.electionCandidateMetrics,
+ () => "Response should have an 'electionCandidateMetrics' field: " + tojson(res));
+assert(
+ res.electionCandidateMetrics.wMajorityWriteAvailabilityDate,
+ () =>
+ "Response should have an 'electionCandidateMetrics.wMajorityWriteAvailabilityDate' field: " +
+ tojson(res.electionCandidateMetrics));
+
+rst.stopSet();
+})();