Skip to content

Commit

Permalink
[FIXED JENKINS-16301] Optimized Fingerprint.save.
Browse files Browse the repository at this point in the history
  • Loading branch information
jglick committed May 28, 2013
1 parent f6178f4 commit fff90c1
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 3 deletions.
3 changes: 3 additions & 0 deletions changelog.html
Expand Up @@ -58,6 +58,9 @@
<li class=bug>
NPE in <code>DefaultMatrixExecutionStrategyImpl.waitForCompletion</code>.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-18024">issue 18024</a>)
<li class=bug>
Optimizations in fingerprint recording.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-16301">issue 16301</a>)
<li class=bug>
User icon in People broken if Jenkins root URL unconfigured.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-18118">issue 18118</a>)
Expand Down
59 changes: 56 additions & 3 deletions core/src/main/java/hudson/model/Fingerprint.java
Expand Up @@ -51,6 +51,7 @@

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Collection;
Expand All @@ -60,6 +61,7 @@
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.logging.Level;
Expand Down Expand Up @@ -508,7 +510,10 @@ public boolean canConvert(Class type) {

public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
RangeSet src = (RangeSet) source;
writer.setValue(serialize(src));
}

static String serialize(RangeSet src) {
StringBuilder buf = new StringBuilder(src.ranges.size()*10);
for (Range r : src.ranges) {
if(buf.length()>0) buf.append(',');
Expand All @@ -517,7 +522,7 @@ public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingC
else
buf.append(r.start).append('-').append(r.end-1);
}
writer.setValue(buf.toString());
return buf.toString();
}

public Object unmarshal(HierarchicalStreamReader reader, final UnmarshallingContext context) {
Expand Down Expand Up @@ -560,6 +565,8 @@ public void onRenamed(Item item, String oldName, String newName) {
}
}
}

private static final DateConverter DATE_CONVERTER = new DateConverter();

private final Date timestamp;

Expand Down Expand Up @@ -859,7 +866,53 @@ public synchronized void save() throws IOException {
}

void save(File file) throws IOException {
getConfigFile(file).write(this);
if (facets.isEmpty()) {
// JENKINS-16301: fast path for the common case.
PrintWriter w = new PrintWriter(file, "UTF-8");
try {
w.println("<?xml version='1.0' encoding='UTF-8'?>");
w.println("<fingerprint>");
w.print(" <timestamp>");
w.print(DATE_CONVERTER.toString(timestamp));
w.println("</timestamp>");
if (original != null) {
w.println(" <original>");
w.print(" <name>");
w.print(original.name);
w.println("</name>");
w.print(" <number>");
w.print(original.number);
w.println("</number>");
w.println(" </original>");
}
w.print(" <md5sum>");
w.print(Util.toHexString(md5sum));
w.println("</md5sum>");
w.print(" <fileName>");
w.print(fileName);
w.println("</fileName>");
w.println(" <usages>");
for (Map.Entry<String,RangeSet> e : usages.entrySet()) {
w.println(" <entry>");
w.print(" <string>");
w.print(e.getKey());
w.println("</string>");
w.print(" <ranges>");
w.print(RangeSet.ConverterImpl.serialize(e.getValue()));
w.println("</ranges>");
w.println(" </entry>");
}
w.println(" </usages>");
w.println(" <facets/>");
w.print("</fingerprint>");
w.flush();
} finally {
w.close();
}
} else {
// Slower fallback that can persist facets.
getConfigFile(file).write(this);
}
}

/**
Expand Down Expand Up @@ -950,7 +1003,7 @@ private static File getFingerprintFile(byte[] md5sum) {
}

@Override public String toString() {
return "Fingerprint[original=" + original + ",hash=" + getHashString() + ",fileName=" + fileName + ",timestamp=" + new DateConverter().toString(timestamp) + ",usages=" + new TreeMap<String,RangeSet>(usages) + ",facets=" + facets + "]";
return "Fingerprint[original=" + original + ",hash=" + getHashString() + ",fileName=" + fileName + ",timestamp=" + DATE_CONVERTER.toString(timestamp) + ",usages=" + new TreeMap<String,RangeSet>(usages) + ",facets=" + facets + "]";
}

private static final XStream XSTREAM = new XStream2();
Expand Down

0 comments on commit fff90c1

Please sign in to comment.