[ https://issues.apache.org/jira/browse/HADOOP-16114?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16786649#comment-16786649 ]
Hudson commented on HADOOP-16114: --------------------------------- SUCCESS: Integrated in Jenkins build Hadoop-trunk-Commit #16154 (See [https://builds.apache.org/job/Hadoop-trunk-Commit/16154/]) HADOOP-16114. NetUtils#canonicalizeHost gives different value for same (stevel: rev 2b94e51a8f17548e5ef6af8e1e934a94031bb1dc) * (edit) hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java > 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: 2.7.6, 3.1.2 > Reporter: Praveen Krishna > Assignee: Praveen Krishna > Priority: Minor > Fix For: 3.1.3 > > Attachments: HADOOP-16114-001.patch > > > 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-issues-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-issues-h...@hadoop.apache.org