Author: todd Date: Tue Jan 4 22:17:44 2011 New Revision: 1055209 URL: http://svn.apache.org/viewvc?rev=1055209&view=rev Log: HADOOP-7082. Configuration.writeXML should not hold lock while outputting. Contributed by Todd Lipcon
Modified: hadoop/common/branches/branch-0.22/CHANGES.txt hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/conf/Configuration.java Modified: hadoop/common/branches/branch-0.22/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.22/CHANGES.txt?rev=1055209&r1=1055208&r2=1055209&view=diff ============================================================================== --- hadoop/common/branches/branch-0.22/CHANGES.txt (original) +++ hadoop/common/branches/branch-0.22/CHANGES.txt Tue Jan 4 22:17:44 2011 @@ -357,6 +357,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 Modified: hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/conf/Configuration.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/conf/Configuration.java?rev=1055209&r1=1055208&r2=1055209&view=diff ============================================================================== --- hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/conf/Configuration.java (original) +++ hadoop/common/branches/branch-0.22/src/java/org/apache/hadoop/conf/Configuration.java Tue Jan 4 22:17:44 2011 @@ -1578,52 +1578,67 @@ public class Configuration implements It * * @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; } /**