pack-bitmap: use object_id when loading on-disk bitmaps
A pack bitmap file contains the index position of the commit for each bitmap, which we then translate into an object id via nth_packed_object_sha1(). In preparation for that function going away, we can switch to the more type-safe nth_packed_object_id(). Note that even though the result ends up in an object_id this does incur an extra copy of the hash (into our temporary object_id, and then into the final malloc'd stored_bitmap struct). This shouldn't make any measurable difference. If it did, we could avoid this copy _and_ the copy of the rest of the items by allocating the stored_bitmap struct beforehand and reading directly into it from the bitmap file. Or better still, if this is a bottleneck, we could introduce an on-disk index to the bitmap file so we don't have to read every single entry to use just one of them. So it's not worth worrying about micro-optimizing out this one hash copy. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
f66d4e0250
commit
500e4f2366
|
@ -169,7 +169,7 @@ static int load_bitmap_header(struct bitmap_index *index)
|
||||||
|
|
||||||
static struct stored_bitmap *store_bitmap(struct bitmap_index *index,
|
static struct stored_bitmap *store_bitmap(struct bitmap_index *index,
|
||||||
struct ewah_bitmap *root,
|
struct ewah_bitmap *root,
|
||||||
const unsigned char *hash,
|
const struct object_id *oid,
|
||||||
struct stored_bitmap *xor_with,
|
struct stored_bitmap *xor_with,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
|
@ -181,7 +181,7 @@ static struct stored_bitmap *store_bitmap(struct bitmap_index *index,
|
||||||
stored->root = root;
|
stored->root = root;
|
||||||
stored->xor = xor_with;
|
stored->xor = xor_with;
|
||||||
stored->flags = flags;
|
stored->flags = flags;
|
||||||
oidread(&stored->oid, hash);
|
oidcpy(&stored->oid, oid);
|
||||||
|
|
||||||
hash_pos = kh_put_oid_map(index->bitmaps, stored->oid, &ret);
|
hash_pos = kh_put_oid_map(index->bitmaps, stored->oid, &ret);
|
||||||
|
|
||||||
|
@ -189,7 +189,7 @@ static struct stored_bitmap *store_bitmap(struct bitmap_index *index,
|
||||||
* because the SHA1 already existed on the map. this is bad, there
|
* because the SHA1 already existed on the map. this is bad, there
|
||||||
* shouldn't be duplicated commits in the index */
|
* shouldn't be duplicated commits in the index */
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
error("Duplicate entry in bitmap index: %s", hash_to_hex(hash));
|
error("Duplicate entry in bitmap index: %s", oid_to_hex(oid));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,13 +221,13 @@ static int load_bitmap_entries_v1(struct bitmap_index *index)
|
||||||
struct ewah_bitmap *bitmap = NULL;
|
struct ewah_bitmap *bitmap = NULL;
|
||||||
struct stored_bitmap *xor_bitmap = NULL;
|
struct stored_bitmap *xor_bitmap = NULL;
|
||||||
uint32_t commit_idx_pos;
|
uint32_t commit_idx_pos;
|
||||||
const unsigned char *sha1;
|
struct object_id oid;
|
||||||
|
|
||||||
commit_idx_pos = read_be32(index->map, &index->map_pos);
|
commit_idx_pos = read_be32(index->map, &index->map_pos);
|
||||||
xor_offset = read_u8(index->map, &index->map_pos);
|
xor_offset = read_u8(index->map, &index->map_pos);
|
||||||
flags = read_u8(index->map, &index->map_pos);
|
flags = read_u8(index->map, &index->map_pos);
|
||||||
|
|
||||||
sha1 = nth_packed_object_sha1(index->pack, commit_idx_pos);
|
nth_packed_object_id(&oid, index->pack, commit_idx_pos);
|
||||||
|
|
||||||
bitmap = read_bitmap_1(index);
|
bitmap = read_bitmap_1(index);
|
||||||
if (!bitmap)
|
if (!bitmap)
|
||||||
|
@ -244,7 +244,7 @@ static int load_bitmap_entries_v1(struct bitmap_index *index)
|
||||||
}
|
}
|
||||||
|
|
||||||
recent_bitmaps[i % MAX_XOR_OFFSET] = store_bitmap(
|
recent_bitmaps[i % MAX_XOR_OFFSET] = store_bitmap(
|
||||||
index, bitmap, sha1, xor_bitmap, flags);
|
index, bitmap, &oid, xor_bitmap, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue