diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/AbstractFindTargetGreedy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/AbstractFindTargetGreedy.java index 998682d92af6..660452b2d8b0 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/AbstractFindTargetGreedy.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/AbstractFindTargetGreedy.java @@ -164,7 +164,14 @@ private boolean containerMoveSatisfiesPlacementPolicy( replicaList.add(target); ContainerPlacementStatus placementStatus = placementPolicyValidateProxy .validateContainerPlacement(replicaList, containerInfo); - return placementStatus.isPolicySatisfied(); + + boolean isPolicySatisfied = placementStatus.isPolicySatisfied(); + if (!isPolicySatisfied) { + logger.debug("Moving container {} from source {} to target {} will not " + + "satisfy placement policy.", containerID, source.getUuidString(), + target.getUuidString()); + } + return isPolicySatisfied; } /** @@ -185,10 +192,26 @@ private boolean canSizeEnterTarget(DatanodeDetails target, long size) { // MaxSizeEnteringTarget //2 current usage of target datanode plus sizeEnteringAfterMove // is smaller than or equal to upperLimit - return sizeEnteringAfterMove <= config.getMaxSizeEnteringTarget() && - Double.compare(nodeManager.getUsageInfo(target) - .calculateUtilization(sizeEnteringAfterMove), upperLimit) <= 0; + if (sizeEnteringAfterMove > config.getMaxSizeEnteringTarget()) { + logger.debug("{} bytes cannot enter datanode {} because 'size" + + ".entering.target.max' limit is {} and {} bytes have already " + + "entered.", size, target.getUuidString(), + config.getMaxSizeEnteringTarget(), + sizeEnteringNode.get(target)); + return false; + } + if (Double.compare(nodeManager.getUsageInfo(target) + .calculateUtilization(sizeEnteringAfterMove), upperLimit) > 0) { + logger.debug("{} bytes cannot enter datanode {} because its " + + "utilization will exceed the upper limit of {}.", size, + target.getUuidString(), upperLimit); + return false; + } + return true; } + + logger.warn("No record of how much size has entered datanode {}", + target.getUuidString()); return false; } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceGreedy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceGreedy.java index 41a56822a543..4f5868f2456e 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceGreedy.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceGreedy.java @@ -157,10 +157,24 @@ public boolean canSizeLeaveSource(DatanodeDetails source, long size) { // MaxSizeLeavingTarget //2 after subtracting sizeLeavingAfterMove, the usage is bigger // than or equal to lowerLimit - return sizeLeavingAfterMove <= config.getMaxSizeLeavingSource() && - Double.compare(nodeManager.getUsageInfo(source) - .calculateUtilization(-sizeLeavingAfterMove), lowerLimit) >= 0; + if (sizeLeavingAfterMove > config.getMaxSizeLeavingSource()) { + LOG.debug("{} bytes cannot leave datanode {} because 'size.leaving" + + ".source.max' limit is {} and {} bytes have already left.", + size, source.getUuidString(), config.getMaxSizeLeavingSource(), + sizeLeavingNode.get(source)); + return false; + } + if (Double.compare(nodeManager.getUsageInfo(source) + .calculateUtilization(-sizeLeavingAfterMove), lowerLimit) < 0) { + LOG.debug("{} bytes cannot leave datanode {} because its utilization " + + "will drop below the lower limit of {}.", size, + source.getUuidString(), lowerLimit); + return false; + } + return true; } + + LOG.warn("No record of how much size has left datanode {}", source); return false; }