On Wed, Mar 21 2018, Jeff King wrote:
> On Sun, Mar 18, 2018 at 03:25:15PM +0100, Nguyễn Thái Ngọc Duy wrote:
>
>> v6 fixes the one optimization that I just couldn't get right, fixes
>> two off-by-one error messages and a couple commit message update
>> (biggest change is in 11/11 to record some numbers from AEvar)
>
> [...]Yes, having that many packs is insane, but that's going to be
> small consolation to somebody whose automated maintenance program now
> craps out at 16k packs, when it previously would have just worked to
> fix the situation[...]
That's going to be super rare (and probably nonexisting) edge case, but
(untested) I wonder if something like this on top would alleviate your
concerns, i.e. instead of dying we just take the first N packs up to our
limit:
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 4406af640f..49d467ab2a 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -1065,8 +1065,9 @@ static int want_object_in_pack(const struct object_id
*oid,
want = 1;
done:
- if (want && *found_pack && !(*found_pack)->index)
- oe_add_pack(&to_pack, *found_pack);
+ if (want && *found_pack && !(*found_pack)->index) {
+ if (oe_add_pack(&to_pack, *found_pack) == -1)
+ return 0;
return want;
}
diff --git a/pack-objects.h b/pack-objects.h
index 9f8e450e19..50ed2028fb 100644
--- a/pack-objects.h
+++ b/pack-objects.h
@@ -171,15 +171,17 @@ static inline void oe_set_in_pack_pos(const struct
packing_data *pack,
pack->in_pack_pos[e - pack->objects] = pos;
}
-static inline unsigned int oe_add_pack(struct packing_data *pack,
+static inline int oe_add_pack(struct packing_data *pack,
struct packed_git *p)
{
- if (pack->in_pack_count >= (1 << OE_IN_PACK_BITS))
- die(_("too many packs to handle in one go. "
- "Please add .keep files to exclude\n"
- "some pack files and keep the number "
- "of non-kept files below %d."),
+ if (pack->in_pack_count >= (1 << OE_IN_PACK_BITS)) {
+ warning(_("Too many packs to handle in one go. "
+ "Ran into the limit of %d.\n"
+ "Limping along by pretending packs beyond that"
+ "number have *.keep!"),
1 << OE_IN_PACK_BITS);
+ return -1;
+ }
if (p) {
if (p->index > 0)
die("BUG: this packed is already indexed");