diff options
Diffstat (limited to 'jstests/noPassthrough/ftdc_mirrored_reads.js')
-rw-r--r-- | jstests/noPassthrough/ftdc_mirrored_reads.js | 123 |
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(); })(); |