diff options
author | George Wangensteen <george.wangensteen@mongodb.com> | 2021-03-24 21:35:20 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-04-08 18:49:54 +0000 |
commit | bcd58f9b973e2a6839b40ceedb69dd245e72ab05 (patch) | |
tree | 0980b94dbe270531f6019ce07597a0870e78185b /src/mongo/db/mirror_maestro.cpp | |
parent | f1ac83b03c330d1ef59dd13e55aeddf3c6d41b4b (diff) | |
download | mongo-bcd58f9b973e2a6839b40ceedb69dd245e72ab05.tar.gz |
SERVER-53479 Wait for mirrored operations in mirror_reads.js
Diffstat (limited to 'src/mongo/db/mirror_maestro.cpp')
-rw-r--r-- | src/mongo/db/mirror_maestro.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/mongo/db/mirror_maestro.cpp b/src/mongo/db/mirror_maestro.cpp index 46d645e3c10..14eb37427a5 100644 --- a/src/mongo/db/mirror_maestro.cpp +++ b/src/mongo/db/mirror_maestro.cpp @@ -72,8 +72,10 @@ constexpr auto kMirroredReadsSeenKey = "seen"_sd; constexpr auto kMirroredReadsSentKey = "sent"_sd; constexpr auto kMirroredReadsResolvedKey = "resolved"_sd; constexpr auto kMirroredReadsResolvedBreakdownKey = "resolvedBreakdown"_sd; +constexpr auto kMirroredReadsPendingKey = "pending"_sd; MONGO_FAIL_POINT_DEFINE(mirrorMaestroExpectsResponse); +MONGO_FAIL_POINT_DEFINE(mirrorMaestroTracksPending); class MirrorMaestroImpl { public: @@ -186,7 +188,9 @@ public: section.append(kMirroredReadsResolvedKey, resolved.loadRelaxed()); section.append(kMirroredReadsResolvedBreakdownKey, resolvedBreakdown.toBSON()); } - + if (MONGO_unlikely(mirrorMaestroTracksPending.shouldFail())) { + section.append(kMirroredReadsPendingKey, pending.loadRelaxed()); + } return section.obj(); }; @@ -227,6 +231,8 @@ public: AtomicWord<CounterT> seen; AtomicWord<CounterT> sent; AtomicWord<CounterT> resolved; + // Counts the number of operations that are scheduled to be mirrored, but haven't yet been sent. + AtomicWord<CounterT> pending; } gMirroredReadsSection; auto parseMirroredReadsParameters(const BSONObj& obj) { @@ -330,9 +336,20 @@ void MirrorMaestroImpl::tryMirror(std::shared_ptr<CommandInvocation> invocation) // building new bsons and evaluating randomness in a less important context. auto requestState = std::make_unique<MirroredRequestState>( this, std::move(hosts), std::move(invocation), std::move(params)); + if (MONGO_unlikely(mirrorMaestroTracksPending.shouldFail())) { + // We've scheduled the operation to be mirrored; it is now "pending" until it has actually + // been sent to a secondary. + gMirroredReadsSection.pending.fetchAndAdd(1); + } ExecutorFuture(_executor) // .getAsync([clientExecutorHandle, requestState = std::move(requestState)](const auto& status) mutable { + ON_BLOCK_EXIT([&] { + if (MONGO_unlikely(mirrorMaestroTracksPending.shouldFail())) { + // The read has been sent to at least one secondary, so it's no longer pending + gMirroredReadsSection.pending.fetchAndSubtract(1); + } + }); if (!ErrorCodes::isShutdownError(status)) { invariant(status.isOK()); requestState->mirror(); |