szetszwo commented on code in PR #9587:
URL: https://github.com/apache/ozone/pull/9587#discussion_r2665970152


##########
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/policy/DefaultVolumeChoosingPolicy.java:
##########
@@ -67,24 +67,41 @@ public Pair<HddsVolume, HddsVolume> 
chooseVolume(MutableVolumeSet volumeSet,
           .sorted(Comparator.comparingDouble(VolumeFixedUsage::getUtilization))
           .collect(Collectors.toList());
 
-      // Calculate the actual threshold and check src
-      final double actualThreshold = getIdealUsage(volumeUsages) + 
thresholdPercentage / 100;
-      final VolumeFixedUsage src = volumeUsages.get(volumeUsages.size() - 1);
-      if (src.getUtilization() < actualThreshold) {
-        return null; // all volumes are under the threshold
+      // Calculate ideal usage and threshold range
+      final double idealUsage = getIdealUsage(volumeUsages);
+      final double actualThreshold = thresholdPercentage / 100.0;
+      final double lowerThreshold = idealUsage - actualThreshold;
+      final double upperThreshold = idealUsage + actualThreshold;
+
+      // Get highest and lowest utilization volumes
+      final VolumeFixedUsage highestUsage = 
volumeUsages.get(volumeUsages.size() - 1);
+      final VolumeFixedUsage lowestUsage = volumeUsages.get(0);
+
+      // Only return null if highest is below upper threshold AND lowest is 
above lower threshold
+      // This means all volumes are strictly within the range (not at 
boundaries)
+      if (highestUsage.getUtilization() < upperThreshold && 
+          lowestUsage.getUtilization() > lowerThreshold) {
+        // All volumes are strictly within threshold range, no balancing needed
+        return null;
       }
 
-      // Find dst
+      // Determine source volume: highest utilization volume (if above 
threshold) 
+      final VolumeFixedUsage src = highestUsage;
+
+      // Find destination volume: lowest utilization volume that has enough 
space
+      // Prefer volumes below threshold, but accept any volume with lower 
utilization than source
       for (int i = 0; i < volumeUsages.size() - 1; i++) {

Review Comment:
   Indeed, you are right.  The src and dst are independent, so we can choose 
the independently.  (If they are dependent, we need check all the pairs.)
   
   Your previous change actually is perfect.  Please revert it back.  Sorry 
that my previous comment was invalid.
   
   ```java
         // Get highest and lowest utilization volumes
         final VolumeFixedUsage highestUsage = 
volumeUsages.get(volumeUsages.size() - 1);
         final VolumeFixedUsage lowestUsage = volumeUsages.get(0);
   
         // Only return null if highest is below upper threshold AND lowest is 
above lower threshold
         // This means all volumes are strictly within the range (not at 
boundaries)
         if (highestUsage.getUtilization() < upperThreshold &&
             lowestUsage.getUtilization() > lowerThreshold) {
           // All volumes are strictly within threshold range, no balancing 
needed
           return null;
         }
   
         // Determine source volume: highest utilization volume (if above 
threshold)
         final VolumeFixedUsage src = highestUsage;
   
         // Find destination volume: lowest utilization volume that has enough 
space
         // Prefer volumes below threshold, but accept any volume with lower 
utilization than source
         for (int i = 0; i < volumeUsages.size() - 1; i++) {
           final VolumeFixedUsage dstUsage = volumeUsages.get(i);
           final HddsVolume dst = dstUsage.getVolume();
   
           // Check if destination has enough space and has lower utilization 
than source
           if (dstUsage.getUtilization() < src.getUtilization() &&
               containerSize < dstUsage.computeUsableSpace()) {
             // Found dst, reserve space and return
             dst.incCommittedBytes(containerSize);
             return Pair.of(src.getVolume(), dst);
           }
           LOG.debug("Destination volume {} does not have enough space, trying 
next volume.",
               dst.getStorageID());
         }
         LOG.debug("Failed to find appropriate destination volume.");
   ```



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to