diff options
author | Paolo Polato <paolo.polato@mongodb.com> | 2022-02-16 20:52:57 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-02-16 22:20:46 +0000 |
commit | eee82fa3dc2b0e370a21f9855b74b30937dd859c (patch) | |
tree | 699620c9e9321147b237e2c4729c5a0c7f8536db /src/mongo/db/s/balancer | |
parent | 9d43212e982f62c24b8f35ca3cf234d5453d05ab (diff) | |
download | mongo-eee82fa3dc2b0e370a21f9855b74b30937dd859c.tar.gz |
SERVER-62853 Report maxChunkSize in balancerCollectionStatus()
Diffstat (limited to 'src/mongo/db/s/balancer')
-rw-r--r-- | src/mongo/db/s/balancer/balancer.cpp | 61 | ||||
-rw-r--r-- | src/mongo/db/s/balancer/balancer.h | 9 |
2 files changed, 47 insertions, 23 deletions
diff --git a/src/mongo/db/s/balancer/balancer.cpp b/src/mongo/db/s/balancer/balancer.cpp index b180654ffb4..dc5219316c3 100644 --- a/src/mongo/db/s/balancer/balancer.cpp +++ b/src/mongo/db/s/balancer/balancer.cpp @@ -957,40 +957,67 @@ void Balancer::abortCollectionDefragmentation(OperationContext* opCtx, const Nam _defragmentationPolicy->abortCollectionDefragmentation(opCtx, nss); } -Balancer::BalancerStatus Balancer::getBalancerStatusForNs(OperationContext* opCtx, - const NamespaceString& ns) { +BalancerCollectionStatusResponse Balancer::getBalancerStatusForNs(OperationContext* opCtx, + const NamespaceString& ns) { + CollectionType coll; try { - auto coll = Grid::get(opCtx)->catalogClient()->getCollection(opCtx, ns, {}); - bool isDefragmenting = coll.getDefragmentCollection(); - if (isDefragmenting) { - return {false, - kBalancerPolicyStatusDefragmentingChunks.toString(), - _defragmentationPolicy->reportProgressOn(coll.getUuid())}; + coll = Grid::get(opCtx)->catalogClient()->getCollection(opCtx, ns, {}); + } catch (const ExceptionFor<ErrorCodes::NamespaceNotFound>&) { + uasserted(ErrorCodes::NamespaceNotSharded, "Collection unsharded or undefined"); + } + + const auto maxChunkSizeMB = [&]() -> int64_t { + int64_t value = 0; + if (const auto& collOverride = coll.getMaxChunkSizeBytes(); collOverride.is_initialized()) { + value = *collOverride; + } else { + auto balancerConfig = Grid::get(opCtx)->getBalancerConfiguration(); + uassertStatusOK(balancerConfig->refreshAndCheck(opCtx)); + value = balancerConfig->getMaxChunkSizeBytes(); } - } catch (DBException&) { - // Catch exceptions to keep consistency with errors thrown before defragmentation + return value / (1024 * 1024); + }(); + BalancerCollectionStatusResponse response(maxChunkSizeMB, true /*balancerCompliant*/); + auto setViolationOnResponse = [&response](const StringData& reason, + const boost::optional<BSONObj>& details = + boost::none) { + response.setBalancerCompliant(false); + response.setFirstComplianceViolation(reason); + response.setDetails(details); + }; + + bool isDefragmenting = coll.getDefragmentCollection(); + if (isDefragmenting) { + setViolationOnResponse(kBalancerPolicyStatusDefragmentingChunks, + _defragmentationPolicy->reportProgressOn(coll.getUuid())); + return response; } auto splitChunks = uassertStatusOK(_chunkSelectionPolicy->selectChunksToSplit(opCtx, ns)); if (!splitChunks.empty()) { - return {false, kBalancerPolicyStatusZoneViolation.toString()}; + setViolationOnResponse(kBalancerPolicyStatusZoneViolation); + return response; } + auto chunksToMove = uassertStatusOK(_chunkSelectionPolicy->selectChunksToMove(opCtx, ns)); if (chunksToMove.empty()) { - return {true, boost::none, boost::none}; + return response; } - const auto& migrationInfo = chunksToMove.front(); + const auto& migrationInfo = chunksToMove.front(); switch (migrationInfo.reason) { case MigrateInfo::drain: - return {false, kBalancerPolicyStatusDraining.toString(), boost::none}; + setViolationOnResponse(kBalancerPolicyStatusDraining); + break; case MigrateInfo::zoneViolation: - return {false, kBalancerPolicyStatusZoneViolation.toString(), boost::none}; + setViolationOnResponse(kBalancerPolicyStatusZoneViolation); + break; case MigrateInfo::chunksImbalance: - return {false, kBalancerPolicyStatusChunksImbalance.toString(), boost::none}; + setViolationOnResponse(kBalancerPolicyStatusChunksImbalance); + break; } - return {true, boost::none, boost::none}; + return response; } } // namespace mongo diff --git a/src/mongo/db/s/balancer/balancer.h b/src/mongo/db/s/balancer/balancer.h index c3ea9b0578f..f0710e245b6 100644 --- a/src/mongo/db/s/balancer/balancer.h +++ b/src/mongo/db/s/balancer/balancer.h @@ -33,6 +33,7 @@ #include "mongo/db/s/balancer/balancer_chunk_selection_policy.h" #include "mongo/db/s/balancer/balancer_random.h" #include "mongo/platform/mutex.h" +#include "mongo/s/request_types/balancer_collection_status_gen.h" #include "mongo/stdx/condition_variable.h" #include "mongo/stdx/thread.h" @@ -183,16 +184,12 @@ public: */ void abortCollectionDefragmentation(OperationContext* opCtx, const NamespaceString& nss); - struct BalancerStatus { - bool balancerCompliant; - boost::optional<std::string> firstComplianceViolation; - boost::optional<BSONObj> details; - }; /** * Returns if a given collection is draining due to a removed shard, has chunks on an invalid * zone or the number of chunks is imbalanced across the cluster */ - BalancerStatus getBalancerStatusForNs(OperationContext* opCtx, const NamespaceString& nss); + BalancerCollectionStatusResponse getBalancerStatusForNs(OperationContext* opCtx, + const NamespaceString& nss); private: /** |