[PATCH 1/3] midx: verify: add midx packfiles to the packed_git list
- From
- Jeff Hostetler via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Mar 18, 2019, 14:29 UTC
- Message-ID
- <d1a730df94a02f4424fa1b9e543981aea4999d77.1552919394.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.166.git.gitgitgadget@gmail.com>
From: Jeff Hostetler <jeffhost@microsoft.com>
Fix "git multi-pack-index verify" to handle repos with thousands of packfiles.
Midx verify adds the individual "packed_git" structures to the multi_pack_index.packs array, but it does not add them to the "repository.objects.packed_git" list. During the verification code, each packfile is opened and scanned. And "pack_open_fds" is incremented. If "pack_open_fds" equals the "pack_max_fds" open_packed_git_1() calls close_one_pack() to LRU-style close an already open packfile. But because the packfiles were never added to the "packed_git" list, close_one_pack() does nothing. If there are very many packfiles, Git runs out of file descriptors and fails.
Note that this was observed on Windows when build with GCC and in a repository with more than (2048-25) packfiles.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> --- midx.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/midx.c b/midx.c index 8a505fd423..d2c39b6d37 100644 --- a/midx.c +++ b/midx.c @@ -971,6 +971,9 @@ int verify_midx_file(const char *object_dir) for (i = 0; i < m->num_packs; i++) { if (prepare_midx_pack(m, i)) midx_report("failed to load pack in position %d", i); + + if (m->packs[i]) + install_packed_git(the_repository, m->packs[i]); } for (i = 0; i < 255; i++) {
-- gitgitgadget