From 7fbd6588bed5e5dbed01ad2c85797d86596e5b71 Mon Sep 17 00:00:00 2001 From: Colby Ranger Date: Tue, 22 Jan 2013 14:54:05 -0800 Subject: [PATCH] Reduce memory held and speed up DfsGarbageCollector. getObjectList() returns a list of ObjectToPack. These can hold on to a lot of memory. Furthermore, binary searching for objects in a sorted array can be slow. Improve the speed and reduce the memory by creating a copy of the ObjectId and inserting it into an ObjectIdOwnerMap. Change-Id: Ib5aa5b7447e05938b47fa55812a87b9872c20ea7 --- .../jgit/storage/dfs/DfsGarbageCollector.java | 6 ++++-- .../eclipse/jgit/storage/pack/PackWriter.java | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsGarbageCollector.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsGarbageCollector.java index 21f01ad6b..76fb521a6 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsGarbageCollector.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsGarbageCollector.java @@ -61,6 +61,7 @@ import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.NullProgressMonitor; import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectIdOwnerMap; import org.eclipse.jgit.lib.ProgressMonitor; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.revwalk.RevWalk; @@ -332,10 +333,11 @@ public class DfsGarbageCollector { out.close(); } - final List packedObjs = pw.getObjectList(); + final ObjectIdOwnerMap packedObjs = pw + .getObjectSet(); newPackObj.add(new PackWriter.ObjectIdSet() { public boolean contains(AnyObjectId objectId) { - return 0 <= Collections.binarySearch(packedObjs, objectId); + return packedObjs.contains(objectId); } }); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java index b199d4fee..1cf178128 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java @@ -519,8 +519,7 @@ public class PackWriter { } /** - * Returns the object ids in the pack file that was created by this writer, - * sorted by name. + * Returns the object ids in the pack file that was created by this writer. * * This method can only be invoked after * {@link #writePack(ProgressMonitor, ProgressMonitor, OutputStream)} has @@ -530,13 +529,23 @@ public class PackWriter { * @throws IOException * a cached pack cannot supply its object ids. */ - public List getObjectList() throws IOException { + public ObjectIdOwnerMap getObjectSet() + throws IOException { if (!cachedPacks.isEmpty()) throw new IOException( JGitText.get().cachedPacksPreventsListingObjects); - return Collections.unmodifiableList( - (List) sortByName()); + ObjectIdOwnerMap objs = new ObjectIdOwnerMap< + ObjectIdOwnerMap.Entry>(); + for (BlockList objList : objectsLists) { + if (objList != null) { + for (ObjectToPack otp : objList) + objs.add(new ObjectIdOwnerMap.Entry(otp) { + // A new entry that copies the ObjectId + }); + } + } + return objs; } /**