[ 
https://issues.apache.org/jira/browse/HDDS-15091?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Wei-Chiu Chuang updated HDDS-15091:
-----------------------------------
    Description: 
According to ozone-default.xml
{noformat}
<property>
  <name>hdds.datanode.volume.choosing.policy</name>
  
<value>org.apache.hadoop.ozone.container.common.volume.CapacityVolumeChoosingPolicy</value>
  <tag>OZONE, CONTAINER, STORAGE, MANAGEMENT</tag>
  <description>
    The class name of the policy for choosing volumes in the list of 
directories.
    Defaults to 
org.apache.hadoop.ozone.container.common.volume.CapacityVolumeChoosingPolicy.
    This volume choosing policy randomly chooses two volumes with remaining 
space and then picks the one with lower utilization.
  </description>
</property> {noformat}
 

But actual implementation compares available amount of bytes of volumes.
{code:java}
long firstAvailable = firstVolume.getCurrentUsage().getAvailable()
    - firstVolume.getCommittedBytes();
long secondAvailable = secondVolume.getCurrentUsage().getAvailable()
    - secondVolume.getCommittedBytes();
selectedVolume = firstAvailable < secondAvailable ? secondVolume : firstVolume; 
{code}

This is not a problem if volumes are of the same capacity. However, if the 
datanode is heterogeneous and volumes are of different capacity (e.g. 24TB HDD 
vs 2TB NVMe SSD) it will not work as intended, and high density volumes will 
fill up sooner than the low density ones, causing imbalance.

 !Gemini_Generated_Image_1y67up1y67up1y67.png! 

  was:
According to ozone-default.xml
{noformat}
<property>
  <name>hdds.datanode.volume.choosing.policy</name>
  
<value>org.apache.hadoop.ozone.container.common.volume.CapacityVolumeChoosingPolicy</value>
  <tag>OZONE, CONTAINER, STORAGE, MANAGEMENT</tag>
  <description>
    The class name of the policy for choosing volumes in the list of 
directories.
    Defaults to 
org.apache.hadoop.ozone.container.common.volume.CapacityVolumeChoosingPolicy.
    This volume choosing policy randomly chooses two volumes with remaining 
space and then picks the one with lower utilization.
  </description>
</property> {noformat}
 

But actual implementation compares available amount of bytes of volumes.
{code:java}
long firstAvailable = firstVolume.getCurrentUsage().getAvailable()
    - firstVolume.getCommittedBytes();
long secondAvailable = secondVolume.getCurrentUsage().getAvailable()
    - secondVolume.getCommittedBytes();
selectedVolume = firstAvailable < secondAvailable ? secondVolume : firstVolume; 
{code}

This is not a problem if volumes are of the same capacity. However, if the 
datanode is heterogeneous and volumes are of different capacity (e.g. 24TB HDD 
vs 2TB NVMe SSD) it will not work as intended, and high density volumes will 
fill up sooner than the low density ones, causing imbalance.


> CapacityVolumeChoosingPolicy compares available bytes not utilization
> ---------------------------------------------------------------------
>
>                 Key: HDDS-15091
>                 URL: https://issues.apache.org/jira/browse/HDDS-15091
>             Project: Apache Ozone
>          Issue Type: Bug
>            Reporter: Wei-Chiu Chuang
>            Priority: Major
>         Attachments: Gemini_Generated_Image_1y67up1y67up1y67.png
>
>
> According to ozone-default.xml
> {noformat}
> <property>
>   <name>hdds.datanode.volume.choosing.policy</name>
>   
> <value>org.apache.hadoop.ozone.container.common.volume.CapacityVolumeChoosingPolicy</value>
>   <tag>OZONE, CONTAINER, STORAGE, MANAGEMENT</tag>
>   <description>
>     The class name of the policy for choosing volumes in the list of 
> directories.
>     Defaults to 
> org.apache.hadoop.ozone.container.common.volume.CapacityVolumeChoosingPolicy.
>     This volume choosing policy randomly chooses two volumes with remaining 
> space and then picks the one with lower utilization.
>   </description>
> </property> {noformat}
>  
> But actual implementation compares available amount of bytes of volumes.
> {code:java}
> long firstAvailable = firstVolume.getCurrentUsage().getAvailable()
>     - firstVolume.getCommittedBytes();
> long secondAvailable = secondVolume.getCurrentUsage().getAvailable()
>     - secondVolume.getCommittedBytes();
> selectedVolume = firstAvailable < secondAvailable ? secondVolume : 
> firstVolume; {code}
> This is not a problem if volumes are of the same capacity. However, if the 
> datanode is heterogeneous and volumes are of different capacity (e.g. 24TB 
> HDD vs 2TB NVMe SSD) it will not work as intended, and high density volumes 
> will fill up sooner than the low density ones, causing imbalance.
>  !Gemini_Generated_Image_1y67up1y67up1y67.png! 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to