]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-bitmap: use object_id when loading on-disk bitmaps
authorJeff King <peff@peff.net>
Mon, 24 Feb 2020 04:32:27 +0000 (23:32 -0500)
committerJunio C Hamano <gitster@pobox.com>
Mon, 24 Feb 2020 20:55:53 +0000 (12:55 -0800)
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>
pack-bitmap.c

index c81d32332983ecb6705df741ba6b4e3d75f8bf0a..1a067885a1b02cf9f3e26f53dce76dd400a20016 100644 (file)
@@ -169,7 +169,7 @@ static int load_bitmap_header(struct bitmap_index *index)
 
 static struct stored_bitmap *store_bitmap(struct bitmap_index *index,
                                          struct ewah_bitmap *root,
-                                         const unsigned char *hash,
+                                         const struct object_id *oid,
                                          struct stored_bitmap *xor_with,
                                          int flags)
 {
@@ -181,7 +181,7 @@ static struct stored_bitmap *store_bitmap(struct bitmap_index *index,
        stored->root = root;
        stored->xor = xor_with;
        stored->flags = flags;
-       oidread(&stored->oid, hash);
+       oidcpy(&stored->oid, oid);
 
        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
         * shouldn't be duplicated commits in the index */
        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;
        }
 
@@ -221,13 +221,13 @@ static int load_bitmap_entries_v1(struct bitmap_index *index)
                struct ewah_bitmap *bitmap = NULL;
                struct stored_bitmap *xor_bitmap = NULL;
                uint32_t commit_idx_pos;
-               const unsigned char *sha1;
+               struct object_id oid;
 
                commit_idx_pos = read_be32(index->map, &index->map_pos);
                xor_offset = 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);
                if (!bitmap)
@@ -244,7 +244,7 @@ static int load_bitmap_entries_v1(struct bitmap_index *index)
                }
 
                recent_bitmaps[i % MAX_XOR_OFFSET] = store_bitmap(
-                       index, bitmap, sha1, xor_bitmap, flags);
+                       index, bitmap, &oid, xor_bitmap, flags);
        }
 
        return 0;