You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-dev@hadoop.apache.org by "Praveen Krishna (JIRA)" <ji...@apache.org> on 2019/02/15 08:19:00 UTC

[jira] [Created] (HADOOP-16114) NetUtils#canonicalizeHost gives different value for same host

Praveen Krishna created HADOOP-16114:
----------------------------------------

             Summary: NetUtils#canonicalizeHost gives different value for same host
                 Key: HADOOP-16114
                 URL: https://issues.apache.org/jira/browse/HADOOP-16114
             Project: Hadoop Common
          Issue Type: Bug
          Components: net
    Affects Versions: 3.1.2, 2.7.6
            Reporter: Praveen Krishna


In NetUtils#canonicalizeHost uses ConcurrentHashMap#putIfAbsent to add an entry to the cache
{code:java}
  private static String canonicalizeHost(String host) {
    // check if the host has already been canonicalized
    String fqHost = canonicalizedHostCache.get(host);
    if (fqHost == null) {
      try {
        fqHost = SecurityUtil.getByName(host).getHostName();
        // slight race condition, but won't hurt
        canonicalizedHostCache.putIfAbsent(host, fqHost);
      } catch (UnknownHostException e) {
        fqHost = host;
      }
    }
    return fqHost;
}
{code}
 

If two different threads were invoking this method for the first time (so the cache is empty) and if SecurityUtil#getByName()#getHostName gives two different value for the same host , only one fqHost would be added in the cache and an invalid fqHost would be given to one of the thread which might cause some APIs to fail for the first time `FileSystem#checkPath` even if the path is in the given file system. It might be better if we modify the above method to this

 
{code:java}
  private static String canonicalizeHost(String host) {
    // check if the host has already been canonicalized
    String fqHost = canonicalizedHostCache.get(host);
    if (fqHost == null) {
      try {
        fqHost = SecurityUtil.getByName(host).getHostName();
        // slight race condition, but won't hurt
        canonicalizedHostCache.putIfAbsent(host, fqHost);
        fqHost = canonicalizedHostCache.get(host);
      } catch (UnknownHostException e) {
        fqHost = host;
      }
    }
    return fqHost;
}
{code}
 

So even if other thread get a different host name it will be updated to the cached value/



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

---------------------------------------------------------------------
To unsubscribe, e-mail: common-dev-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-dev-help@hadoop.apache.org