Re: [PATCH v12 04/20] index-helper: new daemon for caching index and related stuff

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 19, 2016 at 11:45 PM, David Turner <dturner@xxxxxxxxxxxxxxxx> wrote:
>  .gitignore                             |   1 +
>  Documentation/git-index-helper.txt     |  50 ++++++
>  Makefile                               |   5 +
>  cache.h                                |  11 ++
>  contrib/completion/git-completion.bash |   1 +
>  git-compat-util.h                      |   1 +
>  index-helper.c                         | 280 +++++++++++++++++++++++++++++++++
>  read-cache.c                           | 125 +++++++++++++--
>  t/t7900-index-helper.sh                |  23 +++
>  9 files changed, 488 insertions(+), 9 deletions(-)
>  create mode 100644 Documentation/git-index-helper.txt
>  create mode 100644 index-helper.c
>  create mode 100755 t/t7900-index-helper.sh

We still need to classify this new command in command-list.txt.
purehelpers probably the easiest choice.

> +NOTES
> +-----
> +
> +$GIT_DIR/index-helper.sock a Unix domain socket that the daemon reads
> +commands from.  The directory will also contain files named
> +"shm-index-<SHA1>".  These are used as backing stores for shared
> +memory.  Normally the daemon will clean up these files when it exits
> +or when they are no longer relevant.  But if it crashes, some objects
> +could remain there and they can be safely deleted with "rm"
> +command. The following commands are used to control the daemon:
> +
> +"refresh"::
> +       Reread the index.
> +
> +"poke":
> +       Let the daemon know the index is to be read. It keeps the
> +       daemon alive longer, unless `--exit-after=0` is used.
> +
> +All commands and replies are terminated by a NUL byte.

I think it's "all commands are replies are in pkt-line format" now.

> diff --git a/Makefile b/Makefile
> index 2742a69..c8be0e7 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1433,6 +1433,10 @@ ifdef HAVE_DEV_TTY
>         BASIC_CFLAGS += -DHAVE_DEV_TTY
>  endif
>
> +ifndef NO_MMAP
> +       PROGRAM_OBJS += index-helper.o
> +endif

We need unix-socket.c too, which is only built when NO_UNIX_SOCKETS
are not defined. We don't have any platform where mmap is supported
but unix socket is not, do we?

(a couple of minutes later, reading to read-cache.c..) well
poke_daemon() calls unix_stream_connect() without any #ifdef, if
NO_UNIX_SOCKETS is set, then it would lead to undefined reference
error.

> +static void set_socket_blocking_flag(int fd, int make_nonblocking)
> +{
> +       int flags;
> +
> +       flags = fcntl(fd, F_GETFL, NULL);
> +
> +       if (flags < 0)
> +               die(_("fcntl failed"));
> +
> +       if (make_nonblocking)
> +               flags |= O_NONBLOCK;
> +       else
> +               flags &= ~O_NONBLOCK;
> +
> +       if (fcntl(fd, F_SETFL, flags) < 0)
> +               die(_("fcntl failed"));
> +}
> ...
> +               client_fd = accept(fd, NULL, NULL);
> +               if (client_fd < 0)
> +                       /*
> +                        * An error here is unlikely -- it probably
> +                        * indicates that the connecting process has
> +                        * already dropped the connection.
> +                        */
> +                       continue;
> +
> +               /*
> +                * Our connection to the client is blocking since a client
> +                * can always be killed by SIGINT or similar.
> +                */
> +               set_socket_blocking_flag(client_fd, 0);

Out of curiosity, do we really need this? I thought default behavior
was always blocking (and checked linux kernel, it seemed to agree with
me). Maybe for extra safety because other OSes may default to
something else?

> +static int poke_daemon(struct index_state *istate,
> +                      const struct stat *st, int refresh_cache)
> +{
> +       int fd;
> +       int ret = 0;
> +       const char *socket_path;
> +
> +       /* if this is from index-helper, do not poke itself (recursively) */
> +       if (istate->to_shm)
> +               return 0;
> +
> +       socket_path = git_path("index-helper.sock");
> +       if (!socket_path)
> +               return -1;

This "if" is later removed. But you can remove it now if you re-roll,
git_path() must not fail or we are screwed up long before this.
-- 
Duy
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]