diff options
author | Amirsaman Memaripour <amirsaman.memaripour@mongodb.com> | 2020-04-03 19:05:31 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-04-16 19:08:39 +0000 |
commit | b483650696b6d67dd3c651b3e8cd2926d3776ff3 (patch) | |
tree | 7e4ec32598bebaa914517b264f4b331130e4c1ed /src/mongo/db/mirroring_sampler.cpp | |
parent | 6ad41d820bc3827aa295c37f14ef0420f44d3f8a (diff) | |
download | mongo-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.cpp | 25 |
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 {}; } |