Browse Source

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
stable-2.3
Colby Ranger 12 years ago
parent
commit
7fbd6588be
  1. 6
      org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsGarbageCollector.java
  2. 19
      org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java

6
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);
}
});

19
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;
}
/**

Loading…
Cancel
Save