From: Karthik Nayak <karthik.188@gmail.com>
To: git@vger.kernel.org
Cc: Karthik Nayak <karthik.188@gmail.com>
Subject: [PATCH 2/3] reftable/stack: move list lock to `struct reftable_stack`
Date: Wed, 19 Aug 2026 15:19:38 +0200 [thread overview]
Message-ID: <20260819-740-optimize-reloading-the-reftable-stack-v1-2-6bf5305d4e43@gmail.com> (raw)
In-Reply-To: <20260819-740-optimize-reloading-the-reftable-stack-v1-0-6bf5305d4e43@gmail.com>
The struct `reftable_addition` is used to modify a given stack, as such,
it also includes a `struct reftable_flock` used to obtain the lock to
the list file. While the scope of the field lies within this struct, it
doesn't allow for optimizations to be made on `struct reftable_stack`
itself.
Move the field to `struct reftable_stack`, allowing us to make a simple
optimization around avoiding a stack reload when we have already
obtained a lock. While this is currently possible in the write path, the
write path also contains multiple branches to reads which only work
on top of `struct reftable_stack`, and we would miss the optimization in
such paths.
While here, remove an unused header file from 'reftable/stack.h'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
reftable/stack.c | 15 ++++++++-------
reftable/stack.h | 7 ++++++-
2 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/reftable/stack.c b/reftable/stack.c
index 540f5e77ac..e449af9c03 100644
--- a/reftable/stack.c
+++ b/reftable/stack.c
@@ -536,6 +536,8 @@ int reftable_new_stack(struct reftable_stack **dest, const char *dir,
goto out;
}
+ p->list_lock = REFTABLE_FLOCK_INIT;
+
err = reftable_stack_reload_maybe_reuse(p, 1);
if (err < 0)
goto out;
@@ -628,7 +630,6 @@ int reftable_stack_reload(struct reftable_stack *st)
}
struct reftable_addition {
- struct reftable_flock tables_list_lock;
struct reftable_stack *stack;
struct reftable_write_options opts;
@@ -653,7 +654,7 @@ static void reftable_addition_close(struct reftable_addition *add)
add->new_tables_len = 0;
add->new_tables_cap = 0;
- flock_release(&add->tables_list_lock);
+ flock_release(&add->stack->list_lock);
reftable_buf_release(&nm);
}
@@ -669,13 +670,13 @@ static int reftable_stack_init_addition(struct reftable_addition *add,
if (opts)
add->opts = *opts;
- err = flock_acquire(&add->tables_list_lock, st->list_file,
+ err = flock_acquire(&add->stack->list_lock, st->list_file,
add->opts.lock_timeout_ms);
if (err < 0)
goto done;
if (add->opts.default_permissions) {
- if (chmod(add->tables_list_lock.path,
+ if (chmod(add->stack->list_lock.path,
add->opts.default_permissions) < 0) {
err = REFTABLE_IO_ERROR;
goto done;
@@ -774,7 +775,7 @@ int reftable_addition_commit(struct reftable_addition *add)
goto done;
}
- err = reftable_write_data(add->tables_list_lock.fd,
+ err = reftable_write_data(add->stack->list_lock.fd,
table_list.buf, table_list.len);
reftable_buf_release(&table_list);
if (err < 0) {
@@ -782,13 +783,13 @@ int reftable_addition_commit(struct reftable_addition *add)
goto done;
}
- err = fsync(add->tables_list_lock.fd);
+ err = fsync(add->stack->list_lock.fd);
if (err < 0) {
err = REFTABLE_IO_ERROR;
goto done;
}
- err = flock_commit(&add->tables_list_lock);
+ err = flock_commit(&add->stack->list_lock);
if (err < 0) {
err = REFTABLE_IO_ERROR;
goto done;
diff --git a/reftable/stack.h b/reftable/stack.h
index f7901e6c6f..52e07ad551 100644
--- a/reftable/stack.h
+++ b/reftable/stack.h
@@ -10,7 +10,6 @@
#define STACK_H
#include "system.h"
-#include "reftable-writer.h"
#include "reftable-stack.h"
struct reftable_stack {
@@ -18,6 +17,12 @@ struct reftable_stack {
char *list_file;
int list_fd;
+ /*
+ * Set while an addition holds the stack locked. Used by
+ * stack_uptodate() to skip reload checks while locked.
+ */
+ struct reftable_flock list_lock;
+
char *reftable_dir;
struct reftable_stack_options opts;
--
2.55.GIT
next prev parent reply other threads:[~2026-08-19 13:20 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-19 13:19 [PATCH 0/3] reftable/stack: avoid reloading the stack when locked Karthik Nayak
2026-08-19 13:19 ` [PATCH 1/3] reftable/stack: remove `REFTABLE_STACK_NEW_ADDITION_RELOAD` Karthik Nayak
2026-08-19 16:28 ` Justin Tobler
2026-08-19 13:19 ` Karthik Nayak [this message]
2026-08-19 16:39 ` [PATCH 2/3] reftable/stack: move list lock to `struct reftable_stack` Justin Tobler
2026-08-19 17:17 ` Junio C Hamano
2026-08-19 13:19 ` [PATCH 3/3] reftable/stack: avoid reloading the stack when already locked Karthik Nayak
2026-08-19 16:49 ` Justin Tobler
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=20260819-740-optimize-reloading-the-reftable-stack-v1-2-6bf5305d4e43@gmail.com \
--to=karthik.188@gmail.com \
--cc=git@vger.kernel.org \
/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