packfile: use oidset for bad objects

Store the object ID of broken pack entries in an oidset instead of
keeping only their hashes in an unsorted array.  The resulting code is
shorter and easier to read.  It also handles the (hopefully) very rare
case of having a high number of bad objects better.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
René Scharfe
2021-09-11 22:43:26 +02:00
committed by Junio C Hamano
parent 7407d733a4
commit 09ef66179b
3 changed files with 11 additions and 31 deletions

10
midx.c
View File

@ -307,13 +307,9 @@ int fill_midx_entry(struct repository * r,
if (!is_pack_valid(p))
return 0;
if (p->num_bad_objects) {
uint32_t i;
for (i = 0; i < p->num_bad_objects; i++)
if (hasheq(oid->hash,
p->bad_object_sha1 + the_hash_algo->rawsz * i))
return 0;
}
if (oidset_size(&p->bad_objects) &&
oidset_contains(&p->bad_objects, oid))
return 0;
e->offset = nth_midxed_offset(m, pos);
e->p = p;