From: Johannes Schindelin <johannes.schindelin@gmx.de>
To: Max Kirillov <max@max630.net>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: [PATCH/RFC 1/2] sha1_file: close all pack files after running
Date: Fri, 02 Oct 2015 12:05:55 +0200 [thread overview]
Message-ID: <33b74e875c7298f67640f5850e88c152@dscho.org> (raw)
In-Reply-To: <1443670163-31193-2-git-send-email-max@max630.net>
Hi Max,
On 2015-10-01 05:29, Max Kirillov wrote:
> When a builtin has done its job, but waits for pager or not waited
> by its caller and still hanging it keeps pack files opened.
> This can cause a number of issues, for example on Windows git gc
> cannot remove the packs.
I did not experience that issue. In any case, closing the packs after the builtin function has returned might not change anything anyway because we are about to `exit()` and that's that.
So I would like to skip this:
> diff --git a/git.c b/git.c
> index 5feba41..ad34680 100644
> --- a/git.c
> +++ b/git.c
> @@ -348,6 +349,7 @@ static int run_builtin(struct cmd_struct *p, int
> argc, const char **argv)
> trace_argv_printf(argv, "trace: built-in: git");
>
> status = p->fn(argc, argv, prefix);
> + close_all_packs();
> if (status)
> return status;
>
Also, I would move the new declaration directly before `close_pack_windows()`:
> diff --git a/cache.h b/cache.h
> index 79066e5..153bc46 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -1279,6 +1279,7 @@ extern void unuse_pack(struct pack_window **);
> extern void free_pack_by_name(const char *);
> extern void clear_delta_base_cache(void);
> extern struct packed_git *add_packed_git(const char *, int, int);
> +extern void close_all_packs(void);
>
> /*
> * Return the SHA-1 of the nth object within the specified packfile.
The convention in Git seems to call things _gently rather than _nodie:
> diff --git a/sha1_file.c b/sha1_file.c
> index 08302f5..62f1dad 100644
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -773,20 +773,28 @@ void *xmmap(void *start, size_t length,
> return ret;
> }
>
> -void close_pack_windows(struct packed_git *p)
> +static int close_pack_windows_nodie(struct packed_git *p)
> {
> while (p->windows) {
> struct pack_window *w = p->windows;
>
> if (w->inuse_cnt)
> - die("pack '%s' still has open windows to it",
> - p->pack_name);
> + return 1;
> +
> munmap(w->base, w->len);
> pack_mapped -= w->len;
> pack_open_windows--;
> p->windows = w->next;
> free(w);
> }
> +
> + return 0;
> +}
And while we're at it, why not teach that function a new parameter `int close_pack_fd`?
There is another problem: when we cannot close the pack window, we cannot really continue, can we? Because if we do, we *still* have the lock, and we'll just fail later, most likely with an unhelpful error message because we do not know where the pack closing failed. I do not think that the warning really helps...
Ciao,
Dscho
next prev parent reply other threads:[~2015-10-02 10:06 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-28 19:44 [PATCH] clone --dissociate: avoid locking pack files Johannes Schindelin
2015-09-30 19:28 ` Max Kirillov
2015-09-30 19:42 ` Junio C Hamano
2015-10-01 3:29 ` [PATCH/RFC 0/2] close packs files when they are not needed Max Kirillov
2015-10-01 3:29 ` [PATCH/RFC 1/2] sha1_file: close all pack files after running Max Kirillov
2015-10-02 10:05 ` Johannes Schindelin [this message]
2015-10-02 10:13 ` Johannes Schindelin
2015-10-02 19:21 ` Max Kirillov
2015-10-04 14:53 ` Johannes Schindelin
2015-10-05 4:57 ` Max Kirillov
2015-10-05 9:03 ` Johannes Schindelin
2015-10-02 19:06 ` Max Kirillov
2015-10-02 20:06 ` Max Kirillov
2015-10-01 3:29 ` [PATCH/RFC 2/2] sha1_file: set packfile to O_CLOEXEC at open Max Kirillov
2015-10-02 10:08 ` Johannes Schindelin
2015-10-01 4:39 ` [PATCH] clone --dissociate: avoid locking pack files Max Kirillov
2015-10-05 18:32 ` Johannes Schindelin
2015-10-05 20:29 ` [PATCH v2 0/4] Fix locking issues on Windows with `git clone --dissociate` Johannes Schindelin
2015-10-05 20:29 ` [PATCH v2 1/4] Demonstrate a Windows file locking issue " Johannes Schindelin
2015-10-05 20:30 ` [PATCH v2 2/4] Consolidate code to close a pack's file descriptor Johannes Schindelin
2015-10-05 20:57 ` Junio C Hamano
2015-10-05 21:52 ` Johannes Schindelin
2015-10-05 22:15 ` Junio C Hamano
2015-10-06 13:42 ` Johannes Schindelin
2015-10-05 20:33 ` [PATCH v2 3/4] Add a function to release all packs Johannes Schindelin
2015-10-05 20:33 ` [PATCH v2 4/4] clone --dissociate: avoid locking pack files Johannes Schindelin
2015-10-05 21:00 ` Junio C Hamano
2015-10-06 13:17 ` [PATCH v3 0/4] Fix locking issues on Windows with `git clone --dissociate` Johannes Schindelin
2015-10-06 13:18 ` [PATCH v3 1/4] Demonstrate a Windows file locking issue " Johannes Schindelin
2015-10-06 13:18 ` [PATCH v3 2/4] Consolidate code to close a pack's file descriptor Johannes Schindelin
2015-10-06 13:18 ` [PATCH v3 3/4] Add a function to release all packs Johannes Schindelin
2015-10-07 17:49 ` Junio C Hamano
2015-10-08 19:10 ` Johannes Schindelin
2015-10-06 13:18 ` [PATCH v3 4/4] clone --dissociate: avoid locking pack files Johannes Schindelin
2015-10-11 10:45 ` [PATCH v3 0/4] Fix locking issues on Windows with `git clone --dissociate` Max Kirillov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=33b74e875c7298f67640f5850e88c152@dscho.org \
--to=johannes.schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=max@max630.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).