pack-bitmap.c: teach `bitmap_for_commit()` about incremental MIDXs
The pack-bitmap machinery uses `bitmap_for_commit()` to locate the
EWAH-compressed bitmap corresponding to some given commit object.
Teach this function about incremental MIDX bitmaps by teaching it to
recur on earlier bitmap layers when it fails to find a given commit in
the current layer.
The changes to do so are as follows:
- Avoid initializing hash_pos at its declaration, since
bitmap_for_commit() is now a recursive function and may receive a
NULL bitmap_index pointer as its first argument.
- In cases where we would previously return NULL (to indicate that a
lookup failed and the given bitmap_index does not contain an entry
corresponding to the given commit), recursively call the function on
the previous bitmap layer.
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Acked-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
parent
f31a17cea5
commit
ae61324f0a
|
|
@ -941,18 +941,21 @@ corrupt:
|
||||||
struct ewah_bitmap *bitmap_for_commit(struct bitmap_index *bitmap_git,
|
struct ewah_bitmap *bitmap_for_commit(struct bitmap_index *bitmap_git,
|
||||||
struct commit *commit)
|
struct commit *commit)
|
||||||
{
|
{
|
||||||
khiter_t hash_pos = kh_get_oid_map(bitmap_git->bitmaps,
|
khiter_t hash_pos;
|
||||||
commit->object.oid);
|
if (!bitmap_git)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hash_pos = kh_get_oid_map(bitmap_git->bitmaps, commit->object.oid);
|
||||||
if (hash_pos >= kh_end(bitmap_git->bitmaps)) {
|
if (hash_pos >= kh_end(bitmap_git->bitmaps)) {
|
||||||
struct stored_bitmap *bitmap = NULL;
|
struct stored_bitmap *bitmap = NULL;
|
||||||
if (!bitmap_git->table_lookup)
|
if (!bitmap_git->table_lookup)
|
||||||
return NULL;
|
return bitmap_for_commit(bitmap_git->base, commit);
|
||||||
|
|
||||||
/* this is a fairly hot codepath - no trace2_region please */
|
/* this is a fairly hot codepath - no trace2_region please */
|
||||||
/* NEEDSWORK: cache misses aren't recorded */
|
/* NEEDSWORK: cache misses aren't recorded */
|
||||||
bitmap = lazy_bitmap_for_commit(bitmap_git, commit);
|
bitmap = lazy_bitmap_for_commit(bitmap_git, commit);
|
||||||
if (!bitmap)
|
if (!bitmap)
|
||||||
return NULL;
|
return bitmap_for_commit(bitmap_git->base, commit);
|
||||||
return lookup_stored_bitmap(bitmap);
|
return lookup_stored_bitmap(bitmap);
|
||||||
}
|
}
|
||||||
return lookup_stored_bitmap(kh_value(bitmap_git->bitmaps, hash_pos));
|
return lookup_stored_bitmap(kh_value(bitmap_git->bitmaps, hash_pos));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue