diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/web/WebHdfsFileSystem.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/web/WebHdfsFileSystem.java index cc220404580..0fbad63fbe9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/web/WebHdfsFileSystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/web/WebHdfsFileSystem.java @@ -87,6 +87,7 @@ import org.apache.hadoop.security.token.delegation.AbstractDelegationTokenSelect import org.apache.hadoop.util.Progressable; import org.apache.hadoop.util.StringUtils; import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.ObjectReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -128,6 +129,8 @@ public class WebHdfsFileSystem extends FileSystem private InetSocketAddress nnAddrs[]; private int currentNNAddrIndex; private boolean disallowFallbackToInsecureCluster; + private static final ObjectReader READER = + new ObjectMapper().reader(Map.class); /** * Return the protocol scheme for the FileSystem. @@ -368,8 +371,7 @@ public class WebHdfsFileSystem extends FileSystem + "\" (parsed=\"" + parsed + "\")"); } } - ObjectMapper mapper = new ObjectMapper(); - return mapper.reader(Map.class).readValue(in); + return READER.readValue(in); } finally { in.close(); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 27de25f353c..2c40478dd0e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -1794,6 +1794,9 @@ Release 2.7.3 - UNRELEASED HDFS-9730. Storage ID update does not happen when there is a layout change (Tsz Wo Nicholas Sze via kihwal) + HDFS-9724. Degraded performance in WebHDFS listing as it does not reuse + ObjectMapper. (Akira AJISAKA via wheat9) + Release 2.7.2 - 2016-01-25 INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/web/JsonUtil.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/web/JsonUtil.java index b3cae6b7eb1..d7b5c31a4ad 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/web/JsonUtil.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/web/JsonUtil.java @@ -38,6 +38,12 @@ import java.util.*; public class JsonUtil { private static final Object[] EMPTY_OBJECT_ARRAY = {}; + // Reuse ObjectMapper instance for improving performance. + // ObjectMapper is thread safe as long as we always configure instance + // before use. We don't have a re-entrant call pattern in WebHDFS, + // so we just need to worry about thread-safety. + private static final ObjectMapper MAPPER = new ObjectMapper(); + /** Convert a token object to a Json string. */ public static String toJsonString(final Token token ) throws IOException { @@ -72,9 +78,8 @@ public class JsonUtil { public static String toJsonString(final String key, final Object value) { final Map m = new TreeMap(); m.put(key, value); - ObjectMapper mapper = new ObjectMapper(); try { - return mapper.writeValueAsString(m); + return MAPPER.writeValueAsString(m); } catch (IOException ignored) { } return null; @@ -116,10 +121,9 @@ public class JsonUtil { m.put("fileId", status.getFileId()); m.put("childrenNum", status.getChildrenNum()); m.put("storagePolicy", status.getStoragePolicy()); - ObjectMapper mapper = new ObjectMapper(); try { return includeType ? - toJsonString(FileStatus.class, m) : mapper.writeValueAsString(m); + toJsonString(FileStatus.class, m) : MAPPER.writeValueAsString(m); } catch (IOException ignored) { } return null; @@ -331,9 +335,8 @@ public class JsonUtil { new TreeMap>(); finalMap.put(AclStatus.class.getSimpleName(), m); - ObjectMapper mapper = new ObjectMapper(); try { - return mapper.writeValueAsString(finalMap); + return MAPPER.writeValueAsString(finalMap); } catch (IOException ignored) { } return null; @@ -371,8 +374,7 @@ public class JsonUtil { final XAttrCodec encoding) throws IOException { final Map finalMap = new TreeMap(); finalMap.put("XAttrs", toJsonArray(xAttrs, encoding)); - ObjectMapper mapper = new ObjectMapper(); - return mapper.writeValueAsString(finalMap); + return MAPPER.writeValueAsString(finalMap); } public static String toJsonString(final List xAttrs) @@ -381,10 +383,9 @@ public class JsonUtil { for (XAttr xAttr : xAttrs) { names.add(XAttrHelper.getPrefixedName(xAttr)); } - ObjectMapper mapper = new ObjectMapper(); - String ret = mapper.writeValueAsString(names); + String ret = MAPPER.writeValueAsString(names); final Map finalMap = new TreeMap(); finalMap.put("XAttrNames", ret); - return mapper.writeValueAsString(finalMap); + return MAPPER.writeValueAsString(finalMap); } }