]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/stack: refactor reloading to use file descriptor
authorPatrick Steinhardt <ps@pks.im>
Thu, 11 Jan 2024 10:06:43 +0000 (11:06 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 11 Jan 2024 20:10:59 +0000 (12:10 -0800)
We're about to introduce a stat(3P)-based caching mechanism to reload
the list of stacks only when it has changed. In order to avoid race
conditions this requires us to have a file descriptor available that we
can use to call fstat(3P) on.

Prepare for this by converting the code to use `fd_read_lines()` so that
we have the file descriptor readily available.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reftable/stack.c

index bf869a6772f9e3230527bbc859c53f7c50da6c40..b1ee247601dba4a2f0d47c6b41e4de9dceff7ee0 100644 (file)
@@ -308,6 +308,7 @@ static int reftable_stack_reload_maybe_reuse(struct reftable_stack *st,
        struct timeval deadline;
        int64_t delay = 0;
        int tries = 0, err;
+       int fd = -1;
 
        err = gettimeofday(&deadline, NULL);
        if (err < 0)
@@ -329,9 +330,19 @@ static int reftable_stack_reload_maybe_reuse(struct reftable_stack *st,
                if (tries > 3 && tv_cmp(&now, &deadline) >= 0)
                        goto out;
 
-               err = read_lines(st->list_file, &names);
-               if (err < 0)
-                       goto out;
+               fd = open(st->list_file, O_RDONLY);
+               if (fd < 0) {
+                       if (errno != ENOENT) {
+                               err = REFTABLE_IO_ERROR;
+                               goto out;
+                       }
+
+                       names = reftable_calloc(sizeof(char *));
+               } else {
+                       err = fd_read_lines(fd, &names);
+                       if (err < 0)
+                               goto out;
+               }
 
                err = reftable_stack_reload_once(st, names, reuse_open);
                if (!err)
@@ -356,12 +367,16 @@ static int reftable_stack_reload_maybe_reuse(struct reftable_stack *st,
                names = NULL;
                free_names(names_after);
                names_after = NULL;
+               close(fd);
+               fd = -1;
 
                delay = delay + (delay * rand()) / RAND_MAX + 1;
                sleep_millisec(delay);
        }
 
 out:
+       if (fd >= 0)
+               close(fd);
        free_names(names);
        free_names(names_after);
        return err;