Files
git/builtin
Jeff King ab6eea6f7b receive-pack: use oidset to de-duplicate .have lines
If you have an alternate object store with a very large
number of refs, the peak memory usage of the sha1_array can
grow high, even if most of them are duplicates that end up
not being printed at all.

The similar for_each_alternate_ref() code-paths in
fetch-pack solve this by using flags in "struct object" to
de-duplicate (and so are relying on obj_hash at the core).

But we don't have a "struct object" at all in this case. We
could call lookup_unknown_object() to get one, but if our
goal is reducing memory footprint, it's not great:

 - an unknown object is as large as the largest object type
   (a commit), which is bigger than an oidset entry

 - we can free the memory after our ref advertisement, but
   "struct object" entries persist forever (and the
   receive-pack may hang around for a long time, as the
   bottleneck is often client upload bandwidth).

So let's use an oidset. Note that unlike a sha1-array it
doesn't sort the output as a side effect. However, our
output is at least stable, because for_each_alternate_ref()
will give us the sha1s in ref-sorted order.

In one particularly pathological case with an alternate that
has 60,000 unique refs out of 80 million total, this reduced
the peak heap usage of "git receive-pack . </dev/null" from
13GB to 14MB.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-08 15:39:55 -08:00
..
2016-12-21 14:55:01 -08:00
2016-11-22 13:55:20 -08:00
2017-02-02 13:36:55 -08:00
2016-09-29 15:42:18 -07:00
2016-09-21 15:15:24 -07:00
2016-09-29 15:42:18 -07:00
2016-10-10 14:03:50 -07:00
2016-09-26 16:09:17 -07:00
2016-11-22 13:13:16 -08:00
2016-12-27 00:11:41 -08:00
2016-09-29 15:42:18 -07:00
2017-01-18 15:12:15 -08:00
2016-09-29 15:42:18 -07:00
2017-01-31 13:14:56 -08:00
2017-01-18 15:12:11 -08:00
2016-10-03 12:46:47 -07:00
2017-01-23 18:51:56 -08:00
2017-01-31 13:14:58 -08:00
2016-11-28 13:18:51 -08:00