mirror of
https://github.com/git/git.git
synced 2026-01-10 10:13:33 +00:00
odb: move list of packfiles into struct packfile_store
The object database tracks the list of packfiles it currently knows about. With the introduction of the `struct packfile_store` we have a better place to host this list though. Move the list accordingly. Extract the logic from `odb_clear()` that knows to close all such packfiles and move it into the new subsystem, as well. 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
b7983adb51
commit
535b7a667a
12
odb.c
12
odb.c
@@ -1038,16 +1038,8 @@ void odb_clear(struct object_database *o)
|
|||||||
|
|
||||||
INIT_LIST_HEAD(&o->packed_git_mru);
|
INIT_LIST_HEAD(&o->packed_git_mru);
|
||||||
close_object_store(o);
|
close_object_store(o);
|
||||||
|
packfile_store_free(o->packfiles);
|
||||||
/*
|
o->packfiles = NULL;
|
||||||
* `close_object_store()` only closes the packfiles, but doesn't free
|
|
||||||
* them. We thus have to do this manually.
|
|
||||||
*/
|
|
||||||
for (struct packed_git *p = o->packed_git, *next; p; p = next) {
|
|
||||||
next = p->next;
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
o->packed_git = NULL;
|
|
||||||
|
|
||||||
hashmap_clear(&o->pack_map);
|
hashmap_clear(&o->pack_map);
|
||||||
string_list_clear(&o->submodule_source_paths, 0);
|
string_list_clear(&o->submodule_source_paths, 0);
|
||||||
|
|||||||
1
odb.h
1
odb.h
@@ -138,7 +138,6 @@ struct object_database {
|
|||||||
* should only be accessed directly by packfile.c
|
* should only be accessed directly by packfile.c
|
||||||
*/
|
*/
|
||||||
struct packfile_store *packfiles;
|
struct packfile_store *packfiles;
|
||||||
struct packed_git *packed_git;
|
|
||||||
/* A most-recently-used ordered version of the packed_git list. */
|
/* A most-recently-used ordered version of the packed_git list. */
|
||||||
struct list_head packed_git_mru;
|
struct list_head packed_git_mru;
|
||||||
|
|
||||||
|
|||||||
42
packfile.c
42
packfile.c
@@ -278,7 +278,7 @@ static int unuse_one_window(struct packed_git *current)
|
|||||||
|
|
||||||
if (current)
|
if (current)
|
||||||
scan_windows(current, &lru_p, &lru_w, &lru_l);
|
scan_windows(current, &lru_p, &lru_w, &lru_l);
|
||||||
for (p = current->repo->objects->packed_git; p; p = p->next)
|
for (p = current->repo->objects->packfiles->packs; p; p = p->next)
|
||||||
scan_windows(p, &lru_p, &lru_w, &lru_l);
|
scan_windows(p, &lru_p, &lru_w, &lru_l);
|
||||||
if (lru_p) {
|
if (lru_p) {
|
||||||
munmap(lru_w->base, lru_w->len);
|
munmap(lru_w->base, lru_w->len);
|
||||||
@@ -362,13 +362,8 @@ void close_pack(struct packed_git *p)
|
|||||||
void close_object_store(struct object_database *o)
|
void close_object_store(struct object_database *o)
|
||||||
{
|
{
|
||||||
struct odb_source *source;
|
struct odb_source *source;
|
||||||
struct packed_git *p;
|
|
||||||
|
|
||||||
for (p = o->packed_git; p; p = p->next)
|
packfile_store_close(o->packfiles);
|
||||||
if (p->do_not_close)
|
|
||||||
BUG("want to close pack marked 'do-not-close'");
|
|
||||||
else
|
|
||||||
close_pack(p);
|
|
||||||
|
|
||||||
for (source = o->sources; source; source = source->next) {
|
for (source = o->sources; source; source = source->next) {
|
||||||
if (source->midx)
|
if (source->midx)
|
||||||
@@ -468,7 +463,7 @@ static int close_one_pack(struct repository *r)
|
|||||||
struct pack_window *mru_w = NULL;
|
struct pack_window *mru_w = NULL;
|
||||||
int accept_windows_inuse = 1;
|
int accept_windows_inuse = 1;
|
||||||
|
|
||||||
for (p = r->objects->packed_git; p; p = p->next) {
|
for (p = r->objects->packfiles->packs; p; p = p->next) {
|
||||||
if (p->pack_fd == -1)
|
if (p->pack_fd == -1)
|
||||||
continue;
|
continue;
|
||||||
find_lru_pack(p, &lru_p, &mru_w, &accept_windows_inuse);
|
find_lru_pack(p, &lru_p, &mru_w, &accept_windows_inuse);
|
||||||
@@ -789,8 +784,8 @@ void install_packed_git(struct repository *r, struct packed_git *pack)
|
|||||||
if (pack->pack_fd != -1)
|
if (pack->pack_fd != -1)
|
||||||
pack_open_fds++;
|
pack_open_fds++;
|
||||||
|
|
||||||
pack->next = r->objects->packed_git;
|
pack->next = r->objects->packfiles->packs;
|
||||||
r->objects->packed_git = pack;
|
r->objects->packfiles->packs = pack;
|
||||||
|
|
||||||
hashmap_entry_init(&pack->packmap_ent, strhash(pack->pack_name));
|
hashmap_entry_init(&pack->packmap_ent, strhash(pack->pack_name));
|
||||||
hashmap_add(&r->objects->pack_map, &pack->packmap_ent);
|
hashmap_add(&r->objects->pack_map, &pack->packmap_ent);
|
||||||
@@ -974,7 +969,7 @@ unsigned long repo_approximate_object_count(struct repository *r)
|
|||||||
count += m->num_objects;
|
count += m->num_objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (p = r->objects->packed_git; p; p = p->next) {
|
for (p = r->objects->packfiles->packs; p; p = p->next) {
|
||||||
if (open_pack_index(p))
|
if (open_pack_index(p))
|
||||||
continue;
|
continue;
|
||||||
count += p->num_objects;
|
count += p->num_objects;
|
||||||
@@ -1015,7 +1010,7 @@ static int sort_pack(const struct packed_git *a, const struct packed_git *b)
|
|||||||
|
|
||||||
static void rearrange_packed_git(struct repository *r)
|
static void rearrange_packed_git(struct repository *r)
|
||||||
{
|
{
|
||||||
sort_packs(&r->objects->packed_git, sort_pack);
|
sort_packs(&r->objects->packfiles->packs, sort_pack);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prepare_packed_git_mru(struct repository *r)
|
static void prepare_packed_git_mru(struct repository *r)
|
||||||
@@ -1024,7 +1019,7 @@ static void prepare_packed_git_mru(struct repository *r)
|
|||||||
|
|
||||||
INIT_LIST_HEAD(&r->objects->packed_git_mru);
|
INIT_LIST_HEAD(&r->objects->packed_git_mru);
|
||||||
|
|
||||||
for (p = r->objects->packed_git; p; p = p->next)
|
for (p = r->objects->packfiles->packs; p; p = p->next)
|
||||||
list_add_tail(&p->mru, &r->objects->packed_git_mru);
|
list_add_tail(&p->mru, &r->objects->packed_git_mru);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1073,7 +1068,7 @@ void reprepare_packed_git(struct repository *r)
|
|||||||
struct packed_git *get_packed_git(struct repository *r)
|
struct packed_git *get_packed_git(struct repository *r)
|
||||||
{
|
{
|
||||||
prepare_packed_git(r);
|
prepare_packed_git(r);
|
||||||
return r->objects->packed_git;
|
return r->objects->packfiles->packs;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct multi_pack_index *get_multi_pack_index(struct odb_source *source)
|
struct multi_pack_index *get_multi_pack_index(struct odb_source *source)
|
||||||
@@ -1094,7 +1089,7 @@ struct packed_git *get_all_packs(struct repository *r)
|
|||||||
prepare_midx_pack(m, i);
|
prepare_midx_pack(m, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
return r->objects->packed_git;
|
return r->objects->packfiles->packs;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct list_head *get_packed_git_mru(struct repository *r)
|
struct list_head *get_packed_git_mru(struct repository *r)
|
||||||
@@ -1219,7 +1214,7 @@ const struct packed_git *has_packed_and_bad(struct repository *r,
|
|||||||
{
|
{
|
||||||
struct packed_git *p;
|
struct packed_git *p;
|
||||||
|
|
||||||
for (p = r->objects->packed_git; p; p = p->next)
|
for (p = r->objects->packfiles->packs; p; p = p->next)
|
||||||
if (oidset_contains(&p->bad_objects, oid))
|
if (oidset_contains(&p->bad_objects, oid))
|
||||||
return p;
|
return p;
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -2080,7 +2075,7 @@ int find_pack_entry(struct repository *r, const struct object_id *oid, struct pa
|
|||||||
if (source->midx && fill_midx_entry(source->midx, oid, e))
|
if (source->midx && fill_midx_entry(source->midx, oid, e))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (!r->objects->packed_git)
|
if (!r->objects->packfiles->packs)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
list_for_each(pos, &r->objects->packed_git_mru) {
|
list_for_each(pos, &r->objects->packed_git_mru) {
|
||||||
@@ -2343,5 +2338,18 @@ struct packfile_store *packfile_store_new(struct object_database *odb)
|
|||||||
|
|
||||||
void packfile_store_free(struct packfile_store *store)
|
void packfile_store_free(struct packfile_store *store)
|
||||||
{
|
{
|
||||||
|
for (struct packed_git *p = store->packs, *next; p; p = next) {
|
||||||
|
next = p->next;
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
free(store);
|
free(store);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void packfile_store_close(struct packfile_store *store)
|
||||||
|
{
|
||||||
|
for (struct packed_git *p = store->packs; p; p = p->next) {
|
||||||
|
if (p->do_not_close)
|
||||||
|
BUG("want to close pack marked 'do-not-close'");
|
||||||
|
close_pack(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
15
packfile.h
15
packfile.h
@@ -57,6 +57,12 @@ struct packed_git {
|
|||||||
*/
|
*/
|
||||||
struct packfile_store {
|
struct packfile_store {
|
||||||
struct object_database *odb;
|
struct object_database *odb;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The list of packfiles in the order in which they are being added to
|
||||||
|
* the store.
|
||||||
|
*/
|
||||||
|
struct packed_git *packs;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -66,10 +72,17 @@ struct packfile_store {
|
|||||||
struct packfile_store *packfile_store_new(struct object_database *odb);
|
struct packfile_store *packfile_store_new(struct object_database *odb);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free the packfile store and all its associated state.
|
* Free the packfile store and all its associated state. All packfiles
|
||||||
|
* tracked by the store will be closed.
|
||||||
*/
|
*/
|
||||||
void packfile_store_free(struct packfile_store *store);
|
void packfile_store_free(struct packfile_store *store);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Close all packfiles associated with this store. The packfiles won't be
|
||||||
|
* free'd, so they can be re-opened at a later point in time.
|
||||||
|
*/
|
||||||
|
void packfile_store_close(struct packfile_store *store);
|
||||||
|
|
||||||
static inline int pack_map_entry_cmp(const void *cmp_data UNUSED,
|
static inline int pack_map_entry_cmp(const void *cmp_data UNUSED,
|
||||||
const struct hashmap_entry *entry,
|
const struct hashmap_entry *entry,
|
||||||
const struct hashmap_entry *entry2,
|
const struct hashmap_entry *entry2,
|
||||||
|
|||||||
Reference in New Issue
Block a user