Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColby Ranger2013-01-22 22:54:05 +0000
committerColby Ranger2013-01-22 23:25:15 +0000
commit7fbd6588bed5e5dbed01ad2c85797d86596e5b71 (patch)
treebbf04d9e314029bad8bccee3ce79cd7307258b9b
parent38b503601a6d3552a558751871906354ba1beca5 (diff)
downloadjgit-7fbd6588bed5e5dbed01ad2c85797d86596e5b71.tar.gz
jgit-7fbd6588bed5e5dbed01ad2c85797d86596e5b71.tar.xz
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.java6
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java19
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;
}
/**

Back to the top