[ 
https://issues.apache.org/jira/browse/HADOOP-13082?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15272089#comment-15272089
 ] 

Andras Bokor commented on HADOOP-13082:
---------------------------------------

[[email protected]], [~cnauroth],

Thank you guys for getting back to me.

First of all, yes, fallback logic was added way before HADOOP-9805.

I looked into it a bit deeper and it seems this rename situation is not that 
simple. We have 9 methods in FileSystemContractBaseTest which is broken and 6 
of 9 is broken by fallback logic.
I have a small list about it (it was my notes during the debugging):
{code}testRenameFileMoveToNonExistentDirectory
        Fallback creates the missing directory
testRenameDirectoryAsExistingFile
        Move fails but fallback behavior throws exception. Test expects only a 
false
testRenameDirectoryMoveToNonExistentDirectory
        Fallback creates the missing directory
testRenameChildDirForbidden
        Fallback will throw an exception (cannot copy x to ist subdirectory y) 
but contract expects just a false
testMoveDirUnderParent
        renameTo return false (which is good) but fallback throws exception 
while test does not expect exception
testRenameNonExistentPath
        rename returns with false but fallback throws exception
{code}

bq. I'm not sure now, after all, the raw OS doesn't do this, does it?
Yes, it does. In case of one volume mv command do just a rename. The inode will 
not change. In case of multi-volume the OS does a copy-delete.

I checked Jakarta IO commons and Guava how do they handle this and they use the 
same solution as we do in RawLocalFileSystem (if renameTo false, do a 
copy-delete). It is not good for us because we do not know why the renameTo 
returned false (so we can't decide whether the false was returned due to 
cross-volume move or other problem).
>From JDK 7 a new method was introduced. 
>[Files.move|https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#move%28java.nio.file.Path,%20java.nio.file.Path,%20java.nio.file.CopyOption...%29]
> do more or less the same as renameTo and it handles the cross-volume 
>situation.

Now I am confused what to do:
# Skip this one and solve others
# Skip all the rename related contracts
# Solve all the broken contracts with FileUtil#copy
# Solve all the contracts with 
[Files.move|https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#move%28java.nio.file.Path,%20java.nio.file.Path,%20java.nio.file.CopyOption...%29]
# Other

What do you guys think?

> RawLocalFileSystem does not fail when moving file to a non-existing directory
> -----------------------------------------------------------------------------
>
>                 Key: HADOOP-13082
>                 URL: https://issues.apache.org/jira/browse/HADOOP-13082
>             Project: Hadoop Common
>          Issue Type: Bug
>          Components: fs
>    Affects Versions: 0.23.0
>            Reporter: Andras Bokor
>            Assignee: Andras Bokor
>
> FileSystemContractBaseTest#testRenameFileMoveToNonExistentDirectory: creates 
> a file then move it to a non-existing directory. It should fail but it will 
> not (with RawLocalFileSystem) because in RawLocalFileSystem#rename(Path, 
> Path) method we have a fallback behavior that accomplishes the rename by a 
> full copy. The full copy will create the new directory and copy the file 
> there.
> I see two possible solutions here:
> # Remove the fallback full copy behavior
> # Before full cp we should check whether the parent directory exists or not. 
> If not return false an do not do the full copy.
> The fallback logic was added by 
> [HADOOP-9805|https://issues.apache.org/jira/browse/HADOOP-9805].



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to