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
This commit is contained in:
parent
168bf7b71d
commit
717579f3bd
|
@ -413,6 +413,9 @@ Release 0.22.0 - Unreleased
|
||||||
HADOOP-7038. saveVersion script includes an additional \r while running
|
HADOOP-7038. saveVersion script includes an additional \r while running
|
||||||
whoami under windows. (Wang Xu via cos)
|
whoami under windows. (Wang Xu via cos)
|
||||||
|
|
||||||
|
HADOOP-7082. Configuration.writeXML should not hold lock while outputting
|
||||||
|
(todd)
|
||||||
|
|
||||||
Release 0.21.1 - Unreleased
|
Release 0.21.1 - Unreleased
|
||||||
|
|
||||||
IMPROVEMENTS
|
IMPROVEMENTS
|
||||||
|
|
|
@ -1588,52 +1588,67 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
||||||
*
|
*
|
||||||
* @param out the writer to write to.
|
* @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();
|
Properties properties = getProps();
|
||||||
try {
|
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);
|
DOMSource source = new DOMSource(doc);
|
||||||
StreamResult result = new StreamResult(out);
|
StreamResult result = new StreamResult(out);
|
||||||
TransformerFactory transFactory = TransformerFactory.newInstance();
|
TransformerFactory transFactory = TransformerFactory.newInstance();
|
||||||
Transformer transformer = transFactory.newTransformer();
|
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);
|
transformer.transform(source, result);
|
||||||
} catch (TransformerException te) {
|
} catch (TransformerException te) {
|
||||||
throw new IOException(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) {
|
} catch (ParserConfigurationException pe) {
|
||||||
throw new IOException(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue