Browse Source

HDFS-17696. Optimize isBlockReplicatedOk method when scheduleReconStruction parameter is false (#7243)

Reviewed-by: Haiyang Hu <haiyang.hu@shopee.com>
Signed-off-by: Tao Li <tomscut@apache.org>
hfutatzhanghb 5 months ago
parent
commit
22a9287e4a

+ 3 - 14
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeAdminBackoffMonitor.java

@@ -738,7 +738,7 @@ public class DatanodeAdminBackoffMonitor extends DatanodeAdminMonitorBase
    * @return
    */
   private boolean isBlockReplicatedOk(DatanodeDescriptor datanode,
-      BlockInfo block, Boolean scheduleReconStruction,
+      BlockInfo block, boolean scheduleReconStruction,
       BlockStats suspectBlocks) {
     if (blockManager.blocksMap.getStoredBlock(block) == null) {
       LOG.trace("Removing unknown block {}", block);
@@ -760,19 +760,8 @@ public class DatanodeAdminBackoffMonitor extends DatanodeAdminMonitorBase
     boolean isDecommission = datanode.isDecommissionInProgress();
     boolean isMaintenance = datanode.isEnteringMaintenance();
 
-    boolean neededReconstruction = isDecommission ?
-        blockManager.isNeededReconstruction(block, num) :
-        blockManager.isNeededReconstructionForMaintenance(block, num);
-    if (neededReconstruction && scheduleReconStruction) {
-      if (!blockManager.neededReconstruction.contains(block) &&
-          blockManager.pendingReconstruction.getNumReplicas(block) == 0 &&
-          blockManager.isPopulatingReplQueues()) {
-        // Process these blocks only when active NN is out of safe mode.
-        blockManager.neededReconstruction.add(block,
-            liveReplicas, num.readOnlyReplicas(),
-            num.outOfServiceReplicas(),
-            blockManager.getExpectedRedundancyNum(block));
-      }
+    if (scheduleReconStruction) {
+      addReconstructionBlockIfNeeded(isDecommission, block, num, liveReplicas);
     }
 
     if (suspectBlocks != null) {

+ 1 - 14
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeAdminDefaultMonitor.java

@@ -464,20 +464,7 @@ public class DatanodeAdminDefaultMonitor extends DatanodeAdminMonitorBase
       // if not already pending.
       boolean isDecommission = datanode.isDecommissionInProgress();
       boolean isMaintenance = datanode.isEnteringMaintenance();
-      boolean neededReconstruction = isDecommission ?
-          blockManager.isNeededReconstruction(block, num) :
-          blockManager.isNeededReconstructionForMaintenance(block, num);
-      if (neededReconstruction) {
-        if (!blockManager.neededReconstruction.contains(block) &&
-            blockManager.pendingReconstruction.getNumReplicas(block) == 0 &&
-            blockManager.isPopulatingReplQueues()) {
-          // Process these blocks only when active NN is out of safe mode.
-          blockManager.neededReconstruction.add(block,
-              liveReplicas, num.readOnlyReplicas(),
-              num.outOfServiceReplicas(),
-              blockManager.getExpectedRedundancyNum(block));
-        }
-      }
+      addReconstructionBlockIfNeeded(isDecommission, block, num, liveReplicas);
 
       // Even if the block is without sufficient redundancy,
       // it might not block decommission/maintenance if it

+ 18 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeAdminMonitorBase.java

@@ -208,4 +208,22 @@ public abstract class DatanodeAdminMonitorBase
     }
     return Stream.empty();
   }
+
+  void addReconstructionBlockIfNeeded(boolean isDecommission, BlockInfo block,
+      NumberReplicas num, int liveReplicas) {
+    boolean neededReconstruction = isDecommission ?
+        blockManager.isNeededReconstruction(block, num) :
+        blockManager.isNeededReconstructionForMaintenance(block, num);
+    if (neededReconstruction) {
+      if (!blockManager.neededReconstruction.contains(block) &&
+          blockManager.pendingReconstruction.getNumReplicas(block) == 0 &&
+          blockManager.isPopulatingReplQueues()) {
+        // Process these blocks only when active NN is out of safe mode.
+        blockManager.neededReconstruction.add(block,
+            liveReplicas, num.readOnlyReplicas(),
+            num.outOfServiceReplicas(),
+            blockManager.getExpectedRedundancyNum(block));
+      }
+    }
+  }
 }