diff options
author | Shawn Pearce <spearce@spearce.org> | 2013-03-08 11:19:44 -0800 |
---|---|---|
committer | Shawn Pearce <spearce@spearce.org> | 2013-03-08 11:19:44 -0800 |
commit | ea5eef912a66b06dc59320655bd8c31c14507465 (patch) | |
tree | 15dedb27459648460e3a6c34dba4c72121a35165 | |
parent | 3ad454497cdb6a917c00b01c735f5a469b8fb2ff (diff) | |
download | jgit-ea5eef912a66b06dc59320655bd8c31c14507465.tar.gz jgit-ea5eef912a66b06dc59320655bd8c31c14507465.zip |
Cluster UNREACHABLE_GARBAGE packs at the end of the search list
Garbage is unlikely to be used by a reader. Ensure they always
cluster at the end of the search list, no matter what timestamp
was used on the pack files.
Change-Id: I3bed89e9569ee3363c36bb3f73fcd34057a3883f
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java | 16 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java | 9 |
2 files changed, 20 insertions, 5 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java index 316395535e..da67221701 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java @@ -65,7 +65,7 @@ public abstract class DfsObjDatabase extends ObjectDatabase { /** Sources for a pack file. */ public static enum PackSource { /** The pack is created by ObjectInserter due to local activity. */ - INSERT, + INSERT(0), /** * The pack is created by PackParser due to a network event. @@ -76,7 +76,7 @@ public abstract class DfsObjDatabase extends ObjectDatabase { * storage layout preferred by this version. Received packs are likely * to be either compacted or garbage collected in the future. */ - RECEIVE, + RECEIVE(0), /** * Pack was created by Git garbage collection by this implementation. @@ -87,7 +87,7 @@ public abstract class DfsObjDatabase extends ObjectDatabase { * * @see DfsGarbageCollector */ - GC, + GC(1), /** * The pack was created by compacting multiple packs together. @@ -98,7 +98,7 @@ public abstract class DfsObjDatabase extends ObjectDatabase { * * @see DfsPackCompactor */ - COMPACT, + COMPACT(1), /** * Pack was created by Git garbage collection. @@ -107,7 +107,13 @@ public abstract class DfsObjDatabase extends ObjectDatabase { * last GC pass. It is retained in a new pack until it is safe to prune * these objects from the repository. */ - UNREACHABLE_GARBAGE; + UNREACHABLE_GARBAGE(2); + + final int category; + + PackSource(int category) { + this.category = category; + } } private final AtomicReference<PackList> packList; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java index 2aa81d9a25..746a64aed5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java @@ -303,6 +303,15 @@ public class DfsPackDescription implements Comparable<DfsPackDescription> { * the other pack. */ public int compareTo(DfsPackDescription b) { + // Cluster by PackSource, pushing UNREACHABLE_GARBAGE to the end. + PackSource as = getPackSource(); + PackSource bs = b.getPackSource(); + if (as != null && bs != null) { + int cmp = as.category - bs.category; + if (cmp != 0) + return cmp; + } + // Newer packs should sort first. int cmp = Long.signum(b.getLastModified() - getLastModified()); if (cmp != 0) |