Kaynağa Gözat

HDFS-8273. FSNamesystem#Delete() should not call logSync() when holding the lock. Contributed by Haohui Mai.

Haohui Mai 10 yıl önce
ebeveyn
işleme
4b9147ef8c

+ 3 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt

@@ -50,6 +50,9 @@ Release 2.7.1 - UNRELEASED
     HDFS-8070. Pre-HDFS-7915 DFSClient cannot use short circuit on
     post-HDFS-7915 DataNode (cmccabe)
 
+    HDFS-8273. FSNamesystem#Delete() should not call logSync() when holding the
+    lock. (wheat9)
+
 Release 2.7.0 - 2015-04-20
 
   INCOMPATIBLE CHANGES

+ 0 - 1
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirDeleteOp.java

@@ -158,7 +158,6 @@ class FSDirDeleteOp {
     incrDeletedFileCount(filesRemoved);
 
     fsn.removeLeasesAndINodes(src, removedINodes, true);
-    fsd.getEditLog().logSync();
 
     if (NameNode.stateChangeLog.isDebugEnabled()) {
       NameNode.stateChangeLog.debug("DIR* Namesystem.delete: "

+ 13 - 9
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java

@@ -3713,6 +3713,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
     } finally {
       writeUnlock();
     }
+    getEditLog().logSync();
     if (toRemovedBlocks != null) {
       removeBlocks(toRemovedBlocks); // Incremental deletion of blocks
     }
@@ -4717,22 +4718,21 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
      * blocks and unlink them from the namespace.
      */
     private void clearCorruptLazyPersistFiles()
-        throws SafeModeException, AccessControlException,
-        UnresolvedLinkException, IOException {
+        throws IOException {
 
       BlockStoragePolicy lpPolicy = blockManager.getStoragePolicy("LAZY_PERSIST");
 
-      List<BlockCollection> filesToDelete = new ArrayList<BlockCollection>();
-
+      List<BlockCollection> filesToDelete = new ArrayList<>();
+      boolean changed = false;
       writeLock();
-
       try {
         final Iterator<Block> it = blockManager.getCorruptReplicaBlockIterator();
 
         while (it.hasNext()) {
           Block b = it.next();
           BlockInfoContiguous blockInfo = blockManager.getStoredBlock(b);
-          if (blockInfo.getBlockCollection().getStoragePolicyID() == lpPolicy.getId()) {
+          if (blockInfo.getBlockCollection().getStoragePolicyID()
+              == lpPolicy.getId()) {
             filesToDelete.add(blockInfo.getBlockCollection());
           }
         }
@@ -4740,9 +4740,10 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
         for (BlockCollection bc : filesToDelete) {
           LOG.warn("Removing lazyPersist file " + bc.getName() + " with no replicas.");
           BlocksMapUpdateInfo toRemoveBlocks =
-          FSDirDeleteOp.deleteInternal(
-              FSNamesystem.this, bc.getName(),
-              INodesInPath.fromINode((INodeFile) bc), false);
+              FSDirDeleteOp.deleteInternal(
+                  FSNamesystem.this, bc.getName(),
+                  INodesInPath.fromINode((INodeFile) bc), false);
+          changed |= toRemoveBlocks != null;
           if (toRemoveBlocks != null) {
             removeBlocks(toRemoveBlocks); // Incremental deletion of blocks
           }
@@ -4750,6 +4751,9 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
       } finally {
         writeUnlock();
       }
+      if (changed) {
+        getEditLog().logSync();
+      }
     }
 
     @Override