summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/ftdc_mirrored_reads.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/noPassthrough/ftdc_mirrored_reads.js')
-rw-r--r--jstests/noPassthrough/ftdc_mirrored_reads.js123
1 files changed, 67 insertions, 56 deletions
diff --git a/jstests/noPassthrough/ftdc_mirrored_reads.js b/jstests/noPassthrough/ftdc_mirrored_reads.js
index 8d998d91414..613fe6ca5e2 100644
--- a/jstests/noPassthrough/ftdc_mirrored_reads.js
+++ b/jstests/noPassthrough/ftdc_mirrored_reads.js
@@ -3,6 +3,7 @@
*
* @tags: [
* requires_replication,
+ * requires_fcv_62
* ]
*/
load('jstests/libs/ftdc.js');
@@ -18,6 +19,7 @@ const rst = new ReplSetTest({nodes: 3});
rst.startSet();
rst.initiateWithHighElectionTimeout();
const primary = rst.getPrimary();
+const secondaries = rst.getSecondaries();
function getMirroredReadsStats(node) {
return node.getDB(kDbName).serverStatus({mirroredReads: 1}).mirroredReads;
@@ -30,21 +32,13 @@ function getDiagnosticData(node) {
return stats.mirroredReads;
}
-function waitForSecondariesToReceiveMirroredReads() {
- const mirroredReadsSent = getMirroredReadsStats(primary).sent;
- assert.soon(() => {
- jsTestLog("Verifying that secondaries received " + mirroredReadsSent +
- " mirrored operations");
- const secondaries = rst.getSecondaries();
- // The reads received across all secondaries.
- let readsReceived = 0;
- for (let i = 0; i < secondaries.length; i++) {
- const stats = getMirroredReadsStats(secondaries[i]);
- jsTestLog("Secondary " + secondaries[i] + " metrics: " + tojson(stats));
- readsReceived += stats.received;
- }
- return readsReceived == mirroredReadsSent;
- });
+function getMirroredReadsProcessedAsSecondary() {
+ let readsProcessed = 0;
+ for (let i = 0; i < secondaries.length; i++) {
+ const stats = getMirroredReadsStats(secondaries[i]);
+ readsProcessed += stats.processedAsSecondary;
+ }
+ return readsProcessed;
}
function waitForPrimaryToSendMirroredReads(expectedReadsSeen, expectedReadsSent) {
@@ -73,10 +67,11 @@ function sendAndCheckReads(rst) {
primary.getDB(kDbName).runCommand({find: kCollName, filter: {}});
}
+ const expectedReadsSeen = mirrorableReadsSeenBefore + kOperations;
+ const expectedReadsSent = mirroredReadsSentBefore + (2 * kOperations);
+
// Wait for primary to have sent out all mirrored reads.
- waitForPrimaryToSendMirroredReads(mirrorableReadsSeenBefore + kOperations,
- mirroredReadsSentBefore + (2 * kOperations));
- waitForSecondariesToReceiveMirroredReads();
+ waitForPrimaryToSendMirroredReads(expectedReadsSeen, expectedReadsSent);
}
function activateFailPoint(node) {
@@ -89,45 +84,61 @@ function activateFailPoint(node) {
// Mirror every mirror-able command.
assert.commandWorked(primary.adminCommand({setParameter: 1, mirrorReads: {samplingRate: 1.0}}));
+{
+ // Send and check reads with mirrorMaestroExpectsResponse failpoint disabled by default.
+ jsTestLog("Verifying diagnostic collection for mirrored reads on primary");
+ let primaryStatsBeforeReads = getDiagnosticData(primary);
+ let initialMirrorableReadsSeen = primaryStatsBeforeReads.seen;
+ // The following metrics are not included by default.
+ assert(!primaryStatsBeforeReads.hasOwnProperty('resolved'));
+ assert(!primaryStatsBeforeReads.hasOwnProperty('resolvedBreakdown'));
-jsTestLog("Verifying diagnostic collection for mirrored reads on primary");
-let statsBeforeReads = getDiagnosticData(primary);
-// The following metrics are not included by default.
-assert(!statsBeforeReads.hasOwnProperty('resolved'));
-assert(!statsBeforeReads.hasOwnProperty('resolvedBreakdown'));
-
-let initialMirrorableReadsSeen = statsBeforeReads.seen;
-sendAndCheckReads(rst);
-assert.soon(() => {
- let mirrorableReadsSeen = getDiagnosticData(primary).seen;
- jsTestLog(`Seen ${mirrorableReadsSeen} mirrored reads so far`);
- return initialMirrorableReadsSeen + kOperations <= mirrorableReadsSeen;
-}, "Failed to update FTDC metrics within time limit", 30000);
-
-jsTestLog("Verifying diagnostic collection when mirrorMaestroExpectsResponse");
-activateFailPoint(primary);
-assert.soon(() => {
- return getDiagnosticData(primary).hasOwnProperty('resolved');
-}, "Failed to find 'resolved' in mirrored reads FTDC metrics within time limit", 30000);
-let resolvedBeforeReads = getDiagnosticData(primary).resolved;
-sendAndCheckReads(rst);
-assert.soon(() => {
- let resolvedAfterReads = getDiagnosticData(primary).resolved;
- jsTestLog(`Mirrored ${resolvedAfterReads} reads so far`);
- // There are two secondaries, so `kOperations * 2` reads must be resolved.
- return resolvedBeforeReads + kOperations * 2 <= resolvedAfterReads;
-}, "Failed to update extended FTDC metrics within time limit", 10000);
-
-jsTestLog("Verifying diagnostic collection for mirrored reads on secondaries");
-assert.soon(() => {
- const mirroredReadsSent = getDiagnosticData(primary).sent;
- let mirroredReadsReceived = 0;
- for (const secondary of rst.getSecondaries()) {
- mirroredReadsReceived += getDiagnosticData(secondary).received;
- }
- jsTestLog(`Sent: ${mirroredReadsSent}, Received: ${mirroredReadsReceived}`);
- return mirroredReadsSent == Number(mirroredReadsReceived);
-}, "Failed to observe mirrored operations on secondaries in FTDC metrics", 10000);
+ sendAndCheckReads(rst);
+
+ assert.soon(() => {
+ let mirrorableReadsSeen = getDiagnosticData(primary).seen;
+ jsTestLog(`Seen ${mirrorableReadsSeen} mirrored reads so far`);
+ return initialMirrorableReadsSeen + kOperations <= mirrorableReadsSeen;
+ }, "Failed to update FTDC metrics within time limit", 30000);
+}
+
+{
+ // Send and check reads after activating mirrorMaestroExpectsResponse fail point.
+ jsTestLog("Verifying diagnostic collection when mirrorMaestroExpectsResponse");
+ activateFailPoint(primary);
+ assert.soon(() => {
+ return getDiagnosticData(primary).hasOwnProperty('resolved');
+ }, "Failed to find 'resolved' in mirrored reads FTDC metrics within time limit", 30000);
+
+ let primaryStatsBeforeReads = getDiagnosticData(primary);
+ let mirroredReadsProcessedBefore = getMirroredReadsProcessedAsSecondary();
+ let primaryResolvedBeforeReads = primaryStatsBeforeReads.resolved;
+ let primarySentBeforeReads = primaryStatsBeforeReads.sent;
+
+ sendAndCheckReads(rst);
+ assert.soon(() => {
+ let primaryResolvedAfterReads = getDiagnosticData(primary).resolved;
+ jsTestLog(`Mirrored ${primaryResolvedAfterReads} reads so far`);
+ for (let i = 0; i < secondaries.length; i++) {
+ jsTestLog("Secondary " + secondaries[i] +
+ " metrics: " + tojson(getMirroredReadsStats(secondaries[i])));
+ }
+ // There are two secondaries, so `kOperations * 2` reads must be resolved.
+ return primaryResolvedBeforeReads + kOperations * 2 <= primaryResolvedAfterReads;
+ }, "Failed to update extended FTDC metrics within time limit", 10000);
+
+ const primaryDataAfterReads = getDiagnosticData(primary);
+ const primarySentAfterReads = primaryDataAfterReads.sent;
+ const primaryResolvedAfterReads = primaryDataAfterReads.resolved;
+ assert.eq(primaryResolvedAfterReads - primaryResolvedBeforeReads,
+ primarySentAfterReads - primarySentBeforeReads,
+ primaryDataAfterReads);
+
+ jsTestLog("Verifying diagnostic collection for mirrored reads on secondaries");
+ let mirroredReadsSucceeded = getDiagnosticData(primary).succeeded;
+ let mirroredReadsProcessedAfter = getMirroredReadsProcessedAsSecondary();
+ assert.eq(mirroredReadsSucceeded, mirroredReadsProcessedAfter - mirroredReadsProcessedBefore);
+}
rst.stopSet();
})();