[
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]