Add GC_REST PackSource to better order DFS packs
Force reads to use a search ordering of: INSERT / RECEIVE COMPACT GC (heads) GC_REST (non-heads) GC_TXN (refs/txn) UNREACHABLE_GARBAGE This has provided decent performance for object lookups. Starting from an arbitrary reference may find the content in a newer pack created by DfsObjectInserter or a ReceivePack server. Compaction of recent packs also contains newer content, and then most interesting data is in the "main" GC pack. As the GC pack is self-contained (has no edges leading outside) readers typically do not need to go further. Adding a new GC_REST PackSource allows the DfsGarbageCollector to identify to the pack ordering code which pack is which, so the non-heads are scanned second during reads. This removes a hack that was unique to Google's implementation that enforced this behavior by fixing up the lastModified timestamp. Renumber the PackSource's categories to reflect this search ordering. Change-Id: I19fdaab8a8d6687cbe8c88488e6daa0630bf189a
This commit is contained in:
parent
5fe44ed3ee
commit
30eb6423a2
|
@ -44,6 +44,7 @@
|
|||
package org.eclipse.jgit.internal.storage.dfs;
|
||||
|
||||
import static org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource.GC;
|
||||
import static org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource.GC_REST;
|
||||
import static org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource.GC_TXN;
|
||||
import static org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource.UNREACHABLE_GARBAGE;
|
||||
import static org.eclipse.jgit.internal.storage.pack.PackExt.BITMAP_INDEX;
|
||||
|
@ -299,6 +300,7 @@ private void packHeads(ProgressMonitor pm) throws IOException {
|
|||
writePack(GC, pw, pm);
|
||||
}
|
||||
}
|
||||
|
||||
private void packRest(ProgressMonitor pm) throws IOException {
|
||||
if (nonHeads.isEmpty())
|
||||
return;
|
||||
|
@ -308,7 +310,7 @@ private void packRest(ProgressMonitor pm) throws IOException {
|
|||
pw.excludeObjects(packedObjs);
|
||||
pw.preparePack(pm, nonHeads, allHeads);
|
||||
if (0 < pw.getObjectCount())
|
||||
writePack(GC, pw, pm);
|
||||
writePack(GC_REST, pw, pm);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -79,24 +79,6 @@ public static enum PackSource {
|
|||
*/
|
||||
RECEIVE(0),
|
||||
|
||||
/**
|
||||
* Pack was created by Git garbage collection by this implementation.
|
||||
* <p>
|
||||
* This source is only used by the {@link DfsGarbageCollector} when it
|
||||
* builds a pack file by traversing the object graph and copying all
|
||||
* reachable objects into a new pack stream.
|
||||
*
|
||||
* @see DfsGarbageCollector
|
||||
*/
|
||||
GC(1),
|
||||
|
||||
/**
|
||||
* RefTreeGraph pack was created by Git garbage collection.
|
||||
*
|
||||
* @see DfsGarbageCollector
|
||||
*/
|
||||
GC_TXN(1),
|
||||
|
||||
/**
|
||||
* The pack was created by compacting multiple packs together.
|
||||
* <p>
|
||||
|
@ -108,6 +90,27 @@ public static enum PackSource {
|
|||
*/
|
||||
COMPACT(1),
|
||||
|
||||
/**
|
||||
* Pack was created by Git garbage collection by this implementation.
|
||||
* <p>
|
||||
* This source is only used by the {@link DfsGarbageCollector} when it
|
||||
* builds a pack file by traversing the object graph and copying all
|
||||
* reachable objects into a new pack stream.
|
||||
*
|
||||
* @see DfsGarbageCollector
|
||||
*/
|
||||
GC(2),
|
||||
|
||||
/** Created from non-heads by {@link DfsGarbageCollector}. */
|
||||
GC_REST(3),
|
||||
|
||||
/**
|
||||
* RefTreeGraph pack was created by Git garbage collection.
|
||||
*
|
||||
* @see DfsGarbageCollector
|
||||
*/
|
||||
GC_TXN(4),
|
||||
|
||||
/**
|
||||
* Pack was created by Git garbage collection.
|
||||
* <p>
|
||||
|
@ -115,7 +118,7 @@ public static enum PackSource {
|
|||
* last GC pass. It is retained in a new pack until it is safe to prune
|
||||
* these objects from the repository.
|
||||
*/
|
||||
UNREACHABLE_GARBAGE(2);
|
||||
UNREACHABLE_GARBAGE(5);
|
||||
|
||||
final int category;
|
||||
|
||||
|
|
Loading…
Reference in New Issue