summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTommaso Tocci <tommaso.tocci@mongodb.com>2022-02-07 13:43:07 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-02-07 14:10:02 +0000
commitc99e4833db76bba9842cf9ee9add83aaba0c340a (patch)
tree7ee054ac47be0136c6167e95c739bbbab463f8cb
parent5aa1d8f38943f36b93faf0485ea37f2de830621f (diff)
downloadmongo-c99e4833db76bba9842cf9ee9add83aaba0c340a.tar.gz
SERVER-63248 Defragmenter should not retry StaleShardVersion
-rw-r--r--jstests/sharding/balancer_defragmentation_merge_chunks.js65
-rw-r--r--src/mongo/db/s/balancer/balancer_defragmentation_policy_impl.cpp6
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())