Thread (49 messages) flat view 49 messages, 5 authors, 2016-06-27

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

From: Duy Nguyen <hidden>
Date: 2016-06-25 14:34:30

On Thu, May 19, 2016 at 11:45 PM, David Turner [off-list ref] 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.
quoted hunk ↗ jump to hunk
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help