diff options
author | Tommaso Tocci <tommaso.tocci@mongodb.com> | 2022-02-07 13:43:07 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-02-07 14:10:02 +0000 |
commit | c99e4833db76bba9842cf9ee9add83aaba0c340a (patch) | |
tree | 7ee054ac47be0136c6167e95c739bbbab463f8cb | |
parent | 5aa1d8f38943f36b93faf0485ea37f2de830621f (diff) | |
download | mongo-c99e4833db76bba9842cf9ee9add83aaba0c340a.tar.gz |
SERVER-63248 Defragmenter should not retry StaleShardVersion
-rw-r--r-- | jstests/sharding/balancer_defragmentation_merge_chunks.js | 65 | ||||
-rw-r--r-- | src/mongo/db/s/balancer/balancer_defragmentation_policy_impl.cpp | 6 |
2 files changed, 40 insertions, 31 deletions
diff --git a/jstests/sharding/balancer_defragmentation_merge_chunks.js b/jstests/sharding/balancer_defragmentation_merge_chunks.js index 7d01d920867..cc36da04ab6 100644 --- a/jstests/sharding/balancer_defragmentation_merge_chunks.js +++ b/jstests/sharding/balancer_defragmentation_merge_chunks.js @@ -135,6 +135,43 @@ function waitForFailpointOnConfigNodes(failpoint, timesEntered) { jsTest.log("Failpoint " + failpoint + " hit " + timesEntered + " times"); } +jsTest.log("Split chunks while defragmenting"); +{ + st.stopBalancer(); + const coll = getNewColl(); + const nss = coll.getFullName(); + assert.commandWorked(st.s.adminCommand({shardCollection: nss, key: {skey: 1}})); + + const chunks = findChunksUtil.findChunksByNs(st.config, nss).toArray(); + assert.eq(1, chunks.length); + assert.commandWorked(st.s.adminCommand({split: nss, middle: {skey: 0}})); + assert.commandWorked(st.s.adminCommand( + {moveChunk: nss, find: {skey: 0}, to: st.getOther(chunks[0]['shard']).name})); + + // Pause defragmentation after initialization but before phase 1 runs + setFailPointOnConfigNodes("afterBuildingNextDefragmentationPhase", {skip: 1}); + assert.commandWorked(st.s.adminCommand({ + configureCollectionBalancing: nss, + defragmentCollection: true, + chunkSize: chunkSize, + })); + st.startBalancer(); + + waitForFailpointOnConfigNodes("afterBuildingNextDefragmentationPhase", 0); + + assert.eq('moveAndMergeChunks', + st.config.collections.findOne({_id: nss})['defragmentationPhase']); + assert.eq(2, findChunksUtil.countChunksForNs(st.config, nss)); + assert.commandWorked(st.s.adminCommand({split: nss, middle: {skey: -10}})); + assert.commandWorked(st.s.adminCommand({split: nss, middle: {skey: 10}})); + assert.eq(4, findChunksUtil.countChunksForNs(st.config, nss)); + + clearFailPointOnConfigNodes("afterBuildingNextDefragmentationPhase"); + waitForEndOfDefragmentation(nss); + // Ensure the defragmentation succeeded + assert.eq(1, findChunksUtil.countChunksForNs(st.config, nss)); +} + // Setup collection for first tests const coll1 = setupCollection(); @@ -240,34 +277,6 @@ jsTest.log("Begin defragmentation with balancer off, end with it on"); st.stopBalancer(); } -jsTest.log("Balancer on, begin defragmentation and let it complete"); -{ - const coll = setupCollection(); - // Reset collection before starting - const initialNumChunks = findChunksUtil.countChunksForNs(st.config, coll); - jsTest.log("Initial number of chunks " + initialNumChunks); - // Pause after phase 1 completes to check merging succeeded - setFailPointOnConfigNodes("skipDefragmentationPhaseTransition", {skip: 1}); - assert.commandWorked(st.s.adminCommand({ - configureCollectionBalancing: coll, - defragmentCollection: true, - chunkSize: chunkSize, - })); - st.startBalancer(); - // Wait for phase 1 to complete - waitForFailpointOnConfigNodes("skipDefragmentationPhaseTransition", 0); - const numChunksAfterMerging = findChunksUtil.countChunksForNs(st.config, coll); - jsTest.log("Number of chunks after merging " + numChunksAfterMerging); - assert.lte(numChunksAfterMerging, initialNumChunks); - // Turn fail point off, let phase 3 run and complete - clearFailPointOnConfigNodes("skipDefragmentationPhaseTransition"); - waitForEndOfDefragmentation(coll); - st.stopBalancer(); - const finalNumChunks = findChunksUtil.countChunksForNs(st.config, coll); - jsTest.log("Number of chunks after splitting " + finalNumChunks); - assert.lte(finalNumChunks, initialNumChunks); -} - jsTest.log("Changed uuid causes defragmentation to restart"); { const coll = getNewColl(); diff --git a/src/mongo/db/s/balancer/balancer_defragmentation_policy_impl.cpp b/src/mongo/db/s/balancer/balancer_defragmentation_policy_impl.cpp index f5167a8e354..81ede2b693f 100644 --- a/src/mongo/db/s/balancer/balancer_defragmentation_policy_impl.cpp +++ b/src/mongo/db/s/balancer/balancer_defragmentation_policy_impl.cpp @@ -91,7 +91,7 @@ ZoneInfo getCollectionZones(OperationContext* opCtx, const CollectionType& coll) bool isRetriableForDefragmentation(const Status& error) { return (ErrorCodes::isA<ErrorCategory::RetriableError>(error) || - error == ErrorCodes::StaleShardVersion || error == ErrorCodes::StaleConfig); + error == ErrorCodes::StaleConfig); } void handleActionResult(OperationContext* opCtx, @@ -107,7 +107,7 @@ void handleActionResult(OperationContext* opCtx, return; } - if (status.isA<ErrorCategory::StaleShardVersionError>()) { + if (status == ErrorCodes::StaleConfig) { if (auto staleInfo = status.extraInfo<StaleConfigInfo>()) { Grid::get(opCtx) ->catalogCache() @@ -1668,7 +1668,7 @@ std::unique_ptr<DefragmentationPhase> BalancerDefragmentationPolicyImpl::_transi } afterBuildingNextDefragmentationPhase.pauseWhileSet(); LOGV2(6172702, - "Collection defragmentation transitioning to new phase", + "Collection defragmentation transitioned to new phase", "namespace"_attr = coll.getNss(), "phase"_attr = nextPhaseObject ? DefragmentationPhase_serializer(nextPhaseObject->getType()) |