@matheusbsbs / matheus-bagliano / commits / fd73ccf279
Fork 0

Cope better with a _lot_ of packs

You might end up with a situation where you have tons of pack files, e.g. when using hg2git. In this situation, all kinds of operations may end up with a "too many files open" error. Let's recover gracefully from that. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Looks-right-to-me-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Johannes Schindelin committed May 15, 2009 at 20:52 UTC fd73ccf27956f24dc0db9acd4ff7d9dcd5e41bfb
1 file changed +6
sha1_file.c
+6
@@ -720,6 +720,8 @@ static int open_packed_git_1(struct packed_git *p)
720 return error("packfile %s index unavailable", p->pack_name);
721
722 p->pack_fd = open(p->pack_name, O_RDONLY);
723 + while (p->pack_fd < 0 && errno == EMFILE && unuse_one_window(p, -1))
724 + p->pack_fd = open(p->pack_name, O_RDONLY);
725 if (p->pack_fd < 0 || fstat(p->pack_fd, &st))
726 return -1;
727
@@ -937,6 +939,8 @@ static void prepare_packed_git_one(char *objdir, int local)
939 sprintf(path, "%s/pack", objdir);
940 len = strlen(path);
941 dir = opendir(path);
942 + while (!dir && errno == EMFILE && unuse_one_window(packed_git, -1))
943 + dir = opendir(path);
944 if (!dir) {
945 if (errno != ENOENT)
946 error("unable to open object pack directory: %s: %s",
@@ -2339,6 +2343,8 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen,
2343
2344 filename = sha1_file_name(sha1);
2345 fd = create_tmpfile(tmpfile, sizeof(tmpfile), filename);
2346 + while (fd < 0 && errno == EMFILE && unuse_one_window(packed_git, -1))
2347 + fd = create_tmpfile(tmpfile, sizeof(tmpfile), filename);
2348 if (fd < 0) {
2349 if (errno == EACCES)
2350 return error("insufficient permission for adding an object to repository database %s\n", get_object_directory());