git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 02/11] pack-objects: turn type and in_pack_type to bitfields

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Mar 17, 2018, 14:10 UTC
Message-ID
<20180317141033.21545-3-pclouds@gmail.com>
In-Reply-To
<20180317141033.21545-1-pclouds@gmail.com>

An extra field type_valid is added to carry the equivalent of OBJ_BAD in the original "type" field. in_pack_type always contains a valid type so we only need 3 bits for it.

A note about accepting OBJ_NONE as "valid" type. The function read_object_list_from_stdin() can pass this value [1] and it eventually calls create_object_entry() where current code skip setting "type" field if the incoming type is zero. This does not have any bad side effects because "type" field should be memset()'d anyway.

But since we also need to set type_valid now, skipping oe_set_type() leaves type_valid zero/false, which will make oe_type() return OBJ_BAD, not OBJ_NONE anymore. Apparently we do care about OBJ_NONE in prepare_pack(). This switch from OBJ_NONE to OBJ_BAD may trigger

    fatal: unable to get type of object ...

Accepting OBJ_NONE [2] does sound wrong, but this is how it is has been for a very long time and I haven't time to dig in further.

[1] See 5c49c11686 (pack-objects: better check_object() performances -
    2007-04-16)
[2] 21666f1aae (convert object type handling from a string to a number
    - 2007-02-26)
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 builtin/pack-objects.c | 60 ++++++++++++++++++++++++------------------
 cache.h                |  2 ++
 object.h               |  1 -
 pack-bitmap-write.c    |  6 ++---
 pack-objects.h         | 20 ++++++++++++--
 5 files changed, 58 insertions(+), 31 deletions(-)
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 5c674b2843..647c01ea34 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -265,7 +265,7 @@ static unsigned long write_no_reuse_object(struct hashfile *f, struct object_ent
 	struct git_istream *st = NULL;
 
 	if (!usable_delta) {
-		if (entry->type == OBJ_BLOB &&
+		if (oe_type(entry) == OBJ_BLOB &&
 		    entry->size > big_file_threshold &&
 		    (st = open_istream(entry->idx.oid.hash, &type, &size, NULL)) != NULL)
 			buf = NULL;
@@ -371,7 +371,7 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry,
 	struct pack_window *w_curs = NULL;
 	struct revindex_entry *revidx;
 	off_t offset;
-	enum object_type type = entry->type;
+	enum object_type type = oe_type(entry);
 	off_t datalen;
 	unsigned char header[MAX_PACK_OBJECT_HEADER],
 		      dheader[MAX_PACK_OBJECT_HEADER];
@@ -480,11 +480,12 @@ static off_t write_object(struct hashfile *f,
 		to_reuse = 0;	/* explicit */
 	else if (!entry->in_pack)
 		to_reuse = 0;	/* can't reuse what we don't have */
-	else if (entry->type == OBJ_REF_DELTA || entry->type == OBJ_OFS_DELTA)
+	else if (oe_type(entry) == OBJ_REF_DELTA ||
+		 oe_type(entry) == OBJ_OFS_DELTA)
 				/* check_object() decided it for us ... */
 		to_reuse = usable_delta;
 				/* ... but pack split may override that */
-	else if (entry->type != entry->in_pack_type)
+	else if (oe_type(entry) != entry->in_pack_type)
 		to_reuse = 0;	/* pack has delta which is unusable */
 	else if (entry->delta)
 		to_reuse = 0;	/* we want to pack afresh */
@@ -705,8 +706,8 @@ static struct object_entry **compute_write_order(void)
 	 * And then all remaining commits and tags.
 	 */
 	for (i = last_untagged; i < to_pack.nr_objects; i++) {
-		if (objects[i].type != OBJ_COMMIT &&
-		    objects[i].type != OBJ_TAG)
+		if (oe_type(&objects[i]) != OBJ_COMMIT &&
+		    oe_type(&objects[i]) != OBJ_TAG)
 			continue;
 		add_to_write_order(wo, &wo_end, &objects[i]);
 	}
@@ -715,7 +716,7 @@ static struct object_entry **compute_write_order(void)
 	 * And then all the trees.
 	 */
 	for (i = last_untagged; i < to_pack.nr_objects; i++) {
-		if (objects[i].type != OBJ_TREE)
+		if (oe_type(&objects[i]) != OBJ_TREE)
 			continue;
 		add_to_write_order(wo, &wo_end, &objects[i]);
 	}
@@ -1066,8 +1067,7 @@ static void create_object_entry(const struct object_id *oid,
 
 	entry = packlist_alloc(&to_pack, oid->hash, index_pos);
 	entry->hash = hash;
-	if (type)
-		entry->type = type;
+	oe_set_type(entry, type);
 	if (exclude)
 		entry->preferred_base = 1;
 	else
@@ -1407,6 +1407,7 @@ static void check_object(struct object_entry *entry)
 		unsigned long avail;
 		off_t ofs;
 		unsigned char *buf, c;
+		enum object_type type;
 
 		buf = use_pack(p, &w_curs, entry->in_pack_offset, &avail);
 
@@ -1415,11 +1416,15 @@ static void check_object(struct object_entry *entry)
 		 * since non-delta representations could still be reused.
 		 */
 		used = unpack_object_header_buffer(buf, avail,
-						   &entry->in_pack_type,
+						   &type,
 						   &entry->size);
 		if (used == 0)
 			goto give_up;
 
+		if (type < 0)
+			die("BUG: invalid type %d", type);
+		entry->in_pack_type = type;
+
 		/*
 		 * Determine if this is a delta and if so whether we can
 		 * reuse it or not.  Otherwise let's find out as cheaply as
@@ -1428,9 +1433,9 @@ static void check_object(struct object_entry *entry)
 		switch (entry->in_pack_type) {
 		default:
 			/* Not a delta hence we've already got all we need. */
-			entry->type = entry->in_pack_type;
+			oe_set_type(entry, entry->in_pack_type);
 			entry->in_pack_header_size = used;
-			if (entry->type < OBJ_COMMIT || entry->type > OBJ_BLOB)
+			if (oe_type(entry) < OBJ_COMMIT || oe_type(entry) > OBJ_BLOB)
 				goto give_up;
 			unuse_pack(&w_curs);
 			return;
@@ -1484,7 +1489,7 @@ static void check_object(struct object_entry *entry)
 			 * deltify other objects against, in order to avoid
 			 * circular deltas.
 			 */
-			entry->type = entry->in_pack_type;
+			oe_set_type(entry, entry->in_pack_type);
 			entry->delta = base_entry;
 			entry->delta_size = entry->size;
 			entry->delta_sibling = base_entry->delta_child;
@@ -1493,7 +1498,7 @@ static void check_object(struct object_entry *entry)
 			return;
 		}
 
-		if (entry->type) {
+		if (oe_type(entry)) {
 			/*
 			 * This must be a delta and we already know what the
 			 * final object type is.  Let's extract the actual
@@ -1516,7 +1521,7 @@ static void check_object(struct object_entry *entry)
 		unuse_pack(&w_curs);
 	}
 
-	entry->type = sha1_object_info(entry->idx.oid.hash, &entry->size);
+	oe_set_type(entry, sha1_object_info(entry->idx.oid.hash, &entry->size));
 	/*
 	 * The error condition is checked in prepare_pack().  This is
 	 * to permit a missing preferred base object to be ignored
@@ -1559,6 +1564,7 @@ static void drop_reused_delta(struct object_entry *entry)
 {
 	struct object_entry **p = &entry->delta->delta_child;
 	struct object_info oi = OBJECT_INFO_INIT;
+	enum object_type type;
 
 	while (*p) {
 		if (*p == entry)
@@ -1570,16 +1576,18 @@ static void drop_reused_delta(struct object_entry *entry)
 	entry->depth = 0;
 
 	oi.sizep = &entry->size;
-	oi.typep = &entry->type;
+	oi.typep = &type;
 	if (packed_object_info(entry->in_pack, entry->in_pack_offset, &oi) < 0) {
 		/*
 		 * We failed to get the info from this pack for some reason;
 		 * fall back to sha1_object_info, which may find another copy.
-		 * And if that fails, the error will be recorded in entry->type
+		 * And if that fails, the error will be recorded in oe_type(entry)
 		 * and dealt with in prepare_pack().
 		 */
-		entry->type = sha1_object_info(entry->idx.oid.hash,
-					       &entry->size);
+		oe_set_type(entry, sha1_object_info(entry->idx.oid.hash,
+						    &entry->size));
+	} else {
+		oe_set_type(entry, type);
 	}
 }
 
@@ -1747,10 +1755,12 @@ static int type_size_sort(const void *_a, const void *_b)
 {
 	const struct object_entry *a = *(struct object_entry **)_a;
 	const struct object_entry *b = *(struct object_entry **)_b;
+	enum object_type a_type = oe_type(a);
+	enum object_type b_type = oe_type(b);
 
-	if (a->type > b->type)
+	if (a_type > b_type)
 		return -1;
-	if (a->type < b->type)
+	if (a_type < b_type)
 		return 1;
 	if (a->hash > b->hash)
 		return -1;
@@ -1826,7 +1836,7 @@ static int try_delta(struct unpacked *trg, struct unpacked *src,
 	void *delta_buf;
 
 	/* Don't bother doing diffs between different types */
-	if (trg_entry->type != src_entry->type)
+	if (oe_type(trg_entry) != oe_type(src_entry))
 		return -1;
 
 	/*
@@ -2432,11 +2442,11 @@ static void prepare_pack(int window, int depth)
 
 		if (!entry->preferred_base) {
 			nr_deltas++;
-			if (entry->type < 0)
+			if (oe_type(entry) < 0)
 				die("unable to get type of object %s",
 				    oid_to_hex(&entry->idx.oid));
 		} else {
-			if (entry->type < 0) {
+			if (oe_type(entry) < 0) {
 				/*
 				 * This object is not found, but we
 				 * don't have to include it anyway.
@@ -2545,7 +2555,7 @@ static void read_object_list_from_stdin(void)
 			die("expected object ID, got garbage:\n %s", line);
 
 		add_preferred_base_object(p + 1);
-		add_object_entry(&oid, 0, p + 1, 0);
+		add_object_entry(&oid, OBJ_NONE, p + 1, 0);
 	}
 }
 
diff --git a/cache.h b/cache.h
index 21fbcc2414..862bdff83a 100644
--- a/cache.h
+++ b/cache.h
@@ -373,6 +373,8 @@ extern void free_name_hash(struct index_state *istate);
 #define read_blob_data_from_cache(path, sz) read_blob_data_from_index(&the_index, (path), (sz))
 #endif
 
+#define TYPE_BITS 3
+
 enum object_type {
 	OBJ_BAD = -1,
 	OBJ_NONE = 0,
diff --git a/object.h b/object.h
index 87563d9056..8ce294d6ec 100644
--- a/object.h
+++ b/object.h
@@ -25,7 +25,6 @@ struct object_array {
 
 #define OBJECT_ARRAY_INIT { 0, 0, NULL }
 
-#define TYPE_BITS   3
 /*
  * object flag allocation:
  * revision.h:      0---------10                                26
diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c
index e01f992884..fd11f08940 100644
--- a/pack-bitmap-write.c
+++ b/pack-bitmap-write.c
@@ -64,12 +64,12 @@ void bitmap_writer_build_type_index(struct pack_idx_entry **index,
 
 		entry->in_pack_pos = i;
 
-		switch (entry->type) {
+		switch (oe_type(entry)) {
 		case OBJ_COMMIT:
 		case OBJ_TREE:
 		case OBJ_BLOB:
 		case OBJ_TAG:
-			real_type = entry->type;
+			real_type = oe_type(entry);
 			break;
 
 		default:
@@ -98,7 +98,7 @@ void bitmap_writer_build_type_index(struct pack_idx_entry **index,
 		default:
 			die("Missing type information for %s (%d/%d)",
 			    oid_to_hex(&entry->idx.oid), real_type,
-			    entry->type);
+			    oe_type(entry));
 		}
 	}
 }
diff --git a/pack-objects.h b/pack-objects.h
index de91edd264..5f568b609c 100644
--- a/pack-objects.h
+++ b/pack-objects.h
@@ -59,8 +59,9 @@ struct object_entry {
 	void *delta_data;	/* cached delta (uncompressed) */
 	unsigned long delta_size;	/* delta data size (uncompressed) */
 	unsigned long z_delta_size;	/* delta data size (compressed) */
-	enum object_type type;
-	enum object_type in_pack_type;	/* could be delta */
+	unsigned type_:TYPE_BITS;
+	unsigned in_pack_type:TYPE_BITS; /* could be delta */
+	unsigned type_valid:1;
 	uint32_t hash;			/* name hint hash */
 	unsigned int in_pack_pos;
 	unsigned char in_pack_header_size;
@@ -123,4 +124,19 @@ static inline uint32_t pack_name_hash(const char *name)
 	return hash;
 }
 
+static inline enum object_type oe_type(const struct object_entry *e)
+{
+	return e->type_valid ? e->type_ : OBJ_BAD;
+}
+
+static inline void oe_set_type(struct object_entry *e,
+			       enum object_type type)
+{
+	if (type >= OBJ_ANY)
+		die("BUG: OBJ_ANY cannot be set in pack-objects code");
+
+	e->type_valid = type >= OBJ_NONE;
+	e->type_ = (unsigned)type;
+}
+
 #endif
-- 
2.17.0.rc0.347.gf9cf61673a
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 96 of 273 in “Reduce pack-objects memory footprint?”
  1. Duy NguyenFeb 28, 2018
  2. Jeff KingFeb 28, 2018
  3. Duy NguyenFeb 28, 2018
  4. Jeff KingFeb 28, 2018
  5. Duy NguyenFeb 28, 2018
  6. Eric WongFeb 28, 2018
  7. Duy NguyenMar 1, 2018
  8. 00/11 Reduce pack-objects memory footprintNguyễn Thái Ngọc Duy, Mar 1, 2018
  9. 01/11 pack-objects: document holes in struct object_entry.hNguyễn Thái Ngọc Duy, Mar 1, 2018
  10. 02/11 pack-objects: turn type and in_pack_type to bitfieldsNguyễn Thái Ngọc Duy, Mar 1, 2018
  11. 03/11 pack-objects: use bitfield for object_entry::dfs_stateNguyễn Thái Ngọc Duy, Mar 1, 2018
  12. 04/11 pack-objects: use bitfield for object_entry::depthNguyễn Thái Ngọc Duy, Mar 1, 2018
  13. Junio C HamanoMar 1, 2018
  14. 06/11 pack-objects: move in_pack_pos out of struct object_entryNguyễn Thái Ngọc Duy, Mar 1, 2018
  15. 08/11 pack-objects: faster reverse packed_git lookupNguyễn Thái Ngọc Duy, Mar 1, 2018
  16. 05/11 pack-objects: note about in_pack_header_sizeNguyễn Thái Ngọc Duy, Mar 1, 2018
  17. 07/11 pack-objects: move in_pack out of struct object_entryNguyễn Thái Ngọc Duy, Mar 1, 2018
  18. Ævar Arnfjörð BjarmasonMar 1, 2018
  19. Jeff KingMar 1, 2018
  20. Duy NguyenMar 2, 2018
  21. Junio C HamanoMar 1, 2018
  22. 09/11 pack-objects: refer to delta objects by index instead of pointerNguyễn Thái Ngọc Duy, Mar 1, 2018
  23. Junio C HamanoMar 1, 2018
  24. 10/11 pack-objects: reorder 'hash' to pack struct object_entryNguyễn Thái Ngọc Duy, Mar 1, 2018
  25. 11/11 pack-objects: increase pack file limit to 4096Nguyễn Thái Ngọc Duy, Mar 1, 2018
  26. Ævar Arnfjörð BjarmasonMar 1, 2018
  27. Duy NguyenMar 2, 2018
  28. Jeff KingMar 2, 2018
  29. 0/9 Reduce pack-objects memory footprintNguyễn Thái Ngọc Duy, Mar 3, 2018
  30. 1/9 pack-objects: document holes in struct object_entry.hNguyễn Thái Ngọc Duy, Mar 3, 2018
  31. 2/9 pack-objects: turn type and in_pack_type to bitfieldsNguyễn Thái Ngọc Duy, Mar 3, 2018
  32. 3/9 pack-objects: use bitfield for object_entry::dfs_stateNguyễn Thái Ngọc Duy, Mar 3, 2018
  33. 4/9 pack-objects: use bitfield for object_entry::depthNguyễn Thái Ngọc Duy, Mar 3, 2018
  34. 5/9 pack-objects: note about in_pack_header_sizeNguyễn Thái Ngọc Duy, Mar 3, 2018
  35. 6/9 pack-objects: move in_pack_pos out of struct object_entryNguyễn Thái Ngọc Duy, Mar 3, 2018
  36. 7/9 pack-objects: move in_pack out of struct object_entryNguyễn Thái Ngọc Duy, Mar 3, 2018
  37. 8/9 pack-objects: refer to delta objects by index instead of pointerNguyễn Thái Ngọc Duy, Mar 3, 2018
  38. 9/9 pack-objects: reorder 'hash' to pack struct object_entryNguyễn Thái Ngọc Duy, Mar 3, 2018
  39. Duy NguyenMar 5, 2018
  40. 00/12 Reduce pack-objects memory footprintNguyễn Thái Ngọc Duy, Mar 8, 2018
  41. 01/12 pack-objects: a bit of document about struct object_entryNguyễn Thái Ngọc Duy, Mar 8, 2018
  42. Junio C HamanoMar 9, 2018
  43. 02/12 pack-objects: turn type and in_pack_type to bitfieldsNguyễn Thái Ngọc Duy, Mar 8, 2018
  44. Junio C HamanoMar 9, 2018
  45. Duy NguyenMar 12, 2018
  46. 03/12 pack-objects: use bitfield for object_entry::dfs_stateNguyễn Thái Ngọc Duy, Mar 8, 2018
  47. 04/12 pack-objects: use bitfield for object_entry::depthNguyễn Thái Ngọc Duy, Mar 8, 2018
  48. Junio C HamanoMar 9, 2018
  49. 05/12 pack-objects: note about in_pack_header_sizeNguyễn Thái Ngọc Duy, Mar 8, 2018
  50. 06/12 pack-objects: move in_pack_pos out of struct object_entryNguyễn Thái Ngọc Duy, Mar 8, 2018
  51. 07/12 pack-objects: move in_pack out of struct object_entryNguyễn Thái Ngọc Duy, Mar 8, 2018
  52. Junio C HamanoMar 9, 2018
  53. 08/12 pack-objects: refer to delta objects by index instead of pointerNguyễn Thái Ngọc Duy, Mar 8, 2018
  54. Junio C HamanoMar 14, 2018
  55. 09/12 pack-objects: reorder 'hash' to pack struct object_entryNguyễn Thái Ngọc Duy, Mar 8, 2018
  56. 10/12 pack-objects: shrink z_delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 8, 2018
  57. 11/12 pack-objects: shrink size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 8, 2018
  58. 12/12 pack-objects: shrink delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 8, 2018
  59. 00/11 nd/pack-objects-pack-struct updatesNguyễn Thái Ngọc Duy, Mar 16, 2018
  60. 01/11 pack-objects: a bit of document about struct object_entryNguyễn Thái Ngọc Duy, Mar 16, 2018
  61. Junio C HamanoMar 16, 2018
  62. Duy NguyenMar 17, 2018
  63. 02/11 pack-objects: turn type and in_pack_type to bitfieldsNguyễn Thái Ngọc Duy, Mar 16, 2018
  64. Junio C HamanoMar 16, 2018
  65. 04/11 pack-objects: use bitfield for object_entry::depthNguyễn Thái Ngọc Duy, Mar 16, 2018
  66. 05/11 pack-objects: move in_pack_pos out of struct object_entryNguyễn Thái Ngọc Duy, Mar 16, 2018
  67. 03/11 pack-objects: use bitfield for object_entry::dfs_stateNguyễn Thái Ngọc Duy, Mar 16, 2018
  68. 08/11 pack-objects: shrink z_delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 16, 2018
  69. Junio C HamanoMar 16, 2018
  70. 11/11 pack-objects.h: reorder members to shrink struct object_entryNguyễn Thái Ngọc Duy, Mar 16, 2018
  71. Junio C HamanoMar 16, 2018
  72. Duy NguyenMar 17, 2018
  73. 07/11 pack-objects: refer to delta objects by index instead of pointerNguyễn Thái Ngọc Duy, Mar 16, 2018
  74. Junio C HamanoMar 16, 2018
  75. 10/11 pack-objects: shrink delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 16, 2018
  76. 06/11 pack-objects: move in_pack out of struct object_entryNguyễn Thái Ngọc Duy, Mar 16, 2018
  77. Stefan BellerMar 26, 2018
  78. 09/11 pack-objects: shrink size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 16, 2018
  79. Junio C HamanoMar 16, 2018
  80. Junio C HamanoMar 16, 2018
  81. 00/11 nd/pack-objects-pack-struct updatesNguyễn Thái Ngọc Duy, Mar 17, 2018
  82. 01/11 pack-objects: a bit of document about struct object_entryNguyễn Thái Ngọc Duy, Mar 17, 2018
  83. 03/11 pack-objects: use bitfield for object_entry::dfs_stateNguyễn Thái Ngọc Duy, Mar 17, 2018
  84. 04/11 pack-objects: use bitfield for object_entry::depthNguyễn Thái Ngọc Duy, Mar 17, 2018
  85. Ævar Arnfjörð BjarmasonMar 17, 2018
  86. 07/11 pack-objects: refer to delta objects by index instead of pointerNguyễn Thái Ngọc Duy, Mar 17, 2018
  87. 08/11 pack-objects: shrink z_delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 17, 2018
  88. 09/11 pack-objects: shrink size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 17, 2018
  89. Ævar Arnfjörð BjarmasonMar 17, 2018
  90. Junio C HamanoMar 18, 2018
  91. Duy NguyenMar 18, 2018
  92. 11/11 pack-objects.h: reorder members to shrink struct object_entryNguyễn Thái Ngọc Duy, Mar 17, 2018
  93. Ævar Arnfjörð BjarmasonMar 17, 2018
  94. Duy NguyenMar 18, 2018
  95. 10/11 pack-objects: shrink delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 17, 2018
  96. 02/11 pack-objects: turn type and in_pack_type to bitfieldsNguyễn Thái Ngọc Duy, Mar 17, 2018
  97. 05/11 pack-objects: move in_pack_pos out of struct object_entryNguyễn Thái Ngọc Duy, Mar 17, 2018
  98. 06/11 pack-objects: move in_pack out of struct object_entryNguyễn Thái Ngọc Duy, Mar 17, 2018
  99. Ævar Arnfjörð BjarmasonMar 17, 2018
  100. Ævar Arnfjörð BjarmasonMar 17, 2018
  101. 00/11 nd/pack-objects-pack-struct updatesNguyễn Thái Ngọc Duy, Mar 18, 2018
  102. 01/11 pack-objects: a bit of document about struct object_entryNguyễn Thái Ngọc Duy, Mar 18, 2018
  103. 02/11 pack-objects: turn type and in_pack_type to bitfieldsNguyễn Thái Ngọc Duy, Mar 18, 2018
  104. 03/11 pack-objects: use bitfield for object_entry::dfs_stateNguyễn Thái Ngọc Duy, Mar 18, 2018
  105. 04/11 pack-objects: use bitfield for object_entry::depthNguyễn Thái Ngọc Duy, Mar 18, 2018
  106. 05/11 pack-objects: move in_pack_pos out of struct object_entryNguyễn Thái Ngọc Duy, Mar 18, 2018
  107. 08/11 pack-objects: shrink z_delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 18, 2018
  108. 06/11 pack-objects: move in_pack out of struct object_entryNguyễn Thái Ngọc Duy, Mar 18, 2018
  109. 07/11 pack-objects: refer to delta objects by index instead of pointerNguyễn Thái Ngọc Duy, Mar 18, 2018
  110. 11/11 pack-objects: reorder members to shrink struct object_entryNguyễn Thái Ngọc Duy, Mar 18, 2018
  111. 09/11 pack-objects: shrink size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 18, 2018
  112. Ævar Arnfjörð BjarmasonMar 18, 2018
  113. Junio C HamanoMar 19, 2018
  114. Duy NguyenMar 19, 2018
  115. Junio C HamanoMar 19, 2018
  116. Duy NguyenMar 19, 2018
  117. Junio C HamanoMar 19, 2018
  118. Duy NguyenMar 19, 2018
  119. Junio C HamanoMar 19, 2018
  120. Duy NguyenMar 20, 2018
  121. Junio C HamanoMar 20, 2018
  122. Jeff KingMar 21, 2018
  123. Duy NguyenMar 21, 2018
  124. Duy NguyenMar 20, 2018
  125. 10/11 pack-objects: shrink delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 18, 2018
  126. Ævar Arnfjörð BjarmasonMar 18, 2018
  127. Jeff KingMar 21, 2018
  128. Duy NguyenMar 21, 2018
  129. Ævar Arnfjörð BjarmasonMar 21, 2018
  130. Duy NguyenMar 21, 2018
  131. Duy NguyenMar 21, 2018
  132. Junio C HamanoMar 21, 2018
  133. Jeff KingMar 22, 2018
  134. Jeff KingMar 22, 2018
  135. Duy NguyenMar 22, 2018
  136. Jeff KingMar 22, 2018
  137. Duy NguyenMar 22, 2018
  138. Ramsay JonesMar 23, 2018
  139. Jeff KingMar 23, 2018
  140. Jeff KingMar 23, 2018
  141. Ramsay JonesMar 23, 2018
  142. Jeff KingMar 24, 2018
  143. Duy NguyenMar 23, 2018
  144. Ramsay JonesMar 23, 2018
  145. Ævar Arnfjörð BjarmasonMar 21, 2018
  146. Junio C HamanoMar 21, 2018
  147. Duy NguyenMar 21, 2018
  148. Jeff KingMar 22, 2018
  149. Duy NguyenMar 22, 2018
  150. Jeff KingMar 22, 2018
  151. 00/13 nd/pack-objects-pack-struct updatesNguyễn Thái Ngọc Duy, Mar 24, 2018
  152. 01/13 pack-objects: a bit of document about struct object_entryNguyễn Thái Ngọc Duy, Mar 24, 2018
  153. 03/13 pack-objects: use bitfield for object_entry::dfs_stateNguyễn Thái Ngọc Duy, Mar 24, 2018
  154. Jeff KingMar 30, 2018
  155. 04/13 pack-objects: use bitfield for object_entry::depthNguyễn Thái Ngọc Duy, Mar 24, 2018
  156. Jeff KingMar 30, 2018
  157. 13/13 pack-objects: reorder members to shrink struct object_entryNguyễn Thái Ngọc Duy, Mar 24, 2018
  158. Jeff KingMar 30, 2018
  159. Duy NguyenMar 31, 2018
  160. 11/13 pack-objects: shrink size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 24, 2018
  161. Jeff KingMar 30, 2018
  162. 02/13 pack-objects: turn type and in_pack_type to bitfieldsNguyễn Thái Ngọc Duy, Mar 24, 2018
  163. Jeff KingMar 30, 2018
  164. 12/13 pack-objects: shrink delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 24, 2018
  165. Jeff KingMar 30, 2018
  166. Duy NguyenMar 31, 2018
  167. Duy NguyenMar 31, 2018
  168. 06/13 pack-objects: move in_pack out of struct object_entryNguyễn Thái Ngọc Duy, Mar 24, 2018
  169. Ævar Arnfjörð BjarmasonMar 24, 2018
  170. Duy NguyenMar 24, 2018
  171. Ævar Arnfjörð BjarmasonMar 24, 2018
  172. Jeff KingMar 30, 2018
  173. Duy NguyenMar 31, 2018
  174. Jeff KingMar 31, 2018
  175. Duy NguyenMar 31, 2018
  176. 05/13 pack-objects: move in_pack_pos out of struct object_entryNguyễn Thái Ngọc Duy, Mar 24, 2018
  177. Jeff KingMar 30, 2018
  178. 10/13 pack-objects: clarify the use of object_entry::sizeNguyễn Thái Ngọc Duy, Mar 24, 2018
  179. Jeff KingMar 30, 2018
  180. Duy NguyenMar 31, 2018
  181. Jeff KingMar 31, 2018
  182. 09/13 pack-objects: don't check size when the object is badNguyễn Thái Ngọc Duy, Mar 24, 2018
  183. 07/13 pack-objects: refer to delta objects by index instead of pointerNguyễn Thái Ngọc Duy, Mar 24, 2018
  184. Jeff KingMar 30, 2018
  185. 08/13 pack-objects: shrink z_delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 24, 2018
  186. Jeff KingMar 30, 2018
  187. Duy NguyenMar 31, 2018
  188. Jeff KingMar 31, 2018
  189. Jeff KingMar 26, 2018
  190. Duy NguyenMar 26, 2018
  191. Jeff KingMar 27, 2018
  192. 00/15 nd/pack-objects-pack-struct updatesNguyễn Thái Ngọc Duy, Mar 31, 2018
  193. 01/15 t/README: mention about running the test suite in special modesNguyễn Thái Ngọc Duy, Mar 31, 2018
  194. 02/15 pack-objects: a bit of document about struct object_entryNguyễn Thái Ngọc Duy, Mar 31, 2018
  195. 07/15 pack-objects: move in_pack out of struct object_entryNguyễn Thái Ngọc Duy, Mar 31, 2018
  196. 06/15 pack-objects: move in_pack_pos out of struct object_entryNguyễn Thái Ngọc Duy, Mar 31, 2018
  197. 05/15 pack-objects: use bitfield for object_entry::depthNguyễn Thái Ngọc Duy, Mar 31, 2018
  198. 04/15 pack-objects: use bitfield for object_entry::dfs_stateNguyễn Thái Ngọc Duy, Mar 31, 2018
  199. 08/15 pack-objects: refer to delta objects by index instead of pointerNguyễn Thái Ngọc Duy, Mar 31, 2018
  200. 14/15 pack-objects: reorder members to shrink struct object_entryNguyễn Thái Ngọc Duy, Mar 31, 2018
  201. 15/15 ci: exercise the whole test suite with uncommon code in pack-objectsNguyễn Thái Ngọc Duy, Mar 31, 2018
  202. 10/15 pack-objects: don't check size when the object is badNguyễn Thái Ngọc Duy, Mar 31, 2018
  203. 13/15 pack-objects: shrink delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 31, 2018
  204. 09/15 pack-objects: shrink z_delta_size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 31, 2018
  205. 12/15 pack-objects: shrink size field in struct object_entryNguyễn Thái Ngọc Duy, Mar 31, 2018
  206. 11/15 pack-objects: clarify the use of object_entry::sizeNguyễn Thái Ngọc Duy, Mar 31, 2018
  207. 03/15 pack-objects: turn type and in_pack_type to bitfieldsNguyễn Thái Ngọc Duy, Mar 31, 2018
  208. Ævar Arnfjörð BjarmasonMar 31, 2018
  209. Duy NguyenMar 31, 2018
  210. Ævar Arnfjörð BjarmasonMar 31, 2018
  211. Jeff KingApr 6, 2018
  212. 0/1 Avoid expensive 'repack -ad' in gc --autoNguyễn Thái Ngọc Duy, Mar 1, 2018
  213. 1/1 gc --auto: exclude the largest giant pack in low-memory configNguyễn Thái Ngọc Duy, Mar 1, 2018
  214. Junio C HamanoMar 1, 2018
  215. Duy NguyenMar 2, 2018
  216. Ævar Arnfjörð BjarmasonMar 5, 2018
  217. 0/5 Avoid expensive 'repack -ad' in gc --autoNguyễn Thái Ngọc Duy, Mar 6, 2018
  218. 1/5 fixup! Add a test showing that 'git repack' throws away grafted-away parentsNguyễn Thái Ngọc Duy, Mar 6, 2018
  219. Junio C HamanoMar 6, 2018
  220. 2/5 repack: add --keep-pack optionNguyễn Thái Ngọc Duy, Mar 6, 2018
  221. Junio C HamanoMar 6, 2018
  222. Duy NguyenMar 7, 2018
  223. 3/5 gc --auto: exclude base pack if not enough mem to "repack -ad"Nguyễn Thái Ngọc Duy, Mar 6, 2018
  224. Junio C HamanoMar 6, 2018
  225. Duy NguyenMar 7, 2018
  226. Junio C HamanoMar 7, 2018
  227. Ævar Arnfjörð BjarmasonMar 12, 2018
  228. Junio C HamanoMar 12, 2018
  229. Ævar Arnfjörð BjarmasonMar 12, 2018
  230. Duy NguyenMar 15, 2018
  231. Johannes SchindelinMar 7, 2018
  232. Junio C HamanoMar 7, 2018
  233. Ævar Arnfjörð BjarmasonMar 12, 2018
  234. Duy NguyenMar 15, 2018
  235. Ævar Arnfjörð BjarmasonMar 15, 2018
  236. Duy NguyenMar 16, 2018
  237. 4/5 pack-objects: show some progress when counting kept objectsNguyễn Thái Ngọc Duy, Mar 6, 2018
  238. Ævar Arnfjörð BjarmasonMar 12, 2018
  239. Duy NguyenMar 16, 2018
  240. Duy NguyenMar 16, 2018
  241. 5/5 pack-objects: display progress in get_object_details()Nguyễn Thái Ngọc Duy, Mar 6, 2018
  242. Junio C HamanoMar 6, 2018
  243. 0/7 nd/repack-keep-pack updatesNguyễn Thái Ngọc Duy, Mar 16, 2018
  244. 1/7 repack: add --keep-pack optionNguyễn Thái Ngọc Duy, Mar 16, 2018
  245. 4/7 gc --auto: exclude base pack if not enough mem to "repack -ad"Nguyễn Thái Ngọc Duy, Mar 16, 2018
  246. Ævar Arnfjörð BjarmasonMar 16, 2018
  247. 6/7 pack-objects: show some progress when counting kept objectsNguyễn Thái Ngọc Duy, Mar 16, 2018
  248. 7/7 pack-objects: display progress in get_object_details()Nguyễn Thái Ngọc Duy, Mar 16, 2018
  249. 5/7 gc: handle a corner case in gc.bigPackThresholdNguyễn Thái Ngọc Duy, Mar 16, 2018
  250. Ævar Arnfjörð BjarmasonMar 16, 2018
  251. 2/7 gc: add --keep-base-packNguyễn Thái Ngọc Duy, Mar 16, 2018
  252. Ævar Arnfjörð BjarmasonMar 16, 2018
  253. Duy NguyenMar 19, 2018
  254. Ævar Arnfjörð BjarmasonMar 19, 2018
  255. Ævar Arnfjörð BjarmasonMar 16, 2018
  256. 3/7 gc: detect base packs based on gc.bigPackThreshold configNguyễn Thái Ngọc Duy, Mar 16, 2018
  257. Ævar Arnfjörð BjarmasonMar 16, 2018
  258. 0/7 nd/repack-keep-pack updatesNguyễn Thái Ngọc Duy, Mar 24, 2018
  259. 1/7 t7700: have closing quote of a test at the beginning of lineNguyễn Thái Ngọc Duy, Mar 24, 2018
  260. 4/7 gc: add gc.bigPackThreshold configNguyễn Thái Ngọc Duy, Mar 24, 2018
  261. 3/7 gc: add --keep-largest-pack optionNguyễn Thái Ngọc Duy, Mar 24, 2018
  262. 6/7 gc --auto: exclude base pack if not enough mem to "repack -ad"Nguyễn Thái Ngọc Duy, Mar 24, 2018
  263. 7/7 pack-objects: show some progress when counting kept objectsNguyễn Thái Ngọc Duy, Mar 24, 2018
  264. 5/7 gc: handle a corner case in gc.bigPackThresholdNguyễn Thái Ngọc Duy, Mar 24, 2018
  265. 2/7 repack: add --keep-pack optionNguyễn Thái Ngọc Duy, Mar 24, 2018
  266. Duy NguyenMar 2, 2018
  267. Eric WongMar 2, 2018
  268. Jeff KingMar 2, 2018
  269. Duy NguyenMar 2, 2018
  270. Duy NguyenMar 2, 2018
  271. Why does pack-objects use so much memory on incremental packing?Ævar Arnfjörð Bjarmason, Mar 17, 2018
  272. Duy NguyenMar 18, 2018
  273. Jeff KingMar 20, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.