You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ozone.apache.org by "ashishkumar50 (via GitHub)" <gi...@apache.org> on 2026/10/12 06:13:58 UTC
Re: [PR] HDDS-16181. Add container balancer recommend CLI command to suggest config for each profile [ozone]
ashishkumar50 commented on code in PR #11342:
URL: https://github.com/apache/ozone/pull/11342#discussion_r4245112347
##########
hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerAdvisor.java:
##########
@@ -82,6 +88,187 @@ public static List<ContainerBalancerEstimation> estimate(OzoneConfiguration conf
return Collections.unmodifiableList(estimations);
}
+ /**
+ * Recommends balancer configuration for one or more balancer profiles.
+ *
+ * <p>If {@link AdvisorRequest#profile} is set, returns a result for that profile only.
+ * Otherwise returns SLOW, MEDIUM, and FAST. Per-profile validation failures are returned with
+ * {@link ContainerBalancerRecommendation#succeeded()} false instead of aborting other profiles.
+ */
+ public static List<ContainerBalancerRecommendation> recommend(
+ OzoneConfiguration conf, AdvisorRequest request) {
+ Objects.requireNonNull(conf, "conf");
+ Objects.requireNonNull(request, "request");
+ List<DatanodeUsageInfoProto> nodes = Objects.requireNonNull(request.nodes, "nodes");
+
+ ContainerBalancerConfiguration balancerConfig = conf.getObject(ContainerBalancerConfiguration.class);
+
+ double thresholdPercent = request.thresholdPercent != null
+ ? request.thresholdPercent
+ : balancerConfig.getThreshold();
+ validateThresholdPercent(thresholdPercent);
+ double thresholdRatio = thresholdPercent / 100.0;
+ Set<String> includeNodes = request.includeNodes != null
+ ? request.includeNodes
+ : balancerConfig.getIncludeNodes();
+ Set<String> excludeNodes = request.excludeNodes != null
+ ? request.excludeNodes
+ : balancerConfig.getExcludeNodes();
+
+ ContainerBalancerClusterSnapshot snapshot = ContainerBalancerClusterAnalyzer.analyze(
+ nodes, thresholdRatio, includeNodes, excludeNodes);
+
+ List<ContainerBalancerProfile> profiles = selectProfilesForRecommend(request);
+ if (isClusterAlreadyBalanced(snapshot)) {
+ return recommendationsForBalancedCluster(profiles, thresholdPercent);
+ }
+ validateSnapshotForEstimation(snapshot);
+ List<ContainerBalancerRecommendation> recommendations = new ArrayList<>(profiles.size());
+ for (ContainerBalancerProfile profile : profiles) {
+ recommendations.add(recommendForProfile(
+ conf, request, profile, snapshot, balancerConfig, thresholdPercent));
+ }
+ return Collections.unmodifiableList(recommendations);
+ }
+
+ private static boolean isClusterAlreadyBalanced(ContainerBalancerClusterSnapshot snapshot) {
+ return snapshot.getBytesToMove() <= 0
+ || (snapshot.getSourceCount() < 1 && snapshot.getTargetCount() < 1);
+ }
+
+ private static List<ContainerBalancerRecommendation> recommendationsForBalancedCluster(
+ List<ContainerBalancerProfile> profiles, double thresholdPercent) {
+ List<ContainerBalancerRecommendation> recommendations = new ArrayList<>(profiles.size());
+ for (ContainerBalancerProfile profile : profiles) {
+ recommendations.add(ContainerBalancerRecommendation.newBuilder()
+ .setProfile(profile)
+ .setThresholdPercent(thresholdPercent)
+ .setClusterBalanced(true)
+ .build());
+ }
+ return Collections.unmodifiableList(recommendations);
+ }
+
+ private static ContainerBalancerRecommendation recommendForProfile(
+ OzoneConfiguration conf,
+ AdvisorRequest request,
+ ContainerBalancerProfile profile,
+ ContainerBalancerClusterSnapshot snapshot,
+ ContainerBalancerConfiguration balancerConfig,
+ double thresholdPercent) {
+
+ ContainerBalancerRecommendation.Builder builder = ContainerBalancerRecommendation.newBuilder()
+ .setProfile(profile)
+ .setThresholdPercent(thresholdPercent);
+
+ try {
+ long moveReplicationTimeoutMillis = balancerConfig.getMoveReplicationTimeout().toMillis();
+ long moveTimeoutMillis = balancerConfig.getMoveTimeout().toMillis();
+ long balancingIntervalMillis = balancerConfig.getBalancingInterval().toMillis();
+ validateMoveTimeouts(conf, moveReplicationTimeoutMillis, moveTimeoutMillis);
+ validateBalancingIntervalMillis(balancingIntervalMillis);
+
+ ContainerBalancerEstimation estimation = estimateForProfile(
+ conf, request, profile, snapshot, balancerConfig, thresholdPercent);
Review Comment:
The estimation is computed before `recommendedMaxMove` is derived, so it can use a different `max-size-to-move-per-iteration` value from the one printed in the recommended configuration and suggested command.
Could we resolve the effective movement limits first and then run the estimation using those limits? Otherwise, the reported iteration count and duration may not reflect the configuration users are advised to apply.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@ozone.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@ozone.apache.org
For additional commands, e-mail: issues-help@ozone.apache.org