]> source.dussan.org Git - jgit.git/commitdiff
Cluster UNREACHABLE_GARBAGE packs at the end of the search list 99/10999/1
authorShawn Pearce <spearce@spearce.org>
Fri, 8 Mar 2013 19:19:44 +0000 (11:19 -0800)
committerShawn Pearce <spearce@spearce.org>
Fri, 8 Mar 2013 19:19:44 +0000 (11:19 -0800)
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

org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java

index 316395535e7a9d2c03875a75e84cd08a86089218..da6722170142f53b6a8f7183d1ee1e0f92202773 100644 (file)
@@ -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;
index 2aa81d9a2573a54fe50a92da148d293292a65cbd..746a64aed53c384395fa7e9ca1746e13d4298663 100644 (file)
@@ -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)