From 0fdd09a895c04ae614cb9b20e60dbcf6fabec48d Mon Sep 17 00:00:00 2001 From: yliu Date: Sat, 24 Jan 2015 16:29:50 -0800 Subject: [PATCH] HDFS-7638. Small fix and few refinements for FSN#truncate. (yliu) --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 2 ++ .../hdfs/server/namenode/FSNamesystem.java | 20 ++++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 790b0a62f34..64506cfe2a5 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -489,6 +489,8 @@ Release 2.7.0 - UNRELEASED HDFS-7606. Fix potential NPE in INodeFile.getBlocks(). (Byron Wong via shv) + HDFS-7638: Small fix and few refinements for FSN#truncate. (yliu) + Release 2.6.1 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index 2539c95015f..9824edee4f7 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -1971,18 +1971,22 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean, boolean res; byte[][] pathComponents = FSDirectory.getPathComponentsForReservedPath(src); writeLock(); + BlocksMapUpdateInfo toRemoveBlocks = new BlocksMapUpdateInfo(); try { checkOperation(OperationCategory.WRITE); checkNameNodeSafeMode("Cannot truncate for " + src); src = dir.resolvePath(pc, src, pathComponents); res = truncateInternal(src, newLength, clientName, - clientMachine, mtime, pc); - stat = FSDirStatAndListingOp.getFileInfo(dir, src, false, - FSDirectory.isReservedRawName(src), true); + clientMachine, mtime, pc, toRemoveBlocks); + stat = dir.getAuditFileInfo(dir.getINodesInPath4Write(src, false)); } finally { writeUnlock(); } getEditLog().logSync(); + if (!toRemoveBlocks.getToDeleteList().isEmpty()) { + removeBlocks(toRemoveBlocks); + toRemoveBlocks.clear(); + } logAuditEvent(true, "truncate", src, null, stat); return res; } @@ -1993,17 +1997,17 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean, */ boolean truncateInternal(String src, long newLength, String clientName, String clientMachine, - long mtime, FSPermissionChecker pc) + long mtime, FSPermissionChecker pc, + BlocksMapUpdateInfo toRemoveBlocks) throws IOException, UnresolvedLinkException { assert hasWriteLock(); INodesInPath iip = dir.getINodesInPath4Write(src, true); if (isPermissionEnabled) { dir.checkPathAccess(pc, iip, FsAction.WRITE); } - INodeFile file = iip.getLastINode().asFile(); + INodeFile file = INodeFile.valueOf(iip.getLastINode(), src); // Opening an existing file for write. May need lease recovery. recoverLeaseInternal(iip, src, clientName, clientMachine, false); - file = INodeFile.valueOf(iip.getLastINode(), src); // Truncate length check. long oldLength = file.computeFileSize(); if(oldLength == newLength) { @@ -2015,9 +2019,8 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean, ", truncate size: " + newLength + "."); } // Perform INodeFile truncation. - BlocksMapUpdateInfo collectedBlocks = new BlocksMapUpdateInfo(); boolean onBlockBoundary = dir.truncate(iip, newLength, - collectedBlocks, mtime); + toRemoveBlocks, mtime); Block truncateBlock = null; if(! onBlockBoundary) { // Open file for write, but don't log into edits @@ -2028,7 +2031,6 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean, } getEditLog().logTruncate(src, clientName, clientMachine, newLength, mtime, truncateBlock); - removeBlocks(collectedBlocks); return onBlockBoundary; }