]> source.dussan.org Git - jgit.git/commitdiff
Do not delta compress objects that have already tried to compress. 11/7211/2
authorColby Ranger <cranger@google.com>
Mon, 13 Aug 2012 20:52:33 +0000 (13:52 -0700)
committerColby Ranger <cranger@google.com>
Mon, 13 Aug 2012 21:29:28 +0000 (14:29 -0700)
If an object is in a pack file already, delta compression will not
attempt to re-compress it. This assumes that the previous
packing already performed the optimal compression attempt, however,
the subclasses of StoredObjectRepresentation may use other heuristics
to determine if the stored format is optimal.

Change-Id: I403de522f4b0dd2667d54f6faed621f392c07786

org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/DeltaWindow.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/ObjectToPack.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/StoredObjectRepresentation.java

index 07dcd943ce8776747010307bf11fd383e01352a4..fead2147bf622e3e9245e22130cfad3e943bba2a 100644 (file)
@@ -141,7 +141,7 @@ class DeltaWindow {
                                }
                                res.set(toSearch[off]);
 
-                               if (res.object.isEdge()) {
+                               if (res.object.isEdge() || res.object.doNotAttemptDelta()) {
                                        // We don't actually want to make a delta for
                                        // them, just need to push them into the window
                                        // so they can be read by other objects.
index 1f4e3e7e2dcfe1f4e5f43fd2ec810940e640e8a1..9c50f8d0150a29da1305ca529a65a56e11ea23c2 100644 (file)
@@ -66,6 +66,10 @@ public class ObjectToPack extends PackedObjectInfo {
 
        private static final int EDGE = 1 << 3;
 
+       private static final int DELTA_ATTEMPTED = 1 << 4;
+
+       private static final int ATTEMPT_DELTA_MASK = REUSE_AS_IS | DELTA_ATTEMPTED;
+
        private static final int TYPE_SHIFT = 5;
 
        private static final int EXT_SHIFT = 8;
@@ -88,7 +92,7 @@ public class ObjectToPack extends PackedObjectInfo {
         * <li>1 bit: canReuseAsIs</li>
         * <li>1 bit: doNotDelta</li>
         * <li>1 bit: edgeObject</li>
-        * <li>1 bit: unused</li>
+        * <li>1 bit: deltaAttempted</li>
         * <li>3 bits: type</li>
         * <li>4 bits: subclass flags (if any)</li>
         * <li>--</li>
@@ -265,6 +269,22 @@ public class ObjectToPack extends PackedObjectInfo {
                flags |= EDGE;
        }
 
+       boolean doNotAttemptDelta() {
+               // Do not attempt if delta attempted and object reuse.
+               return (flags & ATTEMPT_DELTA_MASK) == ATTEMPT_DELTA_MASK;
+       }
+
+       boolean isDeltaAttempted() {
+               return (flags & DELTA_ATTEMPTED) != 0;
+       }
+
+       void setDeltaAttempted(boolean deltaAttempted) {
+               if (deltaAttempted)
+                       flags |= DELTA_ATTEMPTED;
+               else
+                       flags &= ~DELTA_ATTEMPTED;
+       }
+
        /** @return the extended flags on this object, in the range [0x0, 0xf]. */
        protected int getExtendedFlags() {
                return (flags >>> EXT_SHIFT) & EXT_MASK;
index d93e2d6805191e44be8fc89b629c592355fd2a19..99ec75cf9223e94eed2da062ba3dc01a673aebd5 100644 (file)
@@ -1870,6 +1870,7 @@ public class PackWriter {
                        otp.clearReuseAsIs();
                }
 
+               otp.setDeltaAttempted(next.wasDeltaAttempted());
                otp.select(next);
        }
 
index 334ea5ea1933ec3c1bb81f1a4e38337b0130bb58..543bc2f790ac875b70c59089dc2897ca8e3a38e6 100644 (file)
@@ -72,8 +72,9 @@ public class StoredObjectRepresentation {
        }
 
        /**
-        * @return true if this is a delta against another object and this is stored
-        *         in pack delta format.
+        * @return the storage format type, which must be one of
+        *         {@link #PACK_DELTA}, {@link #PACK_WHOLE}, or
+        *         {@link #FORMAT_OTHER}.
         */
        public int getFormat() {
                return FORMAT_OTHER;
@@ -87,4 +88,13 @@ public class StoredObjectRepresentation {
        public ObjectId getDeltaBase() {
                return null;
        }
+
+       /**
+        * @return whether the current representation of the object has had delta
+        *         compression attempted on it.
+        */
+       public boolean wasDeltaAttempted() {
+               int fmt = getFormat();
+               return fmt == PACK_DELTA || fmt == PACK_WHOLE;
+       }
 }