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

Eli Collins commented on HDFS-2514:
-----------------------------------

Here's a description of how link resolution works which illustrates the bug, 
followed by a fix. The format below is "call by client" -> "value returned by 
server". The call to "parent" below occurs in FC#qualifySymlinkTarget.

h2. Absolute links

h3. Link is the 1st path component

Given link -> /file
FC#op(/link) --> ULE
FC#getLinkTarget(/link) --> /file   # Because link is final path component
FC#op(/file)                        # Because "/file" is absolute

h3. Link is the intermediate component

Given link -> /dir2
FC#op(/dir/link/file) -->  ULE          
FC#getLinkTarget(/dir/link/file) --> /dir2/file   # Returns target + remainder 
("file")
FC#op(/dir2/file)                                 # Because "/dir2" is absolute

h3. Link is the final component

Given link -> /file
FC#op(/dir/link) --> ULE
FC#getLinkTarget(/dir/link) --> /file   # Because link is final path component
FC#op(/file)                            # Because "/file" is absolute

h2. Relative links

h3. Link is the 1st path component

Given link -> file
FC#op(/link) --> ULE
FC#getLinkTarget(/link) --> file    # Because link is final path component
FC#op(parent(/link) + file)         # Because "file" is relative

h3. Link is the intermediate component

Give link -> dir2
FC#op(/dir/link/file) -->  ULE          
FC#getLinkTarget(/dir/link/file) --> dir2/file   # Returns target + remainder 
("dir2/file")
FC#op(parent(/dir/link/file) + dir2/file)        # Because dir2 is relative 
(parent + target)

*This is /dir/link/dir2/file, which is incorrect.* This should be 
parent(/dir/link) + dir2/file. But the client uses the full path, it doesn't 
know where the link in the path is.

h3. Link is the final component

Given link -> file
FC#op(/dir/link) --> ULE
FC#getLinkTarget(/dir/link) --> file    # Because link is final path component
FC#op(parent(/dir/link) + file)         # Because "file" is relative (parent + 
target)

h2. Proposed fix

In the above example, suppose we name the path components as follows..
path:       /dir/link/file
target:     dir2
preceding:  /dir
remainder:  /file

We change how the server resolves the path (in 
UnresolvedPathException#getResolvedPath).  The server is never given a relative 
path. If path refers to a link we return the target of the link verbatim (as we 
currently do). If target is absolute we return target + remainder (as we 
currenty do), otherwise we return preceding + target + remainder. Ie we resolve 
the link correctly by replacing  the link in the path with it's target. Ie we 
no longer return a relative path, we're resolving the relative path in path 
(which is absolute) and return that.

We don't need to change the client. If getLinkTarget returns an absolute path 
we ignore parent of the link (as we currently do). If getLinkTarget returns a 
relative path (because it was called with the link being the final path 
component - which we know now because the link target is not absolute) then we 
append the link's parent and the target, which is now correct since we know the 
link is the final path component.

Here's how the failing example works now..

Give link -> dir2
FC#op(/dir/link/file) -->  ULE          
FC#getLinkTarget(/dir/link/file) --> /dir/dir2/file   # Returns preceding + 
target + remainder
FC#op(/dir/dir2/file)                                 # Because /dir/dir2/file 
is absolute
                
> Link resolution bug for intermediate symlinks with relative targets
> -------------------------------------------------------------------
>
>                 Key: HDFS-2514
>                 URL: https://issues.apache.org/jira/browse/HDFS-2514
>             Project: Hadoop HDFS
>          Issue Type: Bug
>          Components: name-node
>    Affects Versions: 0.21.0, 0.22.0, 0.23.0
>            Reporter: Eli Collins
>            Assignee: Eli Collins
>         Attachments: hdfs-2514-1.patch
>
>
> There's a bug in the way the Namenode resolves intermediate symlinks (ie the 
> symlink is not the final path component) in paths when the symlink's target 
> is a relative path. Will post the full description in the first comment.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to