midx: start tracking per object database source
Multi-pack indices are tracked via `struct multi_pack_index`. This data
structure is stored as a linked list inside `struct object_database`,
which is the global database that spans across all of the object
sources.
This layout causes two problems:
- Object databases consist of multiple object sources (e.g. one source
per alternate object directory), where each multi-pack index is
specific to one of those sources. Regardless of that though, the
MIDX is not tracked per source, but tracked globally for the whole
object database. This creates a mismatch between the on-disk layout
and how things are organized in the object database subsystems and
makes some parts, like figuring out whether a source has an MIDX,
quite awkward.
- Multi-pack indices are an implementation detail of how efficient
access for packfiles work. As such, they are neither relevant in the
context of loose objects, nor in a potential future where we have
pluggable backends.
Refactor `prepare_multi_pack_index_one()` so that it works on a specific
source, which allows us to easily store a pointer to the multi-pack
index inside of it. For now, this pointer exists next to the existing
linked list we have in the object database. Users will be adjusted in
subsequent patches to instead use the per-source pointers.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
c29998d1d4
commit
4d8be89d97
19
midx.c
19
midx.c
@@ -724,28 +724,29 @@ int midx_preferred_pack(struct multi_pack_index *m, uint32_t *pack_int_id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local)
|
int prepare_multi_pack_index_one(struct odb_source *source, int local)
|
||||||
{
|
{
|
||||||
|
struct repository *r = source->odb->repo;
|
||||||
struct multi_pack_index *m;
|
struct multi_pack_index *m;
|
||||||
struct multi_pack_index *m_search;
|
|
||||||
|
|
||||||
prepare_repo_settings(r);
|
prepare_repo_settings(r);
|
||||||
if (!r->settings.core_multi_pack_index)
|
if (!r->settings.core_multi_pack_index)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (m_search = r->objects->multi_pack_index; m_search; m_search = m_search->next)
|
if (source->midx)
|
||||||
if (!strcmp(object_dir, m_search->object_dir))
|
return 1;
|
||||||
return 1;
|
|
||||||
|
|
||||||
m = load_multi_pack_index(r, object_dir, local);
|
|
||||||
|
|
||||||
|
m = load_multi_pack_index(r, source->path, local);
|
||||||
if (m) {
|
if (m) {
|
||||||
struct multi_pack_index *mp = r->objects->multi_pack_index;
|
struct multi_pack_index *mp = r->objects->multi_pack_index;
|
||||||
if (mp) {
|
if (mp) {
|
||||||
m->next = mp->next;
|
m->next = mp->next;
|
||||||
mp->next = m;
|
mp->next = m;
|
||||||
} else
|
} else {
|
||||||
r->objects->multi_pack_index = m;
|
r->objects->multi_pack_index = m;
|
||||||
|
}
|
||||||
|
source->midx = m;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -837,6 +838,8 @@ void clear_midx_file(struct repository *r)
|
|||||||
if (r->objects && r->objects->multi_pack_index) {
|
if (r->objects && r->objects->multi_pack_index) {
|
||||||
close_midx(r->objects->multi_pack_index);
|
close_midx(r->objects->multi_pack_index);
|
||||||
r->objects->multi_pack_index = NULL;
|
r->objects->multi_pack_index = NULL;
|
||||||
|
for (struct odb_source *source = r->objects->sources; source; source = source->next)
|
||||||
|
source->midx = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (remove_path(midx.buf))
|
if (remove_path(midx.buf))
|
||||||
|
|||||||
3
midx.h
3
midx.h
@@ -8,6 +8,7 @@ struct pack_entry;
|
|||||||
struct repository;
|
struct repository;
|
||||||
struct bitmapped_pack;
|
struct bitmapped_pack;
|
||||||
struct git_hash_algo;
|
struct git_hash_algo;
|
||||||
|
struct odb_source;
|
||||||
|
|
||||||
#define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */
|
#define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */
|
||||||
#define MIDX_VERSION 1
|
#define MIDX_VERSION 1
|
||||||
@@ -123,7 +124,7 @@ int fill_midx_entry(struct repository *r, const struct object_id *oid, struct pa
|
|||||||
int midx_contains_pack(struct multi_pack_index *m,
|
int midx_contains_pack(struct multi_pack_index *m,
|
||||||
const char *idx_or_pack_name);
|
const char *idx_or_pack_name);
|
||||||
int midx_preferred_pack(struct multi_pack_index *m, uint32_t *pack_int_id);
|
int midx_preferred_pack(struct multi_pack_index *m, uint32_t *pack_int_id);
|
||||||
int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local);
|
int prepare_multi_pack_index_one(struct odb_source *source, int local);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Variant of write_midx_file which writes a MIDX containing only the packs
|
* Variant of write_midx_file which writes a MIDX containing only the packs
|
||||||
|
|||||||
9
odb.h
9
odb.h
@@ -13,6 +13,7 @@ struct oidmap;
|
|||||||
struct oidtree;
|
struct oidtree;
|
||||||
struct strbuf;
|
struct strbuf;
|
||||||
struct repository;
|
struct repository;
|
||||||
|
struct multi_pack_index;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compute the exact path an alternate is at and returns it. In case of
|
* Compute the exact path an alternate is at and returns it. In case of
|
||||||
@@ -55,6 +56,13 @@ struct odb_source {
|
|||||||
/* Map between object IDs for loose objects. */
|
/* Map between object IDs for loose objects. */
|
||||||
struct loose_object_map *loose_map;
|
struct loose_object_map *loose_map;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* private data
|
||||||
|
*
|
||||||
|
* should only be accessed directly by packfile.c and midx.c
|
||||||
|
*/
|
||||||
|
struct multi_pack_index *midx;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is a temporary object store created by the tmp_objdir
|
* This is a temporary object store created by the tmp_objdir
|
||||||
* facility. Disable ref updates since the objects in the store
|
* facility. Disable ref updates since the objects in the store
|
||||||
@@ -75,7 +83,6 @@ struct odb_source {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct packed_git;
|
struct packed_git;
|
||||||
struct multi_pack_index;
|
|
||||||
struct cached_object_entry;
|
struct cached_object_entry;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -372,6 +372,8 @@ void close_object_store(struct object_database *o)
|
|||||||
if (o->multi_pack_index) {
|
if (o->multi_pack_index) {
|
||||||
close_midx(o->multi_pack_index);
|
close_midx(o->multi_pack_index);
|
||||||
o->multi_pack_index = NULL;
|
o->multi_pack_index = NULL;
|
||||||
|
for (struct odb_source *source = o->sources; source; source = source->next)
|
||||||
|
source->midx = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
close_commit_graph(o);
|
close_commit_graph(o);
|
||||||
@@ -1037,7 +1039,7 @@ static void prepare_packed_git(struct repository *r)
|
|||||||
odb_prepare_alternates(r->objects);
|
odb_prepare_alternates(r->objects);
|
||||||
for (source = r->objects->sources; source; source = source->next) {
|
for (source = r->objects->sources; source; source = source->next) {
|
||||||
int local = (source == r->objects->sources);
|
int local = (source == r->objects->sources);
|
||||||
prepare_multi_pack_index_one(r, source->path, local);
|
prepare_multi_pack_index_one(source, local);
|
||||||
prepare_packed_git_one(r, source->path, local);
|
prepare_packed_git_one(r, source->path, local);
|
||||||
}
|
}
|
||||||
rearrange_packed_git(r);
|
rearrange_packed_git(r);
|
||||||
|
|||||||
Reference in New Issue
Block a user