From: Justin Tobler <jltobler@gmail.com>
To: Patrick Steinhardt <ps@pks.im>
Cc: git@vger.kernel.org, Karthik Nayak <karthik.188@gmail.com>,
Jeff King <peff@peff.net>
Subject: Re: [PATCH v5 09/11] reftable: split up write options
Date: Wed, 24 Jun 2026 17:06:32 -0500 [thread overview]
Message-ID: <ajxR2fLRsIvNYFtz@denethor> (raw)
In-Reply-To: <20260622-b4-pks-refs-avoid-chdir-notify-reparent-v5-9-018475013dbc@pks.im>
On 26/06/22 10:28AM, Patrick Steinhardt wrote:
> When initializing the reftable stack the caller may optionally pass some
> write options. These write options mix up two different concerns though:
>
> - Of course, they allow the caller to configure how new reftables are
> being written.
>
> - But they also allow the caller to configure the stack itself, like
> its hash ID and the `on_reload` callback.
>
> This is somewhat awkward, as it doesn't easily give the caller the
> flexibility to for example write multiple reftables with different
> options. Furthermore, this requires us to eagerly parse relevant
> configuration when initializing the reftable backend.
Naive question: are there any current use cases where callers may want
to write multiple reftables with a different set of options? Can
reftables written with different options pose any correctness issues?
> Refactor the code by splitting out those options that configure the
> stack itself. Creating a new stack will thus only require this limited
> set of options, whereas the caller is expected to pass write options to
> all functions that end up writing tables.
Splitting this up sounds reasonable.
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> refs/reftable-backend.c | 29 +++---
> reftable/reftable-stack.h | 30 +++++-
> reftable/reftable-writer.h | 17 +---
> reftable/stack.c | 100 ++++++++++++-------
> reftable/stack.h | 2 +-
> reftable/writer.c | 21 ++--
> reftable/writer.h | 1 +
> t/helper/test-reftable.c | 2 +-
> t/unit-tests/lib-reftable.c | 8 +-
> t/unit-tests/lib-reftable.h | 2 +
> t/unit-tests/u-reftable-merged.c | 9 +-
> t/unit-tests/u-reftable-readwrite.c | 38 ++++++--
> t/unit-tests/u-reftable-stack.c | 189 ++++++++++++++++--------------------
> t/unit-tests/u-reftable-table.c | 8 +-
> 14 files changed, 258 insertions(+), 198 deletions(-)
>
> diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c
> index 5115a3f4ce..608d71cf10 100644
> --- a/refs/reftable-backend.c
> +++ b/refs/reftable-backend.c
> @@ -48,9 +48,9 @@ static void reftable_backend_on_reload(void *payload)
>
> static int reftable_backend_init(struct reftable_backend *be,
> const char *path,
> - const struct reftable_write_options *_opts)
Ok so now during init we only care about `struct
reftable_stack_options`. The `struct reftable_write_options` are only
needed during reftable writes.
[snip]
> +/* Options related to opening a stack. */
> +struct reftable_stack_options {
> + /*
> + * 4-byte identifier ("sha1", "s256") of the hash. Defaults to SHA1 if
> + * unset.
> + */
> + enum reftable_hash hash_id;
> +
> + /*
> + * Callback function to execute whenever the stack is being reloaded.
> + * This can be used e.g. to discard cached information that relies on
> + * the old stack's data. The payload data will be passed as argument to
> + * the callback.
> + */
> + void (*on_reload)(void *payload);
> + void *on_reload_payload;
> +};
These are the options split out from `struct reftable_write_options` and
are the options used at initialization and expected to remain consistent
across reftable writes. I assume these also won't depend on reading the
config prior to the ref store being initialzed.
[snip]
> diff --git a/reftable/reftable-writer.h b/reftable/reftable-writer.h
> index a66db415c8..6ff4ddfc60 100644
> --- a/reftable/reftable-writer.h
> +++ b/reftable/reftable-writer.h
> @@ -28,11 +28,6 @@ struct reftable_write_options {
> /* how often to write complete keys in each block. */
> uint16_t restart_interval;
>
> - /* 4-byte identifier ("sha1", "s256") of the hash.
> - * Defaults to SHA1 if unset
> - */
> - enum reftable_hash hash_id;
> -
> /* Default mode for creating files. If unset, use 0666 (+umask) */
> unsigned int default_permissions;
>
> @@ -60,15 +55,6 @@ struct reftable_write_options {
> * negative value will cause us to block indefinitely.
> */
> long lock_timeout_ms;
> -
> - /*
> - * Callback function to execute whenever the stack is being reloaded.
> - * This can be used e.g. to discard cached information that relies on
> - * the old stack's data. The payload data will be passed as argument to
> - * the callback.
> - */
> - void (*on_reload)(void *payload);
> - void *on_reload_payload;
> };
These write options are explicitly passed around during write
operations. I assume some of these options must be parsed from the
config and thus will need to be lazy-loaded to avoid "onbranch"
conditions prior to the ref store being initialzed.
The rest of this patch looks to be adjusting call sites to wire these
options through as needed and looks correct. I don't see any changes to
lazy-load write option configuration yet, but I suppose that will happen
in a subsequent patch.
-Justin
next prev parent reply other threads:[~2026-06-24 22:06 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-10 14:57 [PATCH 0/9] refs: stop using `chdir_notify_reparent()` Patrick Steinhardt
2026-06-10 14:57 ` [PATCH 1/9] setup: inline `check_and_apply_repository_format()` Patrick Steinhardt
2026-06-10 14:57 ` [PATCH 2/9] setup: stop applying repository format twice Patrick Steinhardt
2026-06-12 9:00 ` Karthik Nayak
2026-06-15 12:36 ` Patrick Steinhardt
2026-06-10 14:57 ` [PATCH 3/9] setup: don't apply "GIT_REFERENCE_BACKEND" without a repository Patrick Steinhardt
2026-06-10 17:32 ` Junio C Hamano
2026-06-12 6:18 ` Patrick Steinhardt
2026-06-10 14:57 ` [PATCH 4/9] refs: unregister reference stores from "chdir_notify" Patrick Steinhardt
2026-06-12 9:18 ` Karthik Nayak
2026-06-15 12:36 ` Patrick Steinhardt
2026-06-10 14:57 ` [PATCH 5/9] chdir-notify: drop unused `chdir_notify_reparent()` Patrick Steinhardt
2026-06-10 14:57 ` [PATCH 6/9] repository: free main reference database Patrick Steinhardt
2026-06-12 9:20 ` Karthik Nayak
2026-06-10 14:57 ` [PATCH 7/9] refs: fix recursing `get_main_ref_store()` with "onbranch" config Patrick Steinhardt
2026-06-10 14:57 ` [PATCH 8/9] refs: drop local buffer in `refs_compute_filesystem_location()` Patrick Steinhardt
2026-06-10 14:57 ` [PATCH 9/9] refs: always use absolute paths for reference stores Patrick Steinhardt
2026-06-12 9:58 ` Karthik Nayak
2026-06-15 12:36 ` Patrick Steinhardt
2026-06-11 6:53 ` [PATCH 0/9] refs: stop using `chdir_notify_reparent()` Jeff King
2026-06-12 6:18 ` Patrick Steinhardt
2026-06-13 14:00 ` Jeff King
2026-06-15 12:36 ` Patrick Steinhardt
2026-06-15 13:56 ` [PATCH v2 0/8] " Patrick Steinhardt
2026-06-15 13:56 ` [PATCH v2 1/8] setup: inline `check_and_apply_repository_format()` Patrick Steinhardt
2026-06-15 13:56 ` [PATCH v2 2/8] setup: stop applying repository format twice Patrick Steinhardt
2026-06-17 17:22 ` Justin Tobler
2026-06-15 13:56 ` [PATCH v2 3/8] setup: don't apply "GIT_REFERENCE_BACKEND" without a repository Patrick Steinhardt
2026-06-17 17:43 ` Justin Tobler
2026-06-18 6:53 ` Patrick Steinhardt
2026-06-15 13:56 ` [PATCH v2 4/8] refs: unregister reference stores from "chdir_notify" Patrick Steinhardt
2026-06-17 18:02 ` Justin Tobler
2026-06-17 18:07 ` Justin Tobler
2026-06-18 6:54 ` Patrick Steinhardt
2026-06-15 13:56 ` [PATCH v2 5/8] chdir-notify: drop unused `chdir_notify_reparent()` Patrick Steinhardt
2026-06-15 13:56 ` [PATCH v2 6/8] repository: free main reference database Patrick Steinhardt
2026-06-17 18:09 ` Justin Tobler
2026-06-15 13:56 ` [PATCH v2 7/8] refs: fix recursing `get_main_ref_store()` with "onbranch" config Patrick Steinhardt
2026-06-17 18:41 ` Justin Tobler
2026-06-18 5:59 ` Patrick Steinhardt
2026-06-18 14:15 ` Justin Tobler
2026-06-18 14:51 ` Patrick Steinhardt
2026-06-18 15:53 ` Justin Tobler
2026-06-18 16:40 ` Jeff King
2026-06-19 6:25 ` Patrick Steinhardt
2026-06-21 21:12 ` Jeff King
2026-06-22 5:15 ` Patrick Steinhardt
2026-06-15 13:56 ` [PATCH v2 8/8] refs: drop local buffer in `refs_compute_filesystem_location()` Patrick Steinhardt
2026-06-18 6:54 ` [PATCH v3 0/8] refs: stop using `chdir_notify_reparent()` Patrick Steinhardt
2026-06-18 6:54 ` [PATCH v3 1/8] setup: inline `check_and_apply_repository_format()` Patrick Steinhardt
2026-06-18 6:54 ` [PATCH v3 2/8] setup: stop applying repository format twice Patrick Steinhardt
2026-06-18 6:54 ` [PATCH v3 3/8] setup: don't apply "GIT_REFERENCE_BACKEND" without a repository Patrick Steinhardt
2026-06-18 6:54 ` [PATCH v3 4/8] refs: unregister reference stores from "chdir_notify" Patrick Steinhardt
2026-06-18 6:54 ` [PATCH v3 5/8] chdir-notify: drop unused `chdir_notify_reparent()` Patrick Steinhardt
2026-06-18 6:54 ` [PATCH v3 6/8] repository: free main reference database Patrick Steinhardt
2026-06-18 6:54 ` [PATCH v3 7/8] refs: fix recursing `get_main_ref_store()` with "onbranch" config Patrick Steinhardt
2026-06-18 6:54 ` [PATCH v3 8/8] refs: drop local buffer in `refs_compute_filesystem_location()` Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 00/10] refs: stop using `chdir_notify_reparent()` Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 01/10] setup: inline `check_and_apply_repository_format()` Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 02/10] setup: stop applying repository format twice Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 03/10] setup: don't apply "GIT_REFERENCE_BACKEND" without a repository Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 04/10] refs: unregister reference stores from "chdir_notify" Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 05/10] chdir-notify: drop unused `chdir_notify_reparent()` Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 06/10] repository: free main reference database Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 07/10] refs: move parsing of "core.logAllRefUpdates" back into ref stores Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 08/10] refs/reftable-backend: manually parse "core.sharedRepository" Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 09/10] refs: fix recursing `get_main_ref_store()` with "onbranch" config Patrick Steinhardt
2026-06-19 11:27 ` [PATCH v4 10/10] refs: drop local buffer in `refs_compute_filesystem_location()` Patrick Steinhardt
2026-06-22 8:28 ` [PATCH v5 00/11] refs: fix "onbranch" conditions Patrick Steinhardt
2026-06-22 8:28 ` [PATCH v5 01/11] setup: inline `check_and_apply_repository_format()` Patrick Steinhardt
2026-06-22 8:28 ` [PATCH v5 02/11] setup: stop applying repository format twice Patrick Steinhardt
2026-06-22 8:28 ` [PATCH v5 03/11] setup: don't apply "GIT_REFERENCE_BACKEND" without a repository Patrick Steinhardt
2026-06-22 8:28 ` [PATCH v5 04/11] refs: unregister reference stores from "chdir_notify" Patrick Steinhardt
2026-06-22 8:28 ` [PATCH v5 05/11] chdir-notify: drop unused `chdir_notify_reparent()` Patrick Steinhardt
2026-06-22 8:28 ` [PATCH v5 06/11] repository: free main reference database Patrick Steinhardt
2026-06-22 8:28 ` [PATCH v5 07/11] refs: move parsing of "core.logAllRefUpdates" back into ref stores Patrick Steinhardt
2026-06-24 21:22 ` Justin Tobler
2026-06-22 8:28 ` [PATCH v5 08/11] refs/files: lazy-load configuration to fix chicken-and-egg Patrick Steinhardt
2026-06-24 21:36 ` Justin Tobler
2026-06-22 8:28 ` [PATCH v5 09/11] reftable: split up write options Patrick Steinhardt
2026-06-24 22:06 ` Justin Tobler [this message]
2026-06-22 8:28 ` [PATCH v5 10/11] refs/reftable: lazy-load configuration to fix chicken-and-egg Patrick Steinhardt
2026-06-24 22:18 ` Justin Tobler
2026-06-22 8:28 ` [PATCH v5 11/11] refs: protect against chicken-and-egg recursion Patrick Steinhardt
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=ajxR2fLRsIvNYFtz@denethor \
--to=jltobler@gmail.com \
--cc=git@vger.kernel.org \
--cc=karthik.188@gmail.com \
--cc=peff@peff.net \
--cc=ps@pks.im \
/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