midx.c: respect 'pack.writeBitmapHashcache' when writing bitmaps

In the previous commit, the bitmap writing code learned to propagate
values from an existing hash-cache extension into the bitmap that it is
writing.

Now that that functionality exists, let's expose it by teaching the 'git
multi-pack-index' builtin to respect the `pack.writeBitmapHashCache`
option so that the hash-cache may be written at all.

Two minor points worth noting here:

  - The 'git multi-pack-index write' sub-command didn't previously read
    any configuration (instead this is handled in the base command). A
    separate handler is added here to respect this write-specific
    config option.

  - I briefly considered adding a 'bitmap_flags' field to the static
    options struct, but decided against it since it would require
    plumbing through a new parameter to the write_midx_file() function.

    Instead, a new MIDX-specific flag is added, which is translated to
    the corresponding bitmap one.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Taylor Blau 2021-09-14 18:06:06 -04:00 committed by Junio C Hamano
parent 8de300e1f7
commit caca3c9f07
4 changed files with 31 additions and 1 deletions

View File

@ -159,6 +159,10 @@ pack.writeBitmapHashCache::
between an older, bitmapped pack and objects that have been between an older, bitmapped pack and objects that have been
pushed since the last gc). The downside is that it consumes 4 pushed since the last gc). The downside is that it consumes 4
bytes per object of disk space. Defaults to true. bytes per object of disk space. Defaults to true.
+
When writing a multi-pack reachability bitmap, no new namehashes are
computed; instead, any namehashes stored in an existing bitmap are
permuted into their appropriate location when writing a new bitmap.
pack.writeReverseIndex:: pack.writeReverseIndex::
When true, git will write a corresponding .rev file (see: When true, git will write a corresponding .rev file (see:

View File

@ -61,6 +61,23 @@ static struct option *add_common_options(struct option *prev)
return parse_options_concat(common_opts, prev); return parse_options_concat(common_opts, prev);
} }
static int git_multi_pack_index_write_config(const char *var, const char *value,
void *cb)
{
if (!strcmp(var, "pack.writebitmaphashcache")) {
if (git_config_bool(var, value))
opts.flags |= MIDX_WRITE_BITMAP_HASH_CACHE;
else
opts.flags &= ~MIDX_WRITE_BITMAP_HASH_CACHE;
}
/*
* We should never make a fall-back call to 'git_default_config', since
* this was already called in 'cmd_multi_pack_index()'.
*/
return 0;
}
static int cmd_multi_pack_index_write(int argc, const char **argv) static int cmd_multi_pack_index_write(int argc, const char **argv)
{ {
struct option *options; struct option *options;
@ -73,6 +90,10 @@ static int cmd_multi_pack_index_write(int argc, const char **argv)
OPT_END(), OPT_END(),
}; };
opts.flags |= MIDX_WRITE_BITMAP_HASH_CACHE;
git_config(git_multi_pack_index_write_config, NULL);
options = add_common_options(builtin_multi_pack_index_write_options); options = add_common_options(builtin_multi_pack_index_write_options);
trace2_cmd_mode(argv[0]); trace2_cmd_mode(argv[0]);

6
midx.c
View File

@ -1008,9 +1008,13 @@ static int write_midx_bitmap(char *midx_name, unsigned char *midx_hash,
struct pack_idx_entry **index; struct pack_idx_entry **index;
struct commit **commits = NULL; struct commit **commits = NULL;
uint32_t i, commits_nr; uint32_t i, commits_nr;
uint16_t options = 0;
char *bitmap_name = xstrfmt("%s-%s.bitmap", midx_name, hash_to_hex(midx_hash)); char *bitmap_name = xstrfmt("%s-%s.bitmap", midx_name, hash_to_hex(midx_hash));
int ret; int ret;
if (flags & MIDX_WRITE_BITMAP_HASH_CACHE)
options |= BITMAP_OPT_HASH_CACHE;
prepare_midx_packing_data(&pdata, ctx); prepare_midx_packing_data(&pdata, ctx);
commits = find_commits_for_midx_bitmap(&commits_nr, ctx); commits = find_commits_for_midx_bitmap(&commits_nr, ctx);
@ -1049,7 +1053,7 @@ static int write_midx_bitmap(char *midx_name, unsigned char *midx_hash,
goto cleanup; goto cleanup;
bitmap_writer_set_checksum(midx_hash); bitmap_writer_set_checksum(midx_hash);
bitmap_writer_finish(index, pdata.nr_objects, bitmap_name, 0); bitmap_writer_finish(index, pdata.nr_objects, bitmap_name, options);
cleanup: cleanup:
free(index); free(index);

1
midx.h
View File

@ -44,6 +44,7 @@ struct multi_pack_index {
#define MIDX_PROGRESS (1 << 0) #define MIDX_PROGRESS (1 << 0)
#define MIDX_WRITE_REV_INDEX (1 << 1) #define MIDX_WRITE_REV_INDEX (1 << 1)
#define MIDX_WRITE_BITMAP (1 << 2) #define MIDX_WRITE_BITMAP (1 << 2)
#define MIDX_WRITE_BITMAP_HASH_CACHE (1 << 3)
const unsigned char *get_midx_checksum(struct multi_pack_index *m); const unsigned char *get_midx_checksum(struct multi_pack_index *m);
char *get_midx_filename(const char *object_dir); char *get_midx_filename(const char *object_dir);