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

Chris Nauroth commented on HDFS-9038:
-------------------------------------

I took patch v006 for a more thorough test run.  Unfortunately, I'm still 
seeing the bug that was introduced by HDFS-5215.  Even though non-DFS used is 
now calculated explicitly by the DataNode and sent in a dedicated RPC field, 
it's still using an incorrect calculation.

To help illustrate the problem better, I'd like to walk through the math for 
calculating non-DFS used, both before HDFS-5215 and after HDFS-5215.  Here is a 
bit of pseudo-code, prefixed with line numbers.

*Before HDFS-5215:*
{code}
1: nonDfsUsed = capacity - dfsUsed - available
2:            = (File#getTotalSpace - dfs.datanode.du.reserved) - dfsUsed - 
available
3:            = (File#getTotalSpace - dfs.datanode.du.reserved) - dfsUsed - 
File#getUsableSpace
4:            = File#getTotalSpace - dfs.datanode.du.reserved - dfsUsed - 
File#getUsableSpace
{code}

*After HDFS-5215*
{code}
1: nonDfsUsed = capacity - dfsUsed - available
2:            = (File#getTotalSpace - dfs.datanode.du.reserved) - dfsUsed - 
available
3:            = (File#getTotalSpace - dfs.datanode.du.reserved) - dfsUsed - 
(File#getUsableSpace - dfs.datanode.du.reserved)
4:            = File#getTotalSpace - dfs.datanode.du.reserved - dfsUsed - 
File#getUsableSpace + dfs.datanode.du.reserved
5:            = File#getTotalSpace - dfsUsed - File#getUsableSpace
{code}

The most important point to note is the difference in line 3 of the expansions. 
 After HDFS-5215, the definition of {{available}} removes 
{{dfs.datanode.du.reserved}}.  However, the definition of {{capacity}} already 
removed {{dfs.datanode.du.reserved}}.  Carrying out the expansion further in 
lines 4 and 5, we see that the 2 occurrences of {{dfs.datanode.du.reserved}} 
cancel each other out.  That means implicitly that {{nonDfsUsed}} now includes 
(instead of excludes) {{dfs.datanode.du.reserved}}.

Patch v006 still has the same fundamental problem in the logic, because 
{{FsVolumeImpl#getNonDfsUsed}} still reuses the implementation of 
{{FsVolumeImpl#getAvailable}}, which in turn removes 
{{dfs.datanode.du.reserved}}.

I think {{FsVolumeImpl#getNonDfsUsed}} essentially needs to go back to the old 
pre-HDFS-5215 calculation of {{remaining}} instead of calling 
{{FsVolumeImpl#getAvailable}}.


> DFS reserved space is erroneously counted towards non-DFS used.
> ---------------------------------------------------------------
>
>                 Key: HDFS-9038
>                 URL: https://issues.apache.org/jira/browse/HDFS-9038
>             Project: Hadoop HDFS
>          Issue Type: Bug
>          Components: datanode
>    Affects Versions: 2.7.1
>            Reporter: Chris Nauroth
>            Assignee: Brahma Reddy Battula
>         Attachments: HDFS-9038-002.patch, HDFS-9038-003.patch, 
> HDFS-9038-004.patch, HDFS-9038-005.patch, HDFS-9038-006.patch, HDFS-9038.patch
>
>
> HDFS-5215 changed the DataNode volume available space calculation to consider 
> the reserved space held by the {{dfs.datanode.du.reserved}} configuration 
> property.  As a side effect, reserved space is now counted towards non-DFS 
> used.  I don't believe it was intentional to change the definition of non-DFS 
> used.  This issue proposes restoring the prior behavior: do not count 
> reserved space towards non-DFS used.



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

Reply via email to