mirror of
https://github.com/git/git.git
synced 2026-01-12 05:43:12 +09:00
packfile: refactor misleading code when unusing pack windows
The function `unuse_one_window()` is responsible for unmapping one of the packfile windows, which is done when we have exceeded the allowed number of window. The function receives a `struct packed_git` as input, which serves as an additional packfile that should be considered to be closed. If not given, we seemingly skip that and instead go through all of the repository's packfiles. The conditional that checks whether we have a packfile though does not make much sense anymore, as we dereference the packfile regardless of whether or not it is a `NULL` pointer to derive the repository's packfile store. The function was originally introduced via f0e17e86e1 (pack: move release_pack_memory(), 2017-08-18), and here we indeed had a caller that passed a `NULL` pointer. That caller was later removed via 9827d4c185 (packfile: drop release_pack_memory(), 2019-08-12), so starting with that commit we always pass a `struct packed_git`. In 9c5ce06d74 (packfile: use `repository` from `packed_git` directly, 2024-12-03) we then inadvertently started to rely on the fact that the pointer is never `NULL` because we use it now to identify the repository. Arguably, it didn't really make sense in the first place that the caller provides a packfile, as the selected window would have been overridden anyway by the subsequent loop over all packfiles if there was an older window. So the overall logic is quite misleading overall. The only case where it _could_ make a difference is when there were two packfiles with the same `last_used` value, but that case doesn't ever happen because the `pack_used_ctr` is strictly increasing. Refactor the code so that we instead pass in the object database to help make the code less misleading. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
085de91b95
commit
eb9ec52d95
11
packfile.c
11
packfile.c
@ -355,16 +355,15 @@ static void scan_windows(struct packed_git *p,
|
||||
}
|
||||
}
|
||||
|
||||
static int unuse_one_window(struct packed_git *current)
|
||||
static int unuse_one_window(struct object_database *odb)
|
||||
{
|
||||
struct packfile_list_entry *e;
|
||||
struct packed_git *lru_p = NULL;
|
||||
struct pack_window *lru_w = NULL, *lru_l = NULL;
|
||||
|
||||
if (current)
|
||||
scan_windows(current, &lru_p, &lru_w, &lru_l);
|
||||
for (e = current->repo->objects->packfiles->packs.head; e; e = e->next)
|
||||
for (e = odb->packfiles->packs.head; e; e = e->next)
|
||||
scan_windows(e->pack, &lru_p, &lru_w, &lru_l);
|
||||
|
||||
if (lru_p) {
|
||||
munmap(lru_w->base, lru_w->len);
|
||||
pack_mapped -= lru_w->len;
|
||||
@ -740,8 +739,8 @@ unsigned char *use_pack(struct packed_git *p,
|
||||
win->len = (size_t)len;
|
||||
pack_mapped += win->len;
|
||||
|
||||
while (settings->packed_git_limit < pack_mapped
|
||||
&& unuse_one_window(p))
|
||||
while (settings->packed_git_limit < pack_mapped &&
|
||||
unuse_one_window(p->repo->objects))
|
||||
; /* nothing */
|
||||
win->base = xmmap_gently(NULL, win->len,
|
||||
PROT_READ, MAP_PRIVATE,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user