midx: stop duplicating info redundant with its owning source
Multi-pack indices store some information that is redundant with their owning source: - The locality bit that tracks whether the source is the primary object source or an alternate. - The object directory path the multi-pack index is located in. - The pointer to the owning parent directory. All of this information is already contained in `struct odb_source`. So now that we always have that struct available when loading a multi-pack index we have it readily accessible. Drop the redundant information and instead store a pointer to the object source. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>main
parent
c3f5d25146
commit
7744936f37
|
@ -223,9 +223,10 @@ static void mark_packs_for_deletion(struct existing_packs *existing,
|
||||||
static void remove_redundant_pack(const char *dir_name, const char *base_name)
|
static void remove_redundant_pack(const char *dir_name, const char *base_name)
|
||||||
{
|
{
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
struct multi_pack_index *m = get_multi_pack_index(the_repository->objects->sources);
|
struct odb_source *source = the_repository->objects->sources;
|
||||||
|
struct multi_pack_index *m = get_multi_pack_index(source);
|
||||||
strbuf_addf(&buf, "%s.pack", base_name);
|
strbuf_addf(&buf, "%s.pack", base_name);
|
||||||
if (m && m->local && midx_contains_pack(m, buf.buf))
|
if (m && source->local && midx_contains_pack(m, buf.buf))
|
||||||
clear_midx_file(the_repository);
|
clear_midx_file(the_repository);
|
||||||
strbuf_insertf(&buf, 0, "%s/", dir_name);
|
strbuf_insertf(&buf, 0, "%s/", dir_name);
|
||||||
unlink_pack_path(buf.buf, 1);
|
unlink_pack_path(buf.buf, 1);
|
||||||
|
|
|
@ -981,10 +981,11 @@ static int link_midx_to_chain(struct multi_pack_index *m)
|
||||||
for (i = 0; i < ARRAY_SIZE(midx_exts); i++) {
|
for (i = 0; i < ARRAY_SIZE(midx_exts); i++) {
|
||||||
const unsigned char *hash = get_midx_checksum(m);
|
const unsigned char *hash = get_midx_checksum(m);
|
||||||
|
|
||||||
get_midx_filename_ext(m->repo->hash_algo, &from, m->object_dir,
|
get_midx_filename_ext(m->source->odb->repo->hash_algo, &from,
|
||||||
|
m->source->path,
|
||||||
hash, midx_exts[i].non_split);
|
hash, midx_exts[i].non_split);
|
||||||
get_split_midx_filename_ext(m->repo->hash_algo, &to,
|
get_split_midx_filename_ext(m->source->odb->repo->hash_algo, &to,
|
||||||
m->object_dir, hash,
|
m->source->path, hash,
|
||||||
midx_exts[i].split);
|
midx_exts[i].split);
|
||||||
|
|
||||||
if (link(from.buf, to.buf) < 0 && errno != ENOENT) {
|
if (link(from.buf, to.buf) < 0 && errno != ENOENT) {
|
||||||
|
@ -1109,7 +1110,7 @@ static int write_midx_internal(struct odb_source *source,
|
||||||
if (flags & MIDX_WRITE_BITMAP && load_midx_revindex(m)) {
|
if (flags & MIDX_WRITE_BITMAP && load_midx_revindex(m)) {
|
||||||
error(_("could not load reverse index for MIDX %s"),
|
error(_("could not load reverse index for MIDX %s"),
|
||||||
hash_to_hex_algop(get_midx_checksum(m),
|
hash_to_hex_algop(get_midx_checksum(m),
|
||||||
m->repo->hash_algo));
|
m->source->odb->repo->hash_algo));
|
||||||
result = 1;
|
result = 1;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
21
midx.c
21
midx.c
|
@ -26,7 +26,7 @@ int cmp_idx_or_pack_name(const char *idx_or_pack_name,
|
||||||
|
|
||||||
const unsigned char *get_midx_checksum(struct multi_pack_index *m)
|
const unsigned char *get_midx_checksum(struct multi_pack_index *m)
|
||||||
{
|
{
|
||||||
return m->data + m->data_len - m->repo->hash_algo->rawsz;
|
return m->data + m->data_len - m->source->odb->repo->hash_algo->rawsz;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_midx_filename(const struct git_hash_algo *hash_algo,
|
void get_midx_filename(const struct git_hash_algo *hash_algo,
|
||||||
|
@ -128,11 +128,10 @@ static struct multi_pack_index *load_multi_pack_index_one(struct odb_source *sou
|
||||||
midx_map = xmmap(NULL, midx_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
midx_map = xmmap(NULL, midx_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
FLEX_ALLOC_STR(m, object_dir, source->path);
|
CALLOC_ARRAY(m, 1);
|
||||||
m->data = midx_map;
|
m->data = midx_map;
|
||||||
m->data_len = midx_size;
|
m->data_len = midx_size;
|
||||||
m->local = source->local;
|
m->source = source;
|
||||||
m->repo = r;
|
|
||||||
|
|
||||||
m->signature = get_be32(m->data);
|
m->signature = get_be32(m->data);
|
||||||
if (m->signature != MIDX_SIGNATURE)
|
if (m->signature != MIDX_SIGNATURE)
|
||||||
|
@ -446,7 +445,7 @@ static uint32_t midx_for_pack(struct multi_pack_index **_m,
|
||||||
int prepare_midx_pack(struct multi_pack_index *m,
|
int prepare_midx_pack(struct multi_pack_index *m,
|
||||||
uint32_t pack_int_id)
|
uint32_t pack_int_id)
|
||||||
{
|
{
|
||||||
struct repository *r = m->repo;
|
struct repository *r = m->source->odb->repo;
|
||||||
struct strbuf pack_name = STRBUF_INIT;
|
struct strbuf pack_name = STRBUF_INIT;
|
||||||
struct strbuf key = STRBUF_INIT;
|
struct strbuf key = STRBUF_INIT;
|
||||||
struct packed_git *p;
|
struct packed_git *p;
|
||||||
|
@ -458,7 +457,7 @@ int prepare_midx_pack(struct multi_pack_index *m,
|
||||||
if (m->packs[pack_int_id])
|
if (m->packs[pack_int_id])
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
strbuf_addf(&pack_name, "%s/pack/%s", m->object_dir,
|
strbuf_addf(&pack_name, "%s/pack/%s", m->source->path,
|
||||||
m->pack_names[pack_int_id]);
|
m->pack_names[pack_int_id]);
|
||||||
|
|
||||||
/* pack_map holds the ".pack" name, but we have the .idx */
|
/* pack_map holds the ".pack" name, but we have the .idx */
|
||||||
|
@ -469,7 +468,8 @@ int prepare_midx_pack(struct multi_pack_index *m,
|
||||||
strhash(key.buf), key.buf,
|
strhash(key.buf), key.buf,
|
||||||
struct packed_git, packmap_ent);
|
struct packed_git, packmap_ent);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
p = add_packed_git(r, pack_name.buf, pack_name.len, m->local);
|
p = add_packed_git(r, pack_name.buf, pack_name.len,
|
||||||
|
m->source->local);
|
||||||
if (p) {
|
if (p) {
|
||||||
install_packed_git(r, p);
|
install_packed_git(r, p);
|
||||||
list_add_tail(&p->mru, &r->objects->packed_git_mru);
|
list_add_tail(&p->mru, &r->objects->packed_git_mru);
|
||||||
|
@ -528,7 +528,8 @@ int bsearch_one_midx(const struct object_id *oid, struct multi_pack_index *m,
|
||||||
uint32_t *result)
|
uint32_t *result)
|
||||||
{
|
{
|
||||||
int ret = bsearch_hash(oid->hash, m->chunk_oid_fanout,
|
int ret = bsearch_hash(oid->hash, m->chunk_oid_fanout,
|
||||||
m->chunk_oid_lookup, m->repo->hash_algo->rawsz,
|
m->chunk_oid_lookup,
|
||||||
|
m->source->odb->repo->hash_algo->rawsz,
|
||||||
result);
|
result);
|
||||||
if (result)
|
if (result)
|
||||||
*result += m->num_objects_in_base;
|
*result += m->num_objects_in_base;
|
||||||
|
@ -559,7 +560,7 @@ struct object_id *nth_midxed_object_oid(struct object_id *oid,
|
||||||
n = midx_for_object(&m, n);
|
n = midx_for_object(&m, n);
|
||||||
|
|
||||||
oidread(oid, m->chunk_oid_lookup + st_mult(m->hash_len, n),
|
oidread(oid, m->chunk_oid_lookup + st_mult(m->hash_len, n),
|
||||||
m->repo->hash_algo);
|
m->source->odb->repo->hash_algo);
|
||||||
return oid;
|
return oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -734,7 +735,7 @@ int prepare_multi_pack_index_one(struct odb_source *source)
|
||||||
|
|
||||||
int midx_checksum_valid(struct multi_pack_index *m)
|
int midx_checksum_valid(struct multi_pack_index *m)
|
||||||
{
|
{
|
||||||
return hashfile_checksum_valid(m->repo->hash_algo,
|
return hashfile_checksum_valid(m->source->odb->repo->hash_algo,
|
||||||
m->data, m->data_len);
|
m->data, m->data_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
7
midx.h
7
midx.h
|
@ -35,6 +35,8 @@ struct odb_source;
|
||||||
"GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL"
|
"GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL"
|
||||||
|
|
||||||
struct multi_pack_index {
|
struct multi_pack_index {
|
||||||
|
struct odb_source *source;
|
||||||
|
|
||||||
const unsigned char *data;
|
const unsigned char *data;
|
||||||
size_t data_len;
|
size_t data_len;
|
||||||
|
|
||||||
|
@ -50,7 +52,6 @@ struct multi_pack_index {
|
||||||
uint32_t num_objects;
|
uint32_t num_objects;
|
||||||
int preferred_pack_idx;
|
int preferred_pack_idx;
|
||||||
|
|
||||||
int local;
|
|
||||||
int has_chain;
|
int has_chain;
|
||||||
|
|
||||||
const unsigned char *chunk_pack_names;
|
const unsigned char *chunk_pack_names;
|
||||||
|
@ -71,10 +72,6 @@ struct multi_pack_index {
|
||||||
|
|
||||||
const char **pack_names;
|
const char **pack_names;
|
||||||
struct packed_git **packs;
|
struct packed_git **packs;
|
||||||
|
|
||||||
struct repository *repo;
|
|
||||||
|
|
||||||
char object_dir[FLEX_ARRAY];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MIDX_PROGRESS (1 << 0)
|
#define MIDX_PROGRESS (1 << 0)
|
||||||
|
|
|
@ -216,7 +216,7 @@ static uint32_t bitmap_num_objects(struct bitmap_index *index)
|
||||||
static struct repository *bitmap_repo(struct bitmap_index *bitmap_git)
|
static struct repository *bitmap_repo(struct bitmap_index *bitmap_git)
|
||||||
{
|
{
|
||||||
if (bitmap_is_midx(bitmap_git))
|
if (bitmap_is_midx(bitmap_git))
|
||||||
return bitmap_git->midx->repo;
|
return bitmap_git->midx->source->odb->repo;
|
||||||
return bitmap_git->pack->repo;
|
return bitmap_git->pack->repo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,13 +418,13 @@ char *midx_bitmap_filename(struct multi_pack_index *midx)
|
||||||
{
|
{
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
if (midx->has_chain)
|
if (midx->has_chain)
|
||||||
get_split_midx_filename_ext(midx->repo->hash_algo, &buf,
|
get_split_midx_filename_ext(midx->source->odb->repo->hash_algo, &buf,
|
||||||
midx->object_dir,
|
midx->source->path,
|
||||||
get_midx_checksum(midx),
|
get_midx_checksum(midx),
|
||||||
MIDX_EXT_BITMAP);
|
MIDX_EXT_BITMAP);
|
||||||
else
|
else
|
||||||
get_midx_filename_ext(midx->repo->hash_algo, &buf,
|
get_midx_filename_ext(midx->source->odb->repo->hash_algo, &buf,
|
||||||
midx->object_dir, get_midx_checksum(midx),
|
midx->source->path, get_midx_checksum(midx),
|
||||||
MIDX_EXT_BITMAP);
|
MIDX_EXT_BITMAP);
|
||||||
|
|
||||||
return strbuf_detach(&buf, NULL);
|
return strbuf_detach(&buf, NULL);
|
||||||
|
@ -463,7 +463,8 @@ static int open_midx_bitmap_1(struct bitmap_index *bitmap_git,
|
||||||
|
|
||||||
if (bitmap_git->pack || bitmap_git->midx) {
|
if (bitmap_git->pack || bitmap_git->midx) {
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
get_midx_filename(midx->repo->hash_algo, &buf, midx->object_dir);
|
get_midx_filename(midx->source->odb->repo->hash_algo, &buf,
|
||||||
|
midx->source->path);
|
||||||
trace2_data_string("bitmap", bitmap_repo(bitmap_git),
|
trace2_data_string("bitmap", bitmap_repo(bitmap_git),
|
||||||
"ignoring extra midx bitmap file", buf.buf);
|
"ignoring extra midx bitmap file", buf.buf);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
|
@ -379,25 +379,25 @@ int load_midx_revindex(struct multi_pack_index *m)
|
||||||
* not want to accidentally call munmap() in the middle of the
|
* not want to accidentally call munmap() in the middle of the
|
||||||
* MIDX.
|
* MIDX.
|
||||||
*/
|
*/
|
||||||
trace2_data_string("load_midx_revindex", m->repo,
|
trace2_data_string("load_midx_revindex", m->source->odb->repo,
|
||||||
"source", "midx");
|
"source", "midx");
|
||||||
m->revindex_data = (const uint32_t *)m->chunk_revindex;
|
m->revindex_data = (const uint32_t *)m->chunk_revindex;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
trace2_data_string("load_midx_revindex", m->repo,
|
trace2_data_string("load_midx_revindex", m->source->odb->repo,
|
||||||
"source", "rev");
|
"source", "rev");
|
||||||
|
|
||||||
if (m->has_chain)
|
if (m->has_chain)
|
||||||
get_split_midx_filename_ext(m->repo->hash_algo, &revindex_name,
|
get_split_midx_filename_ext(m->source->odb->repo->hash_algo, &revindex_name,
|
||||||
m->object_dir, get_midx_checksum(m),
|
m->source->path, get_midx_checksum(m),
|
||||||
MIDX_EXT_REV);
|
MIDX_EXT_REV);
|
||||||
else
|
else
|
||||||
get_midx_filename_ext(m->repo->hash_algo, &revindex_name,
|
get_midx_filename_ext(m->source->odb->repo->hash_algo, &revindex_name,
|
||||||
m->object_dir, get_midx_checksum(m),
|
m->source->path, get_midx_checksum(m),
|
||||||
MIDX_EXT_REV);
|
MIDX_EXT_REV);
|
||||||
|
|
||||||
ret = load_revindex_from_disk(m->repo->hash_algo,
|
ret = load_revindex_from_disk(m->source->odb->repo->hash_algo,
|
||||||
revindex_name.buf,
|
revindex_name.buf,
|
||||||
m->num_objects,
|
m->num_objects,
|
||||||
&m->revindex_map,
|
&m->revindex_map,
|
||||||
|
|
|
@ -66,7 +66,7 @@ static int read_midx_file(const char *object_dir, const char *checksum,
|
||||||
for (i = 0; i < m->num_packs; i++)
|
for (i = 0; i < m->num_packs; i++)
|
||||||
printf("%s\n", m->pack_names[i]);
|
printf("%s\n", m->pack_names[i]);
|
||||||
|
|
||||||
printf("object-dir: %s\n", m->object_dir);
|
printf("object-dir: %s\n", m->source->path);
|
||||||
|
|
||||||
if (show_objects) {
|
if (show_objects) {
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
|
|
Loading…
Reference in New Issue