summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllison Easton <allison.easton@mongodb.com>2020-08-06 19:40:54 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-08-07 21:50:20 +0000
commitf0bd888de22307dad1825323cadd3b708f670ae0 (patch)
tree5f8d518d9b1d0e6fbd364038468aa7452f4d6782
parentb743281f91a0d739c2eb34e9950dc3fd319e5097 (diff)
downloadmongo-f0bd888de22307dad1825323cadd3b708f670ae0.tar.gz
SERVER-49677 RoutingTableHistory::makeUpdated should skip copying chunkMap if it will result in no diffs
-rw-r--r--src/mongo/s/chunk_manager.cpp6
-rw-r--r--src/mongo/s/chunk_manager_refresh_bm.cpp21
2 files changed, 27 insertions, 0 deletions
diff --git a/src/mongo/s/chunk_manager.cpp b/src/mongo/s/chunk_manager.cpp
index b138a5c14d7..49ba0907017 100644
--- a/src/mongo/s/chunk_manager.cpp
+++ b/src/mongo/s/chunk_manager.cpp
@@ -720,6 +720,12 @@ std::shared_ptr<RoutingTableHistory> RoutingTableHistory::makeNew(
std::shared_ptr<RoutingTableHistory> RoutingTableHistory::makeUpdated(
const std::vector<ChunkType>& changedChunks) {
+ // It's possible for there to be one chunk in changedChunks without the routing table having
+ // changed. We skip copying the ChunkMap when this happens.
+ if (changedChunks.size() == 1 && changedChunks[0].getVersion() == getVersion()) {
+ return shared_from_this();
+ }
+
auto changedChunkInfos = flatten(changedChunks);
auto chunkMap = _chunkMap.createMerged(changedChunkInfos);
diff --git a/src/mongo/s/chunk_manager_refresh_bm.cpp b/src/mongo/s/chunk_manager_refresh_bm.cpp
index be3490e08a1..750b4d67da5 100644
--- a/src/mongo/s/chunk_manager_refresh_bm.cpp
+++ b/src/mongo/s/chunk_manager_refresh_bm.cpp
@@ -102,6 +102,27 @@ MONGO_COMPILER_NOINLINE auto runIncrementalUpdate(const CollectionMetadata& cm,
ShardId("shard0"));
}
+void BM_IncrementalRefreshWithNoChange(benchmark::State& state) {
+ const int nShards = state.range(0);
+ const int nChunks = state.range(1);
+ auto cm = makeChunkManagerWithOptimalBalancedDistribution(nShards, nChunks);
+
+ auto postMoveVersion = cm->getChunkManager()->getVersion();
+ const auto collName = NamespaceString(cm->getChunkManager()->getns());
+ std::vector<ChunkType> newChunks;
+ newChunks.emplace_back(
+ collName, getRangeForChunk(1, nChunks), postMoveVersion, ShardId("shard0"));
+
+ for (auto keepRunning : state) {
+ benchmark::DoNotOptimize(runIncrementalUpdate(*cm, newChunks));
+ }
+}
+
+BENCHMARK(BM_IncrementalRefreshWithNoChange)
+ ->Args({2, 50000})
+ ->Args({2, 250000})
+ ->Args({2, 500000});
+
void BM_IncrementalRefreshOfPessimalBalancedDistribution(benchmark::State& state) {
const int nShards = state.range(0);
const int nChunks = state.range(1);