[
https://issues.apache.org/jira/browse/HADOOP-12550?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14990755#comment-14990755
]
Xiaoyu Yao commented on HADOOP-12550:
-------------------------------------
Thanks [~cnauroth] for fixing this, patch looks good to me with only one
concern: the msdn link mentioned that *MOVEFILE_REPLACE_EXISTING cannot be used
if lpNewFileName or lpExistingFileName names a directory*. But it does not
describe the results if it is used. Maybe unsupported or unpredictable?
In Hadoop code, I found some places that we use NativeIO#renameTo for directory
rename, e.g., org.apache.hadoop.hdfs.server.datanode.DataStorage#doRollback.
Unfortunately, we don't have Jenkins for Windows to quickly validate this won't
break anything. I believe you will run the related unit tests on your own
Windows box. Can you attach the results to the JIRA?
{code}
org.apache.hadoop.hdfs.server.datanode.DataStorage.java
line: 881~883 rename(curDir, tmpDir);
{code}
> NativeIO#renameTo on Windows cannot replace an existing file at the
> destination.
> --------------------------------------------------------------------------------
>
> Key: HADOOP-12550
> URL: https://issues.apache.org/jira/browse/HADOOP-12550
> Project: Hadoop Common
> Issue Type: Bug
> Components: native
> Environment: Windows
> Reporter: Chris Nauroth
> Assignee: Chris Nauroth
> Attachments: HADOOP-12550.001.patch, HADOOP-12550.002.patch
>
>
> {{NativeIO#renameTo}} currently has different semantics on Linux vs. Windows
> if a file already exists at the destination. On Linux, it's a passthrough to
> the [rename|http://linux.die.net/man/2/rename] syscall, which will replace an
> existing file at the destination. On Windows, it's a passthrough to
> [MoveFile|https://msdn.microsoft.com/en-us/library/windows/desktop/aa365239%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396],
> which cannot replace an existing file at the destination and instead
> triggers an error. The easiest way to observe this difference is to run the
> HDFS test {{TestRollingUpgrade#testRollback}}. This fails on Windows due to
> a block recovery after truncate trying to replace a block at an existing
> destination path. This issue proposes to use
> [MoveFileEx|https://msdn.microsoft.com/en-us/library/windows/desktop/aa365240(v=vs.85).aspx]
> on Windows with the {{MOVEFILE_REPLACE_EXISTING}} flag.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)