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

Konstantin Shvachko commented on HDFS-12832:
--------------------------------------------

Hi [~shahrs87] this is what I called "dirty" fix,  see [my earlier 
comment|https://issues.apache.org/jira/browse/HDFS-12832?focusedCommentId=16263282&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-16263282]
 and communication afterwards. If you know the story behind the comment about 
costly filename calculation  please let us know. It's pretty old, I cannot see 
beyond project merge point.
I think if the name is calculated it must be inside the lock, otherwise it's a 
bug. We need to unblock upcoming releases, whichdepend on this issue, and the 
safest way to fix this is by not changing any logic in block placement. Even 
though in standard Hadoop placement policies file name is not involved we do 
not know what other policies are out there. Also we cannot remove APIs before 
they are deprecated.

> INode.getFullPathName may throw ArrayIndexOutOfBoundsException lead to 
> NameNode exit
> ------------------------------------------------------------------------------------
>
>                 Key: HDFS-12832
>                 URL: https://issues.apache.org/jira/browse/HDFS-12832
>             Project: Hadoop HDFS
>          Issue Type: Bug
>          Components: namenode
>    Affects Versions: 2.7.4, 3.0.0-beta1
>            Reporter: DENG FEI
>            Assignee: Konstantin Shvachko
>            Priority: Critical
>              Labels: release-blocker
>         Attachments: HDFS-12832-branch-2.002.patch, 
> HDFS-12832-branch-2.7.002.patch, HDFS-12832-trunk-001.patch, 
> HDFS-12832.002.patch, exception.log
>
>
> {code:title=INode.java|borderStyle=solid}
> public String getFullPathName() {
>     // Get the full path name of this inode.
>     if (isRoot()) {
>       return Path.SEPARATOR;
>     }
>     // compute size of needed bytes for the path
>     int idx = 0;
>     for (INode inode = this; inode != null; inode = inode.getParent()) {
>       // add component + delimiter (if not tail component)
>       idx += inode.getLocalNameBytes().length + (inode != this ? 1 : 0);
>     }
>     byte[] path = new byte[idx];
>     for (INode inode = this; inode != null; inode = inode.getParent()) {
>       if (inode != this) {
>         path[--idx] = Path.SEPARATOR_CHAR;
>       }
>       byte[] name = inode.getLocalNameBytes();
>       idx -= name.length;
>       System.arraycopy(name, 0, path, idx, name.length);
>     }
>     return DFSUtil.bytes2String(path);
>   }
> {code}
> We found ArrayIndexOutOfBoundsException at 
> _{color:#707070}System.arraycopy(name, 0, path, idx, name.length){color}_ 
> when ReplicaMonitor work ,and the NameNode will quit.
> It seems the two loop is not synchronized, the path's length is changed.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

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

Reply via email to