pack-objects: use bitfield for object_entry::depth
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sat, 14 Apr 2018 15:35:03 +0000 (17:35 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Apr 2018 03:38:58 +0000 (12:38 +0900)
Because of struct packing from now on we can only handle max depth
4095 (or even lower when new booleans are added in this struct). This
should be ok since long delta chain will cause significant slow down
anyway.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
Documentation/git-pack-objects.txt
Documentation/git-repack.txt
builtin/pack-objects.c
pack-objects.h
index 2659153cb377554bc5cf6fc4199233b2bab498a2..d97f10722c1683b08d1ef312525c9513c4310d1d 100644 (file)
@@ -2422,6 +2422,7 @@ pack.window::
 pack.depth::
        The maximum delta depth used by linkgit:git-pack-objects[1] when no
        maximum depth is given on the command line. Defaults to 50.
+       Maximum value is 4095.
 
 pack.windowMemory::
        The maximum size of memory that is consumed by each thread
index 81bc490ac52eb9414015979d8c244ce063c838b5..3503c9e3e6352641778d1fa3165c7280718cb2e8 100644 (file)
@@ -96,7 +96,9 @@ base-name::
        it too deep affects the performance on the unpacker
        side, because delta data needs to be applied that many
        times to get to the necessary object.
-       The default value for --window is 10 and --depth is 50.
++
+The default value for --window is 10 and --depth is 50. The maximum
+depth is 4095.
 
 --window-memory=<n>::
        This option provides an additional limit on top of `--window`;
index ae750e9e1149f512dd5889a8081452055ccdb6d7..25c83c4927e23220e7bbccbfd8f32125a2c5ddd6 100644 (file)
@@ -90,7 +90,9 @@ other objects in that pack they already have locally.
        space. `--depth` limits the maximum delta depth; making it too deep
        affects the performance on the unpacker side, because delta data needs
        to be applied that many times to get to the necessary object.
-       The default value for --window is 10 and --depth is 50.
++
+The default value for --window is 10 and --depth is 50. The maximum
+depth is 4095.
 
 --threads=<n>::
        This option is passed through to `git pack-objects`.
index cc3c31747e087f59e086e4fb0e0f8eebc2d4521c..b231e80f17d4c405846ff8a9721c17625d92bfdc 100644 (file)
@@ -3068,6 +3068,12 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
        if (pack_to_stdout != !base_name || argc)
                usage_with_options(pack_usage, pack_objects_options);
 
+       if (depth >= (1 << OE_DEPTH_BITS)) {
+               warning(_("delta chain depth %d is too deep, forcing %d"),
+                       depth, (1 << OE_DEPTH_BITS) - 1);
+               depth = (1 << OE_DEPTH_BITS) - 1;
+       }
+
        argv_array_push(&rp, "pack-objects");
        if (thin) {
                use_internal_rev_list = 1;
index 080ef62d317d174433d754a6313dba7d106b12c1..cdce1648de99fbc64b27a2980079ddb725d136dc 100644 (file)
@@ -2,6 +2,7 @@
 #define PACK_OBJECTS_H
 
 #define OE_DFS_STATE_BITS      2
+#define OE_DEPTH_BITS          12
 
 /*
  * State flags for depth-first search used for analyzing delta cycles.
@@ -89,9 +90,7 @@ struct object_entry {
        unsigned tagged:1; /* near the very tip of refs */
        unsigned filled:1; /* assigned write-order */
        unsigned dfs_state:OE_DFS_STATE_BITS;
-
-       int depth;
-
+       unsigned depth:OE_DEPTH_BITS;
 };
 
 struct packing_data {