On Fri, Jul 20, 2018 at 9:47 PM, Duy Nguyen <[email protected]> wrote:
> On Fri, Jul 20, 2018 at 10:43:25AM -0700, Elijah Newren wrote:
>> Out of curiosity, would it be possible to use the delta_size_ field
>> for deltas that are small enough, and only use an external data
>> structure (perhaps a hash rather than an array) for the few deltas
>> that are large?
>
> We could. And because repack time is still a bit higher in your
> linux.git case. Let's try this. No locking in common case and very
> small locked region when we hit large deltas
Sweet, I'm starting some tests with it...
> -- 8< --
...
> diff --git a/pack-objects.h b/pack-objects.h
> index 9f977ae800..11890e7217 100644
> --- a/pack-objects.h
> +++ b/pack-objects.h
> @@ -15,7 +15,7 @@
...
> @@ -353,37 +354,26 @@ static inline void oe_set_size(struct packing_data
> *pack,
> static inline unsigned long oe_delta_size(struct packing_data *pack,
> const struct object_entry *e)
> {
> - unsigned long size;
> -
> - packing_data_lock(pack);
> - if (pack->delta_size)
> - size = pack->delta_size[e - pack->objects];
> + if (e->delta_size_valid)
> + return e->delta_size_;
> else
> - size = e->delta_size_;
> - packing_data_unlock(pack);
> - return size;
> + return pack->delta_size[e - pack->objects];
Should this last line be wrapped with packing_data_lock/unlock calls?
(And similarly in oe_set_delta_size when writing to this array?)
> }
>
> -uint32_t *new_delta_size_array(struct packing_data *pdata);
> static inline void oe_set_delta_size(struct packing_data *pack,
> struct object_entry *e,
> unsigned long size)
> {
> - packing_data_lock(pack);
> - if (!pack->delta_size && size < pack->oe_delta_size_limit) {
> - packing_data_unlock(pack);
> + if (size < pack->oe_delta_size_limit) {
> e->delta_size_ = size;
> - return;
> + e->delta_size_valid = 1;
> + } else {
> + packing_data_lock(pack);
> + if (!pack->delta_size)
> + ALLOC_ARRAY(pack->delta_size, pack->nr_alloc);
> + packing_data_unlock(pack);
> + pack->delta_size[e - pack->objects] = size;
> }
> - /*
> - * We have had at least one delta size exceeding OE_DELTA_SIZE_BITS
> - * limit. delta_size_ will not be used anymore. All delta sizes are
> - * now from the delta_size[] array.
> - */
> - if (!pack->delta_size)
> - pack->delta_size = new_delta_size_array(pack);
> - pack->delta_size[e - pack->objects] = size;
> - packing_data_unlock(pack);
> }
>
> #endif