зеркало из https://github.com/microsoft/git.git
midx: simplify computation of pack name lengths
Before writing the multi-pack-index, we compute the length of the pack-index names concatenated together. This forms the data in the pack name chunk, and we precompute it to compute chunk offsets. The value is also modified to fit alignment needs. Previously, this computation was coupled with adding packs from the existing multi-pack-index and the remaining packs in the object dir not already covered by the multi-pack-index. In anticipation of this becoming more complicated with the 'expire' subcommand, simplify the computation by centralizing it to a single loop before writing the file. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
cff9711616
Коммит
dba6175c64
18
midx.c
18
midx.c
|
@ -433,7 +433,6 @@ struct pack_list {
|
|||
uint32_t nr;
|
||||
uint32_t alloc_list;
|
||||
uint32_t alloc_names;
|
||||
size_t pack_name_concat_len;
|
||||
struct multi_pack_index *m;
|
||||
};
|
||||
|
||||
|
@ -468,7 +467,6 @@ static void add_pack_to_midx(const char *full_path, size_t full_path_len,
|
|||
}
|
||||
|
||||
packs->names[packs->nr] = xstrdup(file_name);
|
||||
packs->pack_name_concat_len += strlen(file_name) + 1;
|
||||
packs->nr++;
|
||||
}
|
||||
}
|
||||
|
@ -812,6 +810,7 @@ int write_midx_file(const char *object_dir)
|
|||
uint32_t nr_entries, num_large_offsets = 0;
|
||||
struct pack_midx_entry *entries = NULL;
|
||||
int large_offsets_needed = 0;
|
||||
int pack_name_concat_len = 0;
|
||||
|
||||
midx_name = get_midx_filename(object_dir);
|
||||
if (safe_create_leading_directories(midx_name)) {
|
||||
|
@ -827,7 +826,6 @@ int write_midx_file(const char *object_dir)
|
|||
packs.alloc_names = packs.alloc_list;
|
||||
packs.list = NULL;
|
||||
packs.names = NULL;
|
||||
packs.pack_name_concat_len = 0;
|
||||
ALLOC_ARRAY(packs.list, packs.alloc_list);
|
||||
ALLOC_ARRAY(packs.names, packs.alloc_names);
|
||||
|
||||
|
@ -838,7 +836,6 @@ int write_midx_file(const char *object_dir)
|
|||
|
||||
packs.list[packs.nr] = NULL;
|
||||
packs.names[packs.nr] = xstrdup(packs.m->pack_names[i]);
|
||||
packs.pack_name_concat_len += strlen(packs.names[packs.nr]) + 1;
|
||||
packs.nr++;
|
||||
}
|
||||
}
|
||||
|
@ -848,10 +845,6 @@ int write_midx_file(const char *object_dir)
|
|||
if (packs.m && packs.nr == packs.m->num_packs)
|
||||
goto cleanup;
|
||||
|
||||
if (packs.pack_name_concat_len % MIDX_CHUNK_ALIGNMENT)
|
||||
packs.pack_name_concat_len += MIDX_CHUNK_ALIGNMENT -
|
||||
(packs.pack_name_concat_len % MIDX_CHUNK_ALIGNMENT);
|
||||
|
||||
ALLOC_ARRAY(pack_perm, packs.nr);
|
||||
sort_packs_by_name(packs.names, packs.nr, pack_perm);
|
||||
|
||||
|
@ -864,6 +857,13 @@ int write_midx_file(const char *object_dir)
|
|||
large_offsets_needed = 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < packs.nr; i++)
|
||||
pack_name_concat_len += strlen(packs.names[i]) + 1;
|
||||
|
||||
if (pack_name_concat_len % MIDX_CHUNK_ALIGNMENT)
|
||||
pack_name_concat_len += MIDX_CHUNK_ALIGNMENT -
|
||||
(pack_name_concat_len % MIDX_CHUNK_ALIGNMENT);
|
||||
|
||||
hold_lock_file_for_update(&lk, midx_name, LOCK_DIE_ON_ERROR);
|
||||
f = hashfd(lk.tempfile->fd, lk.tempfile->filename.buf);
|
||||
FREE_AND_NULL(midx_name);
|
||||
|
@ -881,7 +881,7 @@ int write_midx_file(const char *object_dir)
|
|||
|
||||
cur_chunk++;
|
||||
chunk_ids[cur_chunk] = MIDX_CHUNKID_OIDFANOUT;
|
||||
chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] + packs.pack_name_concat_len;
|
||||
chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] + pack_name_concat_len;
|
||||
|
||||
cur_chunk++;
|
||||
chunk_ids[cur_chunk] = MIDX_CHUNKID_OIDLOOKUP;
|
||||
|
|
Загрузка…
Ссылка в новой задаче