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
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to