diff options
author | Colby Ranger <cranger@google.com> | 2013-01-22 14:54:05 -0800 |
---|---|---|
committer | Colby Ranger <cranger@google.com> | 2013-01-22 15:25:15 -0800 |
commit | 7fbd6588bed5e5dbed01ad2c85797d86596e5b71 (patch) | |
tree | bbf04d9e314029bad8bccee3ce79cd7307258b9b | |
parent | 38b503601a6d3552a558751871906354ba1beca5 (diff) | |
download | jgit-7fbd6588bed5e5dbed01ad2c85797d86596e5b71.tar.gz jgit-7fbd6588bed5e5dbed01ad2c85797d86596e5b71.zip |
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
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsGarbageCollector.java | 6 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/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 21f01ad6b4..76fb521a62 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<ObjectId> packedObjs = pw.getObjectList(); + final ObjectIdOwnerMap<ObjectIdOwnerMap.Entry> 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 b199d4feef..1cf1781289 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<ObjectId> getObjectList() throws IOException { + public ObjectIdOwnerMap<ObjectIdOwnerMap.Entry> getObjectSet() + throws IOException { if (!cachedPacks.isEmpty()) throw new IOException( JGitText.get().cachedPacksPreventsListingObjects); - return Collections.unmodifiableList( - (List<? extends ObjectId>) sortByName()); + ObjectIdOwnerMap<ObjectIdOwnerMap.Entry> objs = new ObjectIdOwnerMap< + ObjectIdOwnerMap.Entry>(); + for (BlockList<ObjectToPack> objList : objectsLists) { + if (objList != null) { + for (ObjectToPack otp : objList) + objs.add(new ObjectIdOwnerMap.Entry(otp) { + // A new entry that copies the ObjectId + }); + } + } + return objs; } /** |