summaryrefslogtreecommitdiff
path: root/src/mongo/db/mirroring_sampler.cpp
diff options
context:
space:
mode:
authorAmirsaman Memaripour <amirsaman.memaripour@mongodb.com>2020-04-03 19:05:31 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-04-16 19:08:39 +0000
commitb483650696b6d67dd3c651b3e8cd2926d3776ff3 (patch)
tree7e4ec32598bebaa914517b264f4b331130e4c1ed /src/mongo/db/mirroring_sampler.cpp
parent6ad41d820bc3827aa295c37f14ef0420f44d3f8a (diff)
downloadmongo-b483650696b6d67dd3c651b3e8cd2926d3776ff3.tar.gz
SERVER-46514 Normalize host selection for mirrored reads
Diffstat (limited to 'src/mongo/db/mirroring_sampler.cpp')
-rw-r--r--src/mongo/db/mirroring_sampler.cpp25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/mongo/db/mirroring_sampler.cpp b/src/mongo/db/mirroring_sampler.cpp
index c8dfab63e5a..e6699db0b9a 100644
--- a/src/mongo/db/mirroring_sampler.cpp
+++ b/src/mongo/db/mirroring_sampler.cpp
@@ -63,9 +63,28 @@ MirroringSampler::SamplingParameters::SamplingParameters(const double ratio,
return std::move(rnd)();
}()) {}
-bool MirroringSampler::shouldSample(const SamplingParameters& params) const noexcept {
+bool MirroringSampler::shouldSample(const std::shared_ptr<const repl::IsMasterResponse>& imr,
+ const SamplingParameters& params) const noexcept {
+ if (!imr) {
+ // If we don't have an IsMasterResponse, we can't know where to send our mirrored request.
+ return false;
+ }
+
+ const auto secondariesCount = imr->getHosts().size() - 1;
+ if (!imr->isMaster() || secondariesCount < 1) {
+ // If this is not the primary, or there are no eligible secondaries, nothing more to do.
+ return false;
+ }
+ invariant(secondariesCount > 0);
+
+ // Adjust ratio to mirror read requests to approximately `samplingRate x secondariesCount`.
+ const auto secondariesRatio = secondariesCount * params.ratio;
+ const auto mirroringFactor = std::ceil(secondariesRatio);
+ invariant(mirroringFactor > 0 && mirroringFactor <= secondariesCount);
+ const double adjustedRatio = secondariesRatio / mirroringFactor;
+
// If our value is less than our max, then take a sample.
- return params.value < static_cast<int>(params.max * params.ratio);
+ return params.value < static_cast<int>(params.max * adjustedRatio);
}
std::vector<HostAndPort> MirroringSampler::getRawMirroringTargets(
@@ -103,7 +122,7 @@ std::vector<HostAndPort> MirroringSampler::getMirroringTargets(
auto sampler = MirroringSampler();
auto samplingParams = SamplingParameters(ratio, rndMax, std::move(rnd));
- if (!sampler.shouldSample(samplingParams)) {
+ if (!sampler.shouldSample(isMaster, samplingParams)) {
return {};
}