pack-redundant.c: learn about index v2
Initially the conversion was made using nth_packed_object_sha1() which made this file completely index version agnostic. Unfortunately the overhead was quite significant so I went back to raw index walking but with selectable base and step values which brought back similar performances as the original. Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
32637cdf4a
commit
8c681e07c9
@ -247,16 +247,19 @@ static struct pack_list * pack_list_difference(const struct pack_list *A,
|
||||
|
||||
static void cmp_two_packs(struct pack_list *p1, struct pack_list *p2)
|
||||
{
|
||||
int p1_off, p2_off;
|
||||
unsigned long p1_off = 0, p2_off = 0, p1_step, p2_step;
|
||||
const unsigned char *p1_base, *p2_base;
|
||||
struct llist_item *p1_hint = NULL, *p2_hint = NULL;
|
||||
|
||||
p1_off = p2_off = 256 * 4 + 4;
|
||||
p1_base = p1->pack->index_data;
|
||||
p2_base = p2->pack->index_data;
|
||||
p1_base += 256 * 4 + ((p1->pack->index_version < 2) ? 4 : 8);
|
||||
p2_base += 256 * 4 + ((p2->pack->index_version < 2) ? 4 : 8);
|
||||
p1_step = (p1->pack->index_version < 2) ? 24 : 20;
|
||||
p2_step = (p2->pack->index_version < 2) ? 24 : 20;
|
||||
|
||||
while (p1_off <= p1->pack->index_size - 3 * 20 &&
|
||||
p2_off <= p2->pack->index_size - 3 * 20)
|
||||
while (p1_off < p1->pack->num_objects * p1_step &&
|
||||
p2_off < p2->pack->num_objects * p2_step)
|
||||
{
|
||||
int cmp = hashcmp(p1_base + p1_off, p2_base + p2_off);
|
||||
/* cmp ~ p1 - p2 */
|
||||
@ -265,14 +268,14 @@ static void cmp_two_packs(struct pack_list *p1, struct pack_list *p2)
|
||||
p1_base + p1_off, p1_hint);
|
||||
p2_hint = llist_sorted_remove(p2->unique_objects,
|
||||
p1_base + p1_off, p2_hint);
|
||||
p1_off+=24;
|
||||
p2_off+=24;
|
||||
p1_off += p1_step;
|
||||
p2_off += p2_step;
|
||||
continue;
|
||||
}
|
||||
if (cmp < 0) { /* p1 has the object, p2 doesn't */
|
||||
p1_off+=24;
|
||||
p1_off += p1_step;
|
||||
} else { /* p2 has the object, p1 doesn't */
|
||||
p2_off+=24;
|
||||
p2_off += p2_step;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -352,28 +355,31 @@ static int is_superset(struct pack_list *pl, struct llist *list)
|
||||
static size_t sizeof_union(struct packed_git *p1, struct packed_git *p2)
|
||||
{
|
||||
size_t ret = 0;
|
||||
int p1_off, p2_off;
|
||||
unsigned long p1_off = 0, p2_off = 0, p1_step, p2_step;
|
||||
const unsigned char *p1_base, *p2_base;
|
||||
|
||||
p1_off = p2_off = 256 * 4 + 4;
|
||||
p1_base = p1->index_data;
|
||||
p2_base = p2->index_data;
|
||||
p1_base += 256 * 4 + ((p1->index_version < 2) ? 4 : 8);
|
||||
p2_base += 256 * 4 + ((p2->index_version < 2) ? 4 : 8);
|
||||
p1_step = (p1->index_version < 2) ? 24 : 20;
|
||||
p2_step = (p2->index_version < 2) ? 24 : 20;
|
||||
|
||||
while (p1_off <= p1->index_size - 3 * 20 &&
|
||||
p2_off <= p2->index_size - 3 * 20)
|
||||
while (p1_off < p1->num_objects * p1_step &&
|
||||
p2_off < p2->num_objects * p2_step)
|
||||
{
|
||||
int cmp = hashcmp(p1_base + p1_off, p2_base + p2_off);
|
||||
/* cmp ~ p1 - p2 */
|
||||
if (cmp == 0) {
|
||||
ret++;
|
||||
p1_off+=24;
|
||||
p2_off+=24;
|
||||
p1_off += p1_step;
|
||||
p2_off += p2_step;
|
||||
continue;
|
||||
}
|
||||
if (cmp < 0) { /* p1 has the object, p2 doesn't */
|
||||
p1_off+=24;
|
||||
p1_off += p1_step;
|
||||
} else { /* p2 has the object, p1 doesn't */
|
||||
p2_off+=24;
|
||||
p2_off += p2_step;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@ -535,7 +541,7 @@ static void scan_alt_odb_packs(void)
|
||||
static struct pack_list * add_pack(struct packed_git *p)
|
||||
{
|
||||
struct pack_list l;
|
||||
size_t off;
|
||||
unsigned long off = 0, step;
|
||||
const unsigned char *base;
|
||||
|
||||
if (!p->pack_local && !(alt_odb || verbose))
|
||||
@ -544,11 +550,12 @@ static struct pack_list * add_pack(struct packed_git *p)
|
||||
l.pack = p;
|
||||
llist_init(&l.all_objects);
|
||||
|
||||
off = 256 * 4 + 4;
|
||||
base = p->index_data;
|
||||
while (off <= p->index_size - 3 * 20) {
|
||||
base += 256 * 4 + ((p->index_version < 2) ? 4 : 8);
|
||||
step = (p->index_version < 2) ? 24 : 20;
|
||||
while (off < p->num_objects * step) {
|
||||
llist_insert_back(l.all_objects, base + off);
|
||||
off += 24;
|
||||
off += step;
|
||||
}
|
||||
/* this list will be pruned in cmp_two_packs later */
|
||||
l.unique_objects = llist_copy(l.all_objects);
|
||||
|
Loading…
Reference in New Issue
Block a user