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

Chao Sun commented on HDFS-14346:
---------------------------------

Thanks [~xkrogen] for the reviewing! changed the title and description.

Regarding the added method, it is currently only used by the method:
{code:java}
public long getTimeDuration(String name, long defaultValue, TimeUnit unit)
{code}
which simply delegate to the former.

It may also be useful when people uses a string to specify the default time 
duration. Taking the following config as example:
{code:java}
  public static final String DFS_NAMENODE_REENCRYPT_SLEEP_INTERVAL_DEFAULT = 
"1m";
{code}
which is used by the following code:
{code:java}
    this.interval =
        conf.getTimeDuration(DFS_NAMENODE_REENCRYPT_SLEEP_INTERVAL_KEY,
            DFS_NAMENODE_REENCRYPT_SLEEP_INTERVAL_DEFAULT,
            TimeUnit.MILLISECONDS);
{code}
If someone (perhaps accidentally) set {{"10"}} for this config, we may want to 
use {{TimeUnit.MINUTE}} for the {{defaultUnit}} while {{TimeUnit.MILLISECONDS}} 
for the {{returnUnit}}.

 

> Better time precision in getTimeDuration
> ----------------------------------------
>
>                 Key: HDFS-14346
>                 URL: https://issues.apache.org/jira/browse/HDFS-14346
>             Project: Hadoop HDFS
>          Issue Type: Improvement
>          Components: namenode
>            Reporter: Chao Sun
>            Assignee: Chao Sun
>            Priority: Minor
>         Attachments: HDFS-14346.000.patch
>
>
> Currently, {{Configuration#getTimeDuration}} has the following signature:
> {code}
>   /**
>    * Return time duration in the given time unit. Valid units are encoded in
>    * properties as suffixes: nanoseconds (ns), microseconds (us), milliseconds
>    * (ms), seconds (s), minutes (m), hours (h), and days (d).
>    * @param name Property name
>    * @param defaultValue Value returned if no mapping exists.
>    * @param unit Unit to convert the stored property, if it exists.
>    * @throws NumberFormatException If the property stripped of its unit is not
>    *         a number
>    */
>   public long getTimeDuration(String name, long defaultValue, TimeUnit unit)
> {code}
> This may lose precision in case the default time unit is larger than the time 
> unit that the configuration value is converted to in the call sites of this 
> method. For instance, in {{EditLogTailer}} this method is used in the 
> following manner:
> {code}
>     logRollPeriodMs = conf.getTimeDuration(
>         DFSConfigKeys.DFS_HA_LOGROLL_PERIOD_KEY,
>         DFSConfigKeys.DFS_HA_LOGROLL_PERIOD_DEFAULT, TimeUnit.SECONDS) * 1000;
>     sleepTimeMs = conf.getTimeDuration(
>         DFSConfigKeys.DFS_HA_TAILEDITS_PERIOD_KEY,
>         DFSConfigKeys.DFS_HA_TAILEDITS_PERIOD_DEFAULT, TimeUnit.SECONDS) * 
> 1000;
> {code}
> in both cases, the default time unit is second, and the configuration value 
> is converted into milli-seconds. Precision is lost when people want to 
> specify sub-second time duration such as {{100ms}}, which will be converted 
> to {{0ms}}.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-issues-unsubscr...@hadoop.apache.org
For additional commands, e-mail: hdfs-issues-h...@hadoop.apache.org

Reply via email to