diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index f0b4767448..04b485f9ef 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -443,6 +443,9 @@ Release 2.5.0 - UNRELEASED HDFS-6529. Trace logging for RemoteBlockReader2 to identify remote datanode and file being read. (Anubhav Dhoot via atm) + HDFS-6499. Use NativeIO#renameTo instead of File#renameTo in + FileJournalManager. (Yongjun Zhang via atm) + OPTIMIZATIONS HDFS-6214. Webhdfs has poor throughput for files >2GB (daryn) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FileJournalManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FileJournalManager.java index 2840e8a045..a41ff1390c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FileJournalManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FileJournalManager.java @@ -43,6 +43,8 @@ import org.apache.hadoop.hdfs.server.namenode.NNStorage.NameNodeFile; import org.apache.hadoop.hdfs.server.protocol.NamespaceInfo; import org.apache.hadoop.hdfs.server.protocol.RemoteEditLog; +import org.apache.hadoop.io.nativeio.NativeIO; + import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; @@ -132,10 +134,14 @@ synchronized public void finalizeLogSegment(long firstTxId, long lastTxId) Preconditions.checkState(!dstFile.exists(), "Can't finalize edits file " + inprogressFile + " since finalized file " + "already exists"); - if (!inprogressFile.renameTo(dstFile)) { + + try { + NativeIO.renameTo(inprogressFile, dstFile); + } catch (IOException e) { errorReporter.reportErrorOnFile(dstFile); - throw new IllegalStateException("Unable to finalize edits file " + inprogressFile); + throw new IllegalStateException("Unable to finalize edits file " + inprogressFile, e); } + if (inprogressFile.equals(currentInProgress)) { currentInProgress = null; } @@ -513,11 +519,16 @@ private void renameSelf(String newSuffix) throws IOException { File src = file; File dst = new File(src.getParent(), src.getName() + newSuffix); // renameTo fails on Windows if the destination file already exists. - if (!src.renameTo(dst)) { - if (!dst.delete() || !src.renameTo(dst)) { - throw new IOException( - "Couldn't rename log " + src + " to " + dst); + try { + if (dst.exists()) { + if (!dst.delete()) { + throw new IOException("Couldn't delete " + dst); + } } + NativeIO.renameTo(src, dst); + } catch (IOException e) { + throw new IOException( + "Couldn't rename log " + src + " to " + dst, e); } file = dst; }