From 717579f3bdf01c51437ea1e7f414a737a89de986 Mon Sep 17 00:00:00 2001 From: Todd Lipcon Date: Tue, 4 Jan 2011 22:12:22 +0000 Subject: [PATCH] HADOOP-7082. Configuration.writeXML should not hold lock while outputting. Contributed by Todd Lipcon git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1055206 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES.txt | 3 + .../org/apache/hadoop/conf/Configuration.java | 83 +++++++++++-------- 2 files changed, 52 insertions(+), 34 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index a62ac5100d9..4dd6acab90c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -413,6 +413,9 @@ Release 0.22.0 - Unreleased HADOOP-7038. saveVersion script includes an additional \r while running whoami under windows. (Wang Xu via cos) + HADOOP-7082. Configuration.writeXML should not hold lock while outputting + (todd) + Release 0.21.1 - Unreleased IMPROVEMENTS diff --git a/src/java/org/apache/hadoop/conf/Configuration.java b/src/java/org/apache/hadoop/conf/Configuration.java index 6607aa6d0ee..e5d4a15accd 100644 --- a/src/java/org/apache/hadoop/conf/Configuration.java +++ b/src/java/org/apache/hadoop/conf/Configuration.java @@ -1588,52 +1588,67 @@ public class Configuration implements Iterable>, * * @param out the writer to write to. */ - public synchronized void writeXml(Writer out) throws IOException { + public void writeXml(Writer out) throws IOException { + Document doc = asXmlDocument(); + Properties properties = getProps(); try { - Document doc = - DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); - Element conf = doc.createElement("configuration"); - doc.appendChild(conf); - conf.appendChild(doc.createTextNode("\n")); - for (Enumeration e = properties.keys(); e.hasMoreElements();) { - String name = (String)e.nextElement(); - Object object = properties.get(name); - String value = null; - if (object instanceof String) { - value = (String) object; - }else { - continue; - } - Element propNode = doc.createElement("property"); - conf.appendChild(propNode); - - if (updatingResource != null) { - Comment commentNode = doc.createComment( - "Loaded from " + updatingResource.get(name)); - propNode.appendChild(commentNode); - } - Element nameNode = doc.createElement("name"); - nameNode.appendChild(doc.createTextNode(name)); - propNode.appendChild(nameNode); - - Element valueNode = doc.createElement("value"); - valueNode.appendChild(doc.createTextNode(value)); - propNode.appendChild(valueNode); - - conf.appendChild(doc.createTextNode("\n")); - } - DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(out); TransformerFactory transFactory = TransformerFactory.newInstance(); Transformer transformer = transFactory.newTransformer(); + + // Important to not hold Configuration log while writing result, since + // 'out' may be an HDFS stream which needs to lock this configuration + // from another thread. transformer.transform(source, result); } catch (TransformerException te) { throw new IOException(te); + } + } + + /** + * Return the XML DOM corresponding to this Configuration. + */ + private synchronized Document asXmlDocument() throws IOException { + Document doc; + try { + doc = + DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); } catch (ParserConfigurationException pe) { throw new IOException(pe); } + Element conf = doc.createElement("configuration"); + doc.appendChild(conf); + conf.appendChild(doc.createTextNode("\n")); + for (Enumeration e = properties.keys(); e.hasMoreElements();) { + String name = (String)e.nextElement(); + Object object = properties.get(name); + String value = null; + if (object instanceof String) { + value = (String) object; + }else { + continue; + } + Element propNode = doc.createElement("property"); + conf.appendChild(propNode); + + if (updatingResource != null) { + Comment commentNode = doc.createComment( + "Loaded from " + updatingResource.get(name)); + propNode.appendChild(commentNode); + } + Element nameNode = doc.createElement("name"); + nameNode.appendChild(doc.createTextNode(name)); + propNode.appendChild(nameNode); + + Element valueNode = doc.createElement("value"); + valueNode.appendChild(doc.createTextNode(value)); + propNode.appendChild(valueNode); + + conf.appendChild(doc.createTextNode("\n")); + } + return doc; } /**