diff options
author | Allison Easton <allison.easton@mongodb.com> | 2020-08-06 19:40:54 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-07 21:50:20 +0000 |
commit | f0bd888de22307dad1825323cadd3b708f670ae0 (patch) | |
tree | 5f8d518d9b1d0e6fbd364038468aa7452f4d6782 | |
parent | b743281f91a0d739c2eb34e9950dc3fd319e5097 (diff) | |
download | mongo-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.cpp | 6 | ||||
-rw-r--r-- | src/mongo/s/chunk_manager_refresh_bm.cpp | 21 |
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); |