Browse Source

PackWriter: Combine small reuse batches together

If the total number of objects to look for reuse on is under 4096
this is really close to a reasonable batch size for the DHT storage
system to lookup at once.  Combine all of the objects into a single
temporary list, perform reuse, and then prune the main lists if any
duplicate objects were detected from a selected CachedPack.

The intention here is to try and avoid 4 tiny sequential lookups
on the storage system when the time to wait for each of those to
finish is higher than the CPU time required to build (and later
GC) this temporary list.

Change-Id: I528daf9d2f7744dc4a6281750c2d61d8f9da9f3a
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
stable-0.12
Shawn O. Pearce 14 years ago
parent
commit
36a38adf71
  1. 28
      org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java

28
org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java

@ -722,10 +722,30 @@ public class PackWriter {
long start = System.currentTimeMillis();
monitor.beginTask(JGitText.get().searchForReuse, cnt);
searchForReuse(monitor, objectsLists[Constants.OBJ_COMMIT]);
searchForReuse(monitor, objectsLists[Constants.OBJ_TREE]);
searchForReuse(monitor, objectsLists[Constants.OBJ_BLOB]);
searchForReuse(monitor, objectsLists[Constants.OBJ_TAG]);
if (cnt <= 4096) {
// For small object counts, do everything as one list.
BlockList<ObjectToPack> tmp = new BlockList<ObjectToPack>(cnt);
tmp.addAll(objectsLists[Constants.OBJ_COMMIT]);
tmp.addAll(objectsLists[Constants.OBJ_TREE]);
tmp.addAll(objectsLists[Constants.OBJ_BLOB]);
tmp.addAll(objectsLists[Constants.OBJ_TAG]);
searchForReuse(monitor, tmp);
if (pruneCurrentObjectList) {
// If the list was pruned, we need to re-prune the main lists.
pruneEdgesFromObjectList(objectsLists[Constants.OBJ_COMMIT]);
pruneEdgesFromObjectList(objectsLists[Constants.OBJ_TREE]);
pruneEdgesFromObjectList(objectsLists[Constants.OBJ_BLOB]);
pruneEdgesFromObjectList(objectsLists[Constants.OBJ_TAG]);
}
} else {
searchForReuse(monitor, objectsLists[Constants.OBJ_COMMIT]);
searchForReuse(monitor, objectsLists[Constants.OBJ_TREE]);
searchForReuse(monitor, objectsLists[Constants.OBJ_BLOB]);
searchForReuse(monitor, objectsLists[Constants.OBJ_TAG]);
}
monitor.endTask();
stats.timeSearchingForReuse = System.currentTimeMillis() - start;
}

Loading…
Cancel
Save