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

Rushabh S Shah commented on HDFS-12832:
---------------------------------------

Thanks [~Deng FEI] for reporting the issue and [~shv] for the patch.
{noformat}
 // choose replication targets: NOT HOLDING THE GLOBAL LOCK
// It is costly to extract the filename for which chooseTargets is called,
// so for now we pass in the Inode itself.
{noformat}
If we are not going to use the srcPath anywhere in 
{{BlockPlacementPolicy#chooseTarget}}, then why to even compute 
{{bc#getName()}} ?
The above comment was specifically made to move this computation outside the 
lock and now we are moving this inside the lock and that too for the value that 
is never going to get used.
IMO we should set the {{srcPath}} as null and add a warning in code to refer to 
this jira so future programmers would know the background on why its set to 
null.
In trunk, we can deprecate {{BlockPlacementPolicy.chooseTargets()}} with 
{{srcPath}} parameter as you mentioned in HDFS-12856.

> 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