From: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> To: pclouds@gmail.com Cc: avarab@gmail.com, e@80x24.org, git@vger.kernel.org, gitster@pobox.com, peff@peff.net Subject: [PATCH v7 07/13] pack-objects: refer to delta objects by index instead of pointer Date: Sat, 24 Mar 2018 07:33:47 +0100 Message-ID: <20180324063353.24722-8-pclouds@gmail.com> (raw) In-Reply-To: <20180324063353.24722-1-pclouds@gmail.com> These delta pointers always point to elements in the objects[] array in packing_data struct. We can only hold maximum 4G of those objects because the array size in nr_objects is uint32_t. We could use uint32_t indexes to address these elements instead of pointers. On 64-bit architecture (8 bytes per pointer) this would save 4 bytes per pointer. Convert these delta pointers to indexes. Since we need to handle NULL pointers as well, the index is shifted by one [1]. [1] This means we can only index 2^32-2 objects even though nr_objects could contain 2^32-1 objects. It should not be a problem in practice because when we grow objects[], nr_alloc would probably blow up long before nr_objects hits the wall. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> --- builtin/pack-objects.c | 116 ++++++++++++++++++++++------------------- pack-objects.h | 67 ++++++++++++++++++++++-- 2 files changed, 124 insertions(+), 59 deletions(-) diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index b41610569e..f7d3f6a1a8 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -30,6 +30,12 @@ #include "packfile.h" #define IN_PACK(obj) oe_in_pack(&to_pack, obj) +#define DELTA(obj) oe_delta(&to_pack, obj) +#define DELTA_CHILD(obj) oe_delta_child(&to_pack, obj) +#define DELTA_SIBLING(obj) oe_delta_sibling(&to_pack, obj) +#define SET_DELTA(obj, val) oe_set_delta(&to_pack, obj, val) +#define SET_DELTA_CHILD(obj, val) oe_set_delta_child(&to_pack, obj, val) +#define SET_DELTA_SIBLING(obj, val) oe_set_delta_sibling(&to_pack, obj, val) static const char *pack_usage[] = { N_("git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"), @@ -127,11 +133,11 @@ static void *get_delta(struct object_entry *entry) buf = read_sha1_file(entry->idx.oid.hash, &type, &size); if (!buf) die("unable to read %s", oid_to_hex(&entry->idx.oid)); - base_buf = read_sha1_file(entry->delta->idx.oid.hash, &type, + base_buf = read_sha1_file(DELTA(entry)->idx.oid.hash, &type, &base_size); if (!base_buf) die("unable to read %s", - oid_to_hex(&entry->delta->idx.oid)); + oid_to_hex(&DELTA(entry)->idx.oid)); delta_buf = diff_delta(base_buf, base_size, buf, size, &delta_size, 0); if (!delta_buf || delta_size != entry->delta_size) @@ -288,12 +294,12 @@ static unsigned long write_no_reuse_object(struct hashfile *f, struct object_ent size = entry->delta_size; buf = entry->delta_data; entry->delta_data = NULL; - type = (allow_ofs_delta && entry->delta->idx.offset) ? + type = (allow_ofs_delta && DELTA(entry)->idx.offset) ? OBJ_OFS_DELTA : OBJ_REF_DELTA; } else { buf = get_delta(entry); size = entry->delta_size; - type = (allow_ofs_delta && entry->delta->idx.offset) ? + type = (allow_ofs_delta && DELTA(entry)->idx.offset) ? OBJ_OFS_DELTA : OBJ_REF_DELTA; } @@ -317,7 +323,7 @@ static unsigned long write_no_reuse_object(struct hashfile *f, struct object_ent * encoding of the relative offset for the delta * base from this object's position in the pack. */ - off_t ofs = entry->idx.offset - entry->delta->idx.offset; + off_t ofs = entry->idx.offset - DELTA(entry)->idx.offset; unsigned pos = sizeof(dheader) - 1; dheader[pos] = ofs & 127; while (ofs >>= 7) @@ -343,7 +349,7 @@ static unsigned long write_no_reuse_object(struct hashfile *f, struct object_ent return 0; } hashwrite(f, header, hdrlen); - hashwrite(f, entry->delta->idx.oid.hash, 20); + hashwrite(f, DELTA(entry)->idx.oid.hash, 20); hdrlen += 20; } else { if (limit && hdrlen + datalen + 20 >= limit) { @@ -379,8 +385,8 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry, dheader[MAX_PACK_OBJECT_HEADER]; unsigned hdrlen; - if (entry->delta) - type = (allow_ofs_delta && entry->delta->idx.offset) ? + if (DELTA(entry)) + type = (allow_ofs_delta && DELTA(entry)->idx.offset) ? OBJ_OFS_DELTA : OBJ_REF_DELTA; hdrlen = encode_in_pack_object_header(header, sizeof(header), type, entry->size); @@ -408,7 +414,7 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry, } if (type == OBJ_OFS_DELTA) { - off_t ofs = entry->idx.offset - entry->delta->idx.offset; + off_t ofs = entry->idx.offset - DELTA(entry)->idx.offset; unsigned pos = sizeof(dheader) - 1; dheader[pos] = ofs & 127; while (ofs >>= 7) @@ -427,7 +433,7 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry, return 0; } hashwrite(f, header, hdrlen); - hashwrite(f, entry->delta->idx.oid.hash, 20); + hashwrite(f, DELTA(entry)->idx.oid.hash, 20); hdrlen += 20; reused_delta++; } else { @@ -467,13 +473,13 @@ static off_t write_object(struct hashfile *f, else limit = pack_size_limit - write_offset; - if (!entry->delta) + if (!DELTA(entry)) usable_delta = 0; /* no delta */ else if (!pack_size_limit) usable_delta = 1; /* unlimited packfile */ - else if (entry->delta->idx.offset == (off_t)-1) + else if (DELTA(entry)->idx.offset == (off_t)-1) usable_delta = 0; /* base was written to another pack */ - else if (entry->delta->idx.offset) + else if (DELTA(entry)->idx.offset) usable_delta = 1; /* base already exists in this pack */ else usable_delta = 0; /* base could end up in another pack */ @@ -489,7 +495,7 @@ static off_t write_object(struct hashfile *f, /* ... but pack split may override that */ else if (oe_type(entry) != entry->in_pack_type) to_reuse = 0; /* pack has delta which is unusable */ - else if (entry->delta) + else if (DELTA(entry)) to_reuse = 0; /* we want to pack afresh */ else to_reuse = 1; /* we have it in-pack undeltified, @@ -541,12 +547,12 @@ static enum write_one_status write_one(struct hashfile *f, } /* if we are deltified, write out base object first. */ - if (e->delta) { + if (DELTA(e)) { e->idx.offset = 1; /* now recurse */ - switch (write_one(f, e->delta, offset)) { + switch (write_one(f, DELTA(e), offset)) { case WRITE_ONE_RECURSIVE: /* we cannot depend on this one */ - e->delta = NULL; + SET_DELTA(e, NULL); break; default: break; @@ -608,34 +614,34 @@ static void add_descendants_to_write_order(struct object_entry **wo, /* add this node... */ add_to_write_order(wo, endp, e); /* all its siblings... */ - for (s = e->delta_sibling; s; s = s->delta_sibling) { + for (s = DELTA_SIBLING(e); s; s = DELTA_SIBLING(s)) { add_to_write_order(wo, endp, s); } } /* drop down a level to add left subtree nodes if possible */ - if (e->delta_child) { + if (DELTA_CHILD(e)) { add_to_order = 1; - e = e->delta_child; + e = DELTA_CHILD(e); } else { add_to_order = 0; /* our sibling might have some children, it is next */ - if (e->delta_sibling) { - e = e->delta_sibling; + if (DELTA_SIBLING(e)) { + e = DELTA_SIBLING(e); continue; } /* go back to our parent node */ - e = e->delta; - while (e && !e->delta_sibling) { + e = DELTA(e); + while (e && !DELTA_SIBLING(e)) { /* we're on the right side of a subtree, keep * going up until we can go right again */ - e = e->delta; + e = DELTA(e); } if (!e) { /* done- we hit our original root node */ return; } /* pass it off to sibling at this level */ - e = e->delta_sibling; + e = DELTA_SIBLING(e); } }; } @@ -646,7 +652,7 @@ static void add_family_to_write_order(struct object_entry **wo, { struct object_entry *root; - for (root = e; root->delta; root = root->delta) + for (root = e; DELTA(root); root = DELTA(root)) ; /* nothing */ add_descendants_to_write_order(wo, endp, root); } @@ -661,8 +667,8 @@ static struct object_entry **compute_write_order(void) for (i = 0; i < to_pack.nr_objects; i++) { objects[i].tagged = 0; objects[i].filled = 0; - objects[i].delta_child = NULL; - objects[i].delta_sibling = NULL; + SET_DELTA_CHILD(&objects[i], NULL); + SET_DELTA_SIBLING(&objects[i], NULL); } /* @@ -672,11 +678,11 @@ static struct object_entry **compute_write_order(void) */ for (i = to_pack.nr_objects; i > 0;) { struct object_entry *e = &objects[--i]; - if (!e->delta) + if (!DELTA(e)) continue; /* Mark me as the first child */ - e->delta_sibling = e->delta->delta_child; - e->delta->delta_child = e; + e->delta_sibling_idx = DELTA(e)->delta_child_idx; + SET_DELTA_CHILD(DELTA(e), e); } /* @@ -1493,10 +1499,10 @@ static void check_object(struct object_entry *entry) * circular deltas. */ oe_set_type(entry, entry->in_pack_type); - entry->delta = base_entry; + SET_DELTA(entry, base_entry); entry->delta_size = entry->size; - entry->delta_sibling = base_entry->delta_child; - base_entry->delta_child = entry; + entry->delta_sibling_idx = base_entry->delta_child_idx; + SET_DELTA_CHILD(base_entry, entry); unuse_pack(&w_curs); return; } @@ -1567,17 +1573,19 @@ static int pack_offset_sort(const void *_a, const void *_b) */ static void drop_reused_delta(struct object_entry *entry) { - struct object_entry **p = &entry->delta->delta_child; + unsigned *idx = &to_pack.objects[entry->delta_idx - 1].delta_child_idx; struct object_info oi = OBJECT_INFO_INIT; enum object_type type; - while (*p) { - if (*p == entry) - *p = (*p)->delta_sibling; + while (*idx) { + struct object_entry *oe = &to_pack.objects[*idx - 1]; + + if (oe == entry) + *idx = oe->delta_sibling_idx; else - p = &(*p)->delta_sibling; + idx = &oe->delta_sibling_idx; } - entry->delta = NULL; + SET_DELTA(entry, NULL); entry->depth = 0; oi.sizep = &entry->size; @@ -1617,7 +1625,7 @@ static void break_delta_chains(struct object_entry *entry) for (cur = entry, total_depth = 0; cur; - cur = cur->delta, total_depth++) { + cur = DELTA(cur), total_depth++) { if (cur->dfs_state == DFS_DONE) { /* * We've already seen this object and know it isn't @@ -1642,7 +1650,7 @@ static void break_delta_chains(struct object_entry *entry) * it's not a delta, we're done traversing, but we'll mark it * done to save time on future traversals. */ - if (!cur->delta) { + if (!DELTA(cur)) { cur->dfs_state = DFS_DONE; break; } @@ -1665,7 +1673,7 @@ static void break_delta_chains(struct object_entry *entry) * We keep all commits in the chain that we examined. */ cur->dfs_state = DFS_ACTIVE; - if (cur->delta->dfs_state == DFS_ACTIVE) { + if (DELTA(cur)->dfs_state == DFS_ACTIVE) { drop_reused_delta(cur); cur->dfs_state = DFS_DONE; break; @@ -1680,7 +1688,7 @@ static void break_delta_chains(struct object_entry *entry) * an extra "next" pointer to keep going after we reset cur->delta. */ for (cur = entry; cur; cur = next) { - next = cur->delta; + next = DELTA(cur); /* * We should have a chain of zero or more ACTIVE states down to @@ -1865,7 +1873,7 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, /* Now some size filtering heuristics. */ trg_size = trg_entry->size; - if (!trg_entry->delta) { + if (!DELTA(trg_entry)) { max_size = trg_size/2 - 20; ref_depth = 1; } else { @@ -1941,7 +1949,7 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, if (!delta_buf) return 0; - if (trg_entry->delta) { + if (DELTA(trg_entry)) { /* Prefer only shallower same-sized deltas. */ if (delta_size == trg_entry->delta_size && src->depth + 1 >= trg->depth) { @@ -1970,7 +1978,7 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, free(delta_buf); } - trg_entry->delta = src_entry; + SET_DELTA(trg_entry, src_entry); trg_entry->delta_size = delta_size; trg->depth = src->depth + 1; @@ -1979,13 +1987,13 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, static unsigned int check_delta_limit(struct object_entry *me, unsigned int n) { - struct object_entry *child = me->delta_child; + struct object_entry *child = DELTA_CHILD(me); unsigned int m = n; while (child) { unsigned int c = check_delta_limit(child, n + 1); if (m < c) m = c; - child = child->delta_sibling; + child = DELTA_SIBLING(child); } return m; } @@ -2054,7 +2062,7 @@ static void find_deltas(struct object_entry **list, unsigned *list_size, * otherwise they would become too deep. */ max_depth = depth; - if (entry->delta_child) { + if (DELTA_CHILD(entry)) { max_depth -= check_delta_limit(entry, 0); if (max_depth <= 0) goto next; @@ -2104,7 +2112,7 @@ static void find_deltas(struct object_entry **list, unsigned *list_size, * depth, leaving it in the window is pointless. we * should evict it first. */ - if (entry->delta && max_depth <= n->depth) + if (DELTA(entry) && max_depth <= n->depth) continue; /* @@ -2112,7 +2120,7 @@ static void find_deltas(struct object_entry **list, unsigned *list_size, * currently deltified object, to keep it longer. It will * be the first base object to be attempted next. */ - if (entry->delta) { + if (DELTA(entry)) { struct unpacked swap = array[best_base]; int dist = (window + idx - best_base) % window; int dst = best_base; @@ -2433,7 +2441,7 @@ static void prepare_pack(int window, int depth) for (i = 0; i < to_pack.nr_objects; i++) { struct object_entry *entry = to_pack.objects + i; - if (entry->delta) + if (DELTA(entry)) /* This happens if we decided to reuse existing * delta from a pack. "reuse_delta &&" is implied. */ diff --git a/pack-objects.h b/pack-objects.h index cae4f4fe01..433c194ffe 100644 --- a/pack-objects.h +++ b/pack-objects.h @@ -72,11 +72,11 @@ struct object_entry { unsigned long size; /* uncompressed size */ unsigned in_pack_idx:OE_IN_PACK_BITS; /* already in pack */ off_t in_pack_offset; - struct object_entry *delta; /* delta base object */ - struct object_entry *delta_child; /* deltified objects who bases me */ - struct object_entry *delta_sibling; /* other deltified objects who - * uses the same base as me - */ + uint32_t delta_idx; /* delta base object */ + uint32_t delta_child_idx; /* deltified objects who bases me */ + uint32_t delta_sibling_idx; /* other deltified objects who + * uses the same base as me + */ void *delta_data; /* cached delta (uncompressed) */ unsigned long delta_size; /* delta data size (uncompressed) */ unsigned long z_delta_size; /* delta data size (compressed) */ @@ -196,4 +196,61 @@ static inline void oe_set_in_pack(struct packing_data *pack, } +static inline struct object_entry *oe_delta( + const struct packing_data *pack, + const struct object_entry *e) +{ + if (e->delta_idx) + return &pack->objects[e->delta_idx - 1]; + return NULL; +} + +static inline void oe_set_delta(struct packing_data *pack, + struct object_entry *e, + struct object_entry *delta) +{ + if (delta) + e->delta_idx = (delta - pack->objects) + 1; + else + e->delta_idx = 0; +} + +static inline struct object_entry *oe_delta_child( + const struct packing_data *pack, + const struct object_entry *e) +{ + if (e->delta_child_idx) + return &pack->objects[e->delta_child_idx - 1]; + return NULL; +} + +static inline void oe_set_delta_child(struct packing_data *pack, + struct object_entry *e, + struct object_entry *delta) +{ + if (delta) + e->delta_child_idx = (delta - pack->objects) + 1; + else + e->delta_child_idx = 0; +} + +static inline struct object_entry *oe_delta_sibling( + const struct packing_data *pack, + const struct object_entry *e) +{ + if (e->delta_sibling_idx) + return &pack->objects[e->delta_sibling_idx - 1]; + return NULL; +} + +static inline void oe_set_delta_sibling(struct packing_data *pack, + struct object_entry *e, + struct object_entry *delta) +{ + if (delta) + e->delta_sibling_idx = (delta - pack->objects) + 1; + else + e->delta_sibling_idx = 0; +} + #endif -- 2.17.0.rc0.348.gd5a49e0b6f
next prev parent reply index Thread overview: 273+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-02-28 9:27 Reduce pack-objects memory footprint? Duy Nguyen 2018-02-28 10:17 ` Jeff King 2018-02-28 10:58 ` Duy Nguyen 2018-02-28 11:11 ` Jeff King 2018-02-28 11:24 ` Duy Nguyen 2018-02-28 18:22 ` Eric Wong 2018-03-01 9:00 ` Duy Nguyen 2018-03-01 9:10 ` [PATCH 00/11] Reduce pack-objects memory footprint Nguyễn Thái Ngọc Duy 2018-03-01 9:10 ` [PATCH 01/11] pack-objects: document holes in struct object_entry.h Nguyễn Thái Ngọc Duy 2018-03-01 9:10 ` [PATCH 02/11] pack-objects: turn type and in_pack_type to bitfields Nguyễn Thái Ngọc Duy 2018-03-01 9:10 ` [PATCH 03/11] pack-objects: use bitfield for object_entry::dfs_state Nguyễn Thái Ngọc Duy 2018-03-01 9:10 ` [PATCH 04/11] pack-objects: use bitfield for object_entry::depth Nguyễn Thái Ngọc Duy 2018-03-01 18:00 ` Junio C Hamano 2018-03-01 9:10 ` [PATCH 05/11] pack-objects: note about in_pack_header_size Nguyễn Thái Ngọc Duy 2018-03-01 9:10 ` [PATCH 06/11] pack-objects: move in_pack_pos out of struct object_entry Nguyễn Thái Ngọc Duy 2018-03-01 9:10 ` [PATCH 07/11] pack-objects: move in_pack " Nguyễn Thái Ngọc Duy 2018-03-01 12:37 ` Ævar Arnfjörð Bjarmason 2018-03-01 14:49 ` Jeff King 2018-03-02 0:02 ` Duy Nguyen 2018-03-01 18:05 ` Junio C Hamano 2018-03-01 9:10 ` [PATCH 08/11] pack-objects: faster reverse packed_git lookup Nguyễn Thái Ngọc Duy 2018-03-01 9:10 ` [PATCH 09/11] pack-objects: refer to delta objects by index instead of pointer Nguyễn Thái Ngọc Duy 2018-03-01 18:08 ` Junio C Hamano 2018-03-01 9:10 ` [PATCH 10/11] pack-objects: reorder 'hash' to pack struct object_entry Nguyễn Thái Ngọc Duy 2018-03-01 9:10 ` [PATCH 11/11] pack-objects: increase pack file limit to 4096 Nguyễn Thái Ngọc Duy 2018-03-01 13:33 ` [PATCH 00/11] Reduce pack-objects memory footprint Ævar Arnfjörð Bjarmason 2018-03-02 0:14 ` Duy Nguyen 2018-03-02 10:57 ` Jeff King 2018-03-03 2:46 ` [PATCH/RFC v2 0/9] " Nguyễn Thái Ngọc Duy 2018-03-03 2:46 ` [PATCH/RFC v2 1/9] pack-objects: document holes in struct object_entry.h Nguyễn Thái Ngọc Duy 2018-03-03 2:46 ` [PATCH/RFC v2 2/9] pack-objects: turn type and in_pack_type to bitfields Nguyễn Thái Ngọc Duy 2018-03-03 2:47 ` [PATCH/RFC v2 3/9] pack-objects: use bitfield for object_entry::dfs_state Nguyễn Thái Ngọc Duy 2018-03-03 2:47 ` [PATCH/RFC v2 4/9] pack-objects: use bitfield for object_entry::depth Nguyễn Thái Ngọc Duy 2018-03-03 2:47 ` [PATCH/RFC v2 5/9] pack-objects: note about in_pack_header_size Nguyễn Thái Ngọc Duy 2018-03-03 2:47 ` [PATCH/RFC v2 6/9] pack-objects: move in_pack_pos out of struct object_entry Nguyễn Thái Ngọc Duy 2018-03-03 2:47 ` [PATCH/RFC v2 7/9] pack-objects: move in_pack " Nguyễn Thái Ngọc Duy 2018-03-03 2:47 ` [PATCH/RFC v2 8/9] pack-objects: refer to delta objects by index instead of pointer Nguyễn Thái Ngọc Duy 2018-03-03 2:47 ` [PATCH/RFC v2 9/9] pack-objects: reorder 'hash' to pack struct object_entry Nguyễn Thái Ngọc Duy 2018-03-05 9:28 ` [PATCH/RFC v2 0/9] Reduce pack-objects memory footprint Duy Nguyen 2018-03-08 11:42 ` [PATCH/RFC v3 00/12] " Nguyễn Thái Ngọc Duy 2018-03-08 11:42 ` [PATCH/RFC v3 01/12] pack-objects: a bit of document about struct object_entry Nguyễn Thái Ngọc Duy 2018-03-09 22:34 ` Junio C Hamano 2018-03-08 11:42 ` [PATCH/RFC v3 02/12] pack-objects: turn type and in_pack_type to bitfields Nguyễn Thái Ngọc Duy 2018-03-09 22:54 ` Junio C Hamano 2018-03-12 17:51 ` Duy Nguyen 2018-03-08 11:42 ` [PATCH/RFC v3 03/12] pack-objects: use bitfield for object_entry::dfs_state Nguyễn Thái Ngọc Duy 2018-03-08 11:42 ` [PATCH/RFC v3 04/12] pack-objects: use bitfield for object_entry::depth Nguyễn Thái Ngọc Duy 2018-03-09 23:07 ` Junio C Hamano 2018-03-08 11:42 ` [PATCH/RFC v3 05/12] pack-objects: note about in_pack_header_size Nguyễn Thái Ngọc Duy 2018-03-08 11:42 ` [PATCH/RFC v3 06/12] pack-objects: move in_pack_pos out of struct object_entry Nguyễn Thái Ngọc Duy 2018-03-08 11:42 ` [PATCH/RFC v3 07/12] pack-objects: move in_pack " Nguyễn Thái Ngọc Duy 2018-03-09 23:21 ` Junio C Hamano 2018-03-08 11:42 ` [PATCH/RFC v3 08/12] pack-objects: refer to delta objects by index instead of pointer Nguyễn Thái Ngọc Duy 2018-03-14 16:18 ` Junio C Hamano 2018-03-08 11:42 ` [PATCH/RFC v3 09/12] pack-objects: reorder 'hash' to pack struct object_entry Nguyễn Thái Ngọc Duy 2018-03-08 11:42 ` [PATCH/RFC v3 10/12] pack-objects: shrink z_delta_size field in " Nguyễn Thái Ngọc Duy 2018-03-08 11:42 ` [PATCH/RFC v3 11/12] pack-objects: shrink size " Nguyễn Thái Ngọc Duy 2018-03-08 11:42 ` [PATCH/RFC v3 12/12] pack-objects: shrink delta_size " Nguyễn Thái Ngọc Duy 2018-03-16 18:31 ` [PATCH v4 00/11] nd/pack-objects-pack-struct updates Nguyễn Thái Ngọc Duy 2018-03-16 18:31 ` [PATCH v4 01/11] pack-objects: a bit of document about struct object_entry Nguyễn Thái Ngọc Duy 2018-03-16 20:32 ` Junio C Hamano 2018-03-17 11:59 ` Duy Nguyen 2018-03-16 18:31 ` [PATCH v4 02/11] pack-objects: turn type and in_pack_type to bitfields Nguyễn Thái Ngọc Duy 2018-03-16 20:49 ` Junio C Hamano 2018-03-16 18:31 ` [PATCH v4 03/11] pack-objects: use bitfield for object_entry::dfs_state Nguyễn Thái Ngọc Duy 2018-03-16 18:31 ` [PATCH v4 04/11] pack-objects: use bitfield for object_entry::depth Nguyễn Thái Ngọc Duy 2018-03-16 18:31 ` [PATCH v4 05/11] pack-objects: move in_pack_pos out of struct object_entry Nguyễn Thái Ngọc Duy 2018-03-16 18:31 ` [PATCH v4 06/11] pack-objects: move in_pack " Nguyễn Thái Ngọc Duy 2018-03-26 20:39 ` Stefan Beller 2018-03-16 18:31 ` [PATCH v4 07/11] pack-objects: refer to delta objects by index instead of pointer Nguyễn Thái Ngọc Duy 2018-03-16 20:59 ` Junio C Hamano 2018-03-16 18:31 ` [PATCH v4 08/11] pack-objects: shrink z_delta_size field in struct object_entry Nguyễn Thái Ngọc Duy 2018-03-16 19:40 ` Junio C Hamano 2018-03-16 18:31 ` [PATCH v4 09/11] pack-objects: shrink size " Nguyễn Thái Ngọc Duy 2018-03-16 19:49 ` Junio C Hamano 2018-03-16 21:34 ` Junio C Hamano 2018-03-16 18:31 ` [PATCH v4 10/11] pack-objects: shrink delta_size " Nguyễn Thái Ngọc Duy 2018-03-16 18:32 ` [PATCH v4 11/11] pack-objects.h: reorder members to shrink " Nguyễn Thái Ngọc Duy 2018-03-16 21:02 ` Junio C Hamano 2018-03-17 12:07 ` Duy Nguyen 2018-03-17 14:10 ` [PATCH v5 00/11] nd/pack-objects-pack-struct updates Nguyễn Thái Ngọc Duy 2018-03-17 14:10 ` [PATCH v5 01/11] pack-objects: a bit of document about struct object_entry Nguyễn Thái Ngọc Duy 2018-03-17 14:10 ` [PATCH v5 02/11] pack-objects: turn type and in_pack_type to bitfields Nguyễn Thái Ngọc Duy 2018-03-17 14:10 ` [PATCH v5 03/11] pack-objects: use bitfield for object_entry::dfs_state Nguyễn Thái Ngọc Duy 2018-03-17 14:10 ` [PATCH v5 04/11] pack-objects: use bitfield for object_entry::depth Nguyễn Thái Ngọc Duy 2018-03-17 21:26 ` Ævar Arnfjörð Bjarmason 2018-03-17 14:10 ` [PATCH v5 05/11] pack-objects: move in_pack_pos out of struct object_entry Nguyễn Thái Ngọc Duy 2018-03-17 14:10 ` [PATCH v5 06/11] pack-objects: move in_pack " Nguyễn Thái Ngọc Duy 2018-03-17 14:10 ` [PATCH v5 07/11] pack-objects: refer to delta objects by index instead of pointer Nguyễn Thái Ngọc Duy 2018-03-17 14:10 ` [PATCH v5 08/11] pack-objects: shrink z_delta_size field in struct object_entry Nguyễn Thái Ngọc Duy 2018-03-17 14:10 ` [PATCH v5 09/11] pack-objects: shrink size " Nguyễn Thái Ngọc Duy 2018-03-17 19:57 ` Ævar Arnfjörð Bjarmason 2018-03-18 5:09 ` Junio C Hamano 2018-03-18 8:23 ` Duy Nguyen 2018-03-17 14:10 ` [PATCH v5 10/11] pack-objects: shrink delta_size " Nguyễn Thái Ngọc Duy 2018-03-17 14:10 ` [PATCH v5 11/11] pack-objects.h: reorder members to shrink " Nguyễn Thái Ngọc Duy 2018-03-17 19:53 ` Ævar Arnfjörð Bjarmason 2018-03-18 8:49 ` Duy Nguyen 2018-03-17 19:45 ` [PATCH v5 00/11] nd/pack-objects-pack-struct updates Ævar Arnfjörð Bjarmason 2018-03-17 19:47 ` Ævar Arnfjörð Bjarmason 2018-03-18 14:25 ` [PATCH v6 " Nguyễn Thái Ngọc Duy 2018-03-18 14:25 ` [PATCH v6 01/11] pack-objects: a bit of document about struct object_entry Nguyễn Thái Ngọc Duy 2018-03-18 14:25 ` [PATCH v6 02/11] pack-objects: turn type and in_pack_type to bitfields Nguyễn Thái Ngọc Duy 2018-03-18 14:25 ` [PATCH v6 03/11] pack-objects: use bitfield for object_entry::dfs_state Nguyễn Thái Ngọc Duy 2018-03-18 14:25 ` [PATCH v6 04/11] pack-objects: use bitfield for object_entry::depth Nguyễn Thái Ngọc Duy 2018-03-18 14:25 ` [PATCH v6 05/11] pack-objects: move in_pack_pos out of struct object_entry Nguyễn Thái Ngọc Duy 2018-03-18 14:25 ` [PATCH v6 06/11] pack-objects: move in_pack " Nguyễn Thái Ngọc Duy 2018-03-18 14:25 ` [PATCH v6 07/11] pack-objects: refer to delta objects by index instead of pointer Nguyễn Thái Ngọc Duy 2018-03-18 14:25 ` [PATCH v6 08/11] pack-objects: shrink z_delta_size field in struct object_entry Nguyễn Thái Ngọc Duy 2018-03-18 14:25 ` [PATCH v6 09/11] pack-objects: shrink size " Nguyễn Thái Ngọc Duy 2018-03-18 14:49 ` Ævar Arnfjörð Bjarmason 2018-03-19 16:19 ` Junio C Hamano 2018-03-19 16:23 ` Duy Nguyen 2018-03-19 16:43 ` Junio C Hamano 2018-03-19 16:54 ` Duy Nguyen 2018-03-19 18:29 ` Junio C Hamano 2018-03-19 18:45 ` Duy Nguyen 2018-03-19 20:10 ` Junio C Hamano 2018-03-20 18:08 ` Duy Nguyen 2018-03-20 18:22 ` Junio C Hamano 2018-03-21 8:03 ` Jeff King 2018-03-21 16:12 ` Duy Nguyen 2018-03-20 18:17 ` Duy Nguyen 2018-03-18 14:25 ` [PATCH v6 10/11] pack-objects: shrink delta_size " Nguyễn Thái Ngọc Duy 2018-03-18 14:25 ` [PATCH v6 11/11] pack-objects: reorder members to shrink " Nguyễn Thái Ngọc Duy 2018-03-18 14:51 ` [PATCH v6 00/11] nd/pack-objects-pack-struct updates Ævar Arnfjörð Bjarmason 2018-03-21 8:24 ` Jeff King 2018-03-21 15:59 ` Duy Nguyen 2018-03-21 16:17 ` Ævar Arnfjörð Bjarmason 2018-03-21 16:22 ` Duy Nguyen 2018-03-21 16:46 ` Duy Nguyen 2018-03-21 19:11 ` Junio C Hamano 2018-03-22 9:32 ` Jeff King 2018-03-22 9:46 ` Jeff King 2018-03-22 10:57 ` Duy Nguyen 2018-03-22 11:52 ` Jeff King 2018-03-22 17:04 ` Duy Nguyen 2018-03-23 1:28 ` Ramsay Jones 2018-03-23 2:46 ` Jeff King 2018-03-23 5:50 ` Jeff King 2018-03-23 16:01 ` Ramsay Jones 2018-03-24 6:40 ` Jeff King 2018-03-23 7:05 ` Duy Nguyen 2018-03-23 14:03 ` Ramsay Jones 2018-03-21 16:31 ` Ævar Arnfjörð Bjarmason 2018-03-21 16:53 ` Junio C Hamano 2018-03-21 17:00 ` Duy Nguyen 2018-03-22 8:07 ` Jeff King 2018-03-22 8:23 ` Duy Nguyen 2018-03-22 10:01 ` Jeff King 2018-03-24 6:33 ` [PATCH v7 00/13] " Nguyễn Thái Ngọc Duy 2018-03-24 6:33 ` [PATCH v7 01/13] pack-objects: a bit of document about struct object_entry Nguyễn Thái Ngọc Duy 2018-03-24 6:33 ` [PATCH v7 02/13] pack-objects: turn type and in_pack_type to bitfields Nguyễn Thái Ngọc Duy 2018-03-30 20:18 ` Jeff King 2018-03-24 6:33 ` [PATCH v7 03/13] pack-objects: use bitfield for object_entry::dfs_state Nguyễn Thái Ngọc Duy 2018-03-30 20:23 ` Jeff King 2018-03-24 6:33 ` [PATCH v7 04/13] pack-objects: use bitfield for object_entry::depth Nguyễn Thái Ngọc Duy 2018-03-30 20:26 ` Jeff King 2018-03-24 6:33 ` [PATCH v7 05/13] pack-objects: move in_pack_pos out of struct object_entry Nguyễn Thái Ngọc Duy 2018-03-30 20:30 ` Jeff King 2018-03-24 6:33 ` [PATCH v7 06/13] pack-objects: move in_pack " Nguyễn Thái Ngọc Duy 2018-03-24 9:42 ` Ævar Arnfjörð Bjarmason 2018-03-24 12:26 ` Duy Nguyen 2018-03-24 12:13 ` Ævar Arnfjörð Bjarmason 2018-03-30 20:48 ` Jeff King 2018-03-31 4:51 ` Duy Nguyen 2018-03-31 10:20 ` Jeff King 2018-03-31 10:45 ` Duy Nguyen 2018-03-24 6:33 ` Nguyễn Thái Ngọc Duy [this message] 2018-03-30 20:53 ` [PATCH v7 07/13] pack-objects: refer to delta objects by index instead of pointer Jeff King 2018-03-24 6:33 ` [PATCH v7 08/13] pack-objects: shrink z_delta_size field in struct object_entry Nguyễn Thái Ngọc Duy 2018-03-30 20:59 ` Jeff King 2018-03-31 4:40 ` Duy Nguyen 2018-03-31 10:17 ` Jeff King 2018-03-24 6:33 ` [PATCH v7 09/13] pack-objects: don't check size when the object is bad Nguyễn Thái Ngọc Duy 2018-03-24 6:33 ` [PATCH v7 10/13] pack-objects: clarify the use of object_entry::size Nguyễn Thái Ngọc Duy 2018-03-30 21:04 ` Jeff King 2018-03-31 4:35 ` Duy Nguyen 2018-03-31 10:13 ` Jeff King 2018-03-24 6:33 ` [PATCH v7 11/13] pack-objects: shrink size field in struct object_entry Nguyễn Thái Ngọc Duy 2018-03-30 21:18 ` Jeff King 2018-03-24 6:33 ` [PATCH v7 12/13] pack-objects: shrink delta_size " Nguyễn Thái Ngọc Duy 2018-03-30 21:24 ` Jeff King 2018-03-31 4:21 ` Duy Nguyen 2018-03-31 9:10 ` Duy Nguyen 2018-03-24 6:33 ` [PATCH v7 13/13] pack-objects: reorder members to shrink " Nguyễn Thái Ngọc Duy 2018-03-30 21:26 ` Jeff King 2018-03-31 4:10 ` Duy Nguyen 2018-03-26 15:13 ` [PATCH v7 00/13] nd/pack-objects-pack-struct updates Jeff King 2018-03-26 17:04 ` Duy Nguyen 2018-03-27 16:53 ` Jeff King 2018-03-31 10:02 ` [PATCH v8 00/15] " Nguyễn Thái Ngọc Duy 2018-03-31 10:02 ` [PATCH v8 01/15] t/README: mention about running the test suite in special modes Nguyễn Thái Ngọc Duy 2018-03-31 10:02 ` [PATCH v8 02/15] pack-objects: a bit of document about struct object_entry Nguyễn Thái Ngọc Duy 2018-03-31 10:02 ` [PATCH v8 03/15] pack-objects: turn type and in_pack_type to bitfields Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 04/15] pack-objects: use bitfield for object_entry::dfs_state Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 05/15] pack-objects: use bitfield for object_entry::depth Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 06/15] pack-objects: move in_pack_pos out of struct object_entry Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 07/15] pack-objects: move in_pack " Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 08/15] pack-objects: refer to delta objects by index instead of pointer Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 09/15] pack-objects: shrink z_delta_size field in struct object_entry Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 10/15] pack-objects: don't check size when the object is bad Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 11/15] pack-objects: clarify the use of object_entry::size Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 12/15] pack-objects: shrink size field in struct object_entry Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 13/15] pack-objects: shrink delta_size " Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 14/15] pack-objects: reorder members to shrink " Nguyễn Thái Ngọc Duy 2018-03-31 10:03 ` [PATCH v8 15/15] ci: exercise the whole test suite with uncommon code in pack-objects Nguyễn Thái Ngọc Duy 2018-03-31 11:36 ` [PATCH v8 00/15] nd/pack-objects-pack-struct updates Ævar Arnfjörð Bjarmason 2018-03-31 12:08 ` Duy Nguyen 2018-03-31 15:43 ` Ævar Arnfjörð Bjarmason 2018-04-06 21:47 ` Jeff King 2018-03-01 9:20 ` [PATCH/RFC 0/1] Avoid expensive 'repack -ad' in gc --auto Nguyễn Thái Ngọc Duy 2018-03-01 9:20 ` [PATCH/RFC 1/1] gc --auto: exclude the largest giant pack in low-memory config Nguyễn Thái Ngọc Duy 2018-03-01 18:14 ` Junio C Hamano 2018-03-02 0:00 ` Duy Nguyen 2018-03-05 14:00 ` Ævar Arnfjörð Bjarmason 2018-03-06 10:41 ` [PATCH v2 0/5] Avoid expensive 'repack -ad' in gc --auto Nguyễn Thái Ngọc Duy 2018-03-06 10:41 ` [PATCH v2 1/5] fixup! Add a test showing that 'git repack' throws away grafted-away parents Nguyễn Thái Ngọc Duy 2018-03-06 18:01 ` Junio C Hamano 2018-03-06 10:41 ` [PATCH v2 2/5] repack: add --keep-pack option Nguyễn Thái Ngọc Duy 2018-03-06 18:25 ` Junio C Hamano 2018-03-07 10:19 ` Duy Nguyen 2018-03-06 10:41 ` [PATCH v2 3/5] gc --auto: exclude base pack if not enough mem to "repack -ad" Nguyễn Thái Ngọc Duy 2018-03-06 19:19 ` Junio C Hamano 2018-03-07 10:48 ` Duy Nguyen 2018-03-07 18:38 ` Junio C Hamano 2018-03-12 18:56 ` Ævar Arnfjörð Bjarmason 2018-03-12 21:16 ` Junio C Hamano 2018-03-12 22:01 ` Ævar Arnfjörð Bjarmason 2018-03-15 16:48 ` Duy Nguyen 2018-03-07 10:48 ` Johannes Schindelin 2018-03-07 18:40 ` Junio C Hamano 2018-03-12 19:30 ` Ævar Arnfjörð Bjarmason 2018-03-15 17:00 ` Duy Nguyen 2018-03-15 19:21 ` Ævar Arnfjörð Bjarmason 2018-03-16 17:47 ` Duy Nguyen 2018-03-06 10:41 ` [PATCH v2 4/5] pack-objects: show some progress when counting kept objects Nguyễn Thái Ngọc Duy 2018-03-12 18:32 ` Ævar Arnfjörð Bjarmason 2018-03-16 19:14 ` Duy Nguyen 2018-03-16 20:13 ` Duy Nguyen 2018-03-06 10:41 ` [PATCH v2 5/5] pack-objects: display progress in get_object_details() Nguyễn Thái Ngọc Duy 2018-03-06 17:49 ` [PATCH v2 0/5] Avoid expensive 'repack -ad' in gc --auto Junio C Hamano 2018-03-16 19:27 ` [PATCH v3 0/7] nd/repack-keep-pack updates Nguyễn Thái Ngọc Duy 2018-03-16 19:27 ` [PATCH v3 1/7] repack: add --keep-pack option Nguyễn Thái Ngọc Duy 2018-03-16 19:27 ` [PATCH v3 2/7] gc: add --keep-base-pack Nguyễn Thái Ngọc Duy 2018-03-16 21:05 ` Ævar Arnfjörð Bjarmason 2018-03-19 17:26 ` Duy Nguyen 2018-03-19 19:04 ` Ævar Arnfjörð Bjarmason 2018-03-16 21:25 ` Ævar Arnfjörð Bjarmason 2018-03-16 19:27 ` [PATCH v3 3/7] gc: detect base packs based on gc.bigPackThreshold config Nguyễn Thái Ngọc Duy 2018-03-16 21:02 ` Ævar Arnfjörð Bjarmason 2018-03-16 19:27 ` [PATCH v3 4/7] gc --auto: exclude base pack if not enough mem to "repack -ad" Nguyễn Thái Ngọc Duy 2018-03-16 21:14 ` Ævar Arnfjörð Bjarmason 2018-03-16 19:27 ` [PATCH v3 5/7] gc: handle a corner case in gc.bigPackThreshold Nguyễn Thái Ngọc Duy 2018-03-16 21:10 ` Ævar Arnfjörð Bjarmason 2018-03-16 19:27 ` [PATCH v3 6/7] pack-objects: show some progress when counting kept objects Nguyễn Thái Ngọc Duy 2018-03-16 19:27 ` [PATCH v3 7/7] pack-objects: display progress in get_object_details() Nguyễn Thái Ngọc Duy 2018-03-24 7:25 ` [PATCH v4 0/7] nd/repack-keep-pack updates Nguyễn Thái Ngọc Duy 2018-03-24 7:25 ` [PATCH v4 1/7] t7700: have closing quote of a test at the beginning of line Nguyễn Thái Ngọc Duy 2018-03-24 7:25 ` [PATCH v4 2/7] repack: add --keep-pack option Nguyễn Thái Ngọc Duy 2018-03-24 7:25 ` [PATCH v4 3/7] gc: add --keep-largest-pack option Nguyễn Thái Ngọc Duy 2018-03-24 7:25 ` [PATCH v4 4/7] gc: add gc.bigPackThreshold config Nguyễn Thái Ngọc Duy 2018-03-24 7:25 ` [PATCH v4 5/7] gc: handle a corner case in gc.bigPackThreshold Nguyễn Thái Ngọc Duy 2018-03-24 7:25 ` [PATCH v4 6/7] gc --auto: exclude base pack if not enough mem to "repack -ad" Nguyễn Thái Ngọc Duy 2018-03-24 7:25 ` [PATCH v4 7/7] pack-objects: show some progress when counting kept objects Nguyễn Thái Ngọc Duy 2018-03-02 10:18 ` Reduce pack-objects memory footprint? Duy Nguyen 2018-03-02 10:37 ` Eric Wong 2018-03-02 10:54 ` Jeff King 2018-03-02 10:55 ` Duy Nguyen 2018-03-02 14:38 ` Duy Nguyen 2018-03-17 22:05 ` Why does pack-objects use so much memory on incremental packing? Ævar Arnfjörð Bjarmason 2018-03-18 8:37 ` Duy Nguyen 2018-03-20 5:28 ` Jeff King
Reply instructions: You may reply publically to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: http://vger.kernel.org/majordomo-info.html * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20180324063353.24722-8-pclouds@gmail.com \ --to=pclouds@gmail.com \ --cc=avarab@gmail.com \ --cc=e@80x24.org \ --cc=git@vger.kernel.org \ --cc=gitster@pobox.com \ --cc=peff@peff.net \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
git@vger.kernel.org list mirror (unofficial, one of many) Archives are clonable: git clone --mirror https://public-inbox.org/git git clone --mirror http://ou63pmih66umazou.onion/git git clone --mirror http://czquwvybam4bgbro.onion/git git clone --mirror http://hjrcffqmbrq6wope.onion/git Example config snippet for mirrors Newsgroups are available over NNTP: nntp://news.public-inbox.org/inbox.comp.version-control.git nntp://ou63pmih66umazou.onion/inbox.comp.version-control.git nntp://czquwvybam4bgbro.onion/inbox.comp.version-control.git nntp://hjrcffqmbrq6wope.onion/inbox.comp.version-control.git nntp://news.gmane.org/gmane.comp.version-control.git note: .onion URLs require Tor: https://www.torproject.org/ AGPL code for this site: git clone https://public-inbox.org/public-inbox.git