Merge "PackWriter: Sort commits by parse order to improve locality"
This commit is contained in:
commit
ae0a1340ff
|
@ -1116,6 +1116,7 @@ private void findObjectsToPack(final ProgressMonitor countingMonitor,
|
||||||
final Map<ObjectId, CachedPack> tipToPack = new HashMap<ObjectId, CachedPack>();
|
final Map<ObjectId, CachedPack> tipToPack = new HashMap<ObjectId, CachedPack>();
|
||||||
final RevFlag inCachedPack = walker.newFlag("inCachedPack");
|
final RevFlag inCachedPack = walker.newFlag("inCachedPack");
|
||||||
final RevFlag include = walker.newFlag("include");
|
final RevFlag include = walker.newFlag("include");
|
||||||
|
final RevFlag added = walker.newFlag("added");
|
||||||
|
|
||||||
final RevFlagSet keepOnRestart = new RevFlagSet();
|
final RevFlagSet keepOnRestart = new RevFlagSet();
|
||||||
keepOnRestart.add(inCachedPack);
|
keepOnRestart.add(inCachedPack);
|
||||||
|
@ -1177,13 +1178,15 @@ private void findObjectsToPack(final ProgressMonitor countingMonitor,
|
||||||
int typesToPrune = 0;
|
int typesToPrune = 0;
|
||||||
final int maxBases = config.getDeltaSearchWindowSize();
|
final int maxBases = config.getDeltaSearchWindowSize();
|
||||||
Set<RevTree> baseTrees = new HashSet<RevTree>();
|
Set<RevTree> baseTrees = new HashSet<RevTree>();
|
||||||
RevObject o;
|
List<RevCommit> commits = new ArrayList<RevCommit>();
|
||||||
while ((o = walker.next()) != null) {
|
RevCommit c;
|
||||||
if (o.has(inCachedPack)) {
|
while ((c = walker.next()) != null) {
|
||||||
CachedPack pack = tipToPack.get(o);
|
if (c.has(inCachedPack)) {
|
||||||
|
CachedPack pack = tipToPack.get(c);
|
||||||
if (includesAllTips(pack, include, walker)) {
|
if (includesAllTips(pack, include, walker)) {
|
||||||
useCachedPack(walker, keepOnRestart, //
|
useCachedPack(walker, keepOnRestart, //
|
||||||
wantObjs, haveObjs, pack);
|
wantObjs, haveObjs, pack);
|
||||||
|
commits = new ArrayList<RevCommit>();
|
||||||
|
|
||||||
countingMonitor.endTask();
|
countingMonitor.endTask();
|
||||||
countingMonitor.beginTask(JGitText.get().countingObjects,
|
countingMonitor.beginTask(JGitText.get().countingObjects,
|
||||||
|
@ -1192,16 +1195,36 @@ private void findObjectsToPack(final ProgressMonitor countingMonitor,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (o.has(RevFlag.UNINTERESTING)) {
|
if (c.has(RevFlag.UNINTERESTING)) {
|
||||||
if (baseTrees.size() <= maxBases)
|
if (baseTrees.size() <= maxBases)
|
||||||
baseTrees.add(((RevCommit) o).getTree());
|
baseTrees.add(c.getTree());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
addObject(o, 0);
|
commits.add(c);
|
||||||
countingMonitor.update(1);
|
countingMonitor.update(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (objectsLists[Constants.OBJ_COMMIT] instanceof ArrayList) {
|
||||||
|
ArrayList<ObjectToPack> list = (ArrayList<ObjectToPack>) objectsLists[Constants.OBJ_COMMIT];
|
||||||
|
list.ensureCapacity(list.size() + commits.size());
|
||||||
|
}
|
||||||
|
for (RevCommit cmit : commits) {
|
||||||
|
if (!cmit.has(added)) {
|
||||||
|
cmit.add(added);
|
||||||
|
addObject(cmit, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < cmit.getParentCount(); i++) {
|
||||||
|
RevCommit p = cmit.getParent(i);
|
||||||
|
if (!p.has(added) && !p.has(RevFlag.UNINTERESTING)) {
|
||||||
|
p.add(added);
|
||||||
|
addObject(p, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
commits = null;
|
||||||
|
|
||||||
for (CachedPack p : cachedPacks) {
|
for (CachedPack p : cachedPacks) {
|
||||||
for (ObjectId d : p.hasObject(objectsLists[Constants.OBJ_COMMIT])) {
|
for (ObjectId d : p.hasObject(objectsLists[Constants.OBJ_COMMIT])) {
|
||||||
if (baseTrees.size() <= maxBases)
|
if (baseTrees.size() <= maxBases)
|
||||||
|
@ -1213,6 +1236,7 @@ private void findObjectsToPack(final ProgressMonitor countingMonitor,
|
||||||
|
|
||||||
BaseSearch bases = new BaseSearch(countingMonitor, baseTrees, //
|
BaseSearch bases = new BaseSearch(countingMonitor, baseTrees, //
|
||||||
objectsMap, edgeObjects, reader);
|
objectsMap, edgeObjects, reader);
|
||||||
|
RevObject o;
|
||||||
while ((o = walker.nextObject()) != null) {
|
while ((o = walker.nextObject()) != null) {
|
||||||
if (o.has(RevFlag.UNINTERESTING))
|
if (o.has(RevFlag.UNINTERESTING))
|
||||||
continue;
|
continue;
|
||||||
|
@ -1284,9 +1308,6 @@ private void useCachedPack(ObjectWalk walker, RevFlagSet keepOnRestart,
|
||||||
for (ObjectId id : pack.getTips())
|
for (ObjectId id : pack.getTips())
|
||||||
baseObj.add(walker.lookupOrNull(id));
|
baseObj.add(walker.lookupOrNull(id));
|
||||||
|
|
||||||
objectsMap.clear();
|
|
||||||
objectsLists[Constants.OBJ_COMMIT] = new ArrayList<ObjectToPack>();
|
|
||||||
|
|
||||||
setThin(true);
|
setThin(true);
|
||||||
walker.resetRetain(keepOnRestart);
|
walker.resetRetain(keepOnRestart);
|
||||||
walker.sort(RevSort.TOPO);
|
walker.sort(RevSort.TOPO);
|
||||||
|
|
Loading…
Reference in New Issue