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 08/11] refs/files: lazy-load configuration to fix chicken-and-egg
Date: Wed, 24 Jun 2026 16:36:28 -0500 [thread overview]
Message-ID: <ajxKh-IrC2EPWJnW@denethor> (raw)
In-Reply-To: <20260622-b4-pks-refs-avoid-chdir-notify-reparent-v5-8-018475013dbc@pks.im>
On 26/06/22 10:28AM, Patrick Steinhardt wrote:
> When initializing the "files" reference backend we read the repository's
> config to parse "core.preferSymlinkRefs" and "core.logAllRefUpdates".
> This results in a chicken-and-egg problem though, because parsing the
> configuration may require us to have access to the reference store
> already when an "onbranch" condition exists.
Ok so both of these configuration options are currently parsed at ref
store initialization time. This is problematic because we need the ref
store to properly handle "onbranch" conditions in the config.
> Luckily, all the configuration that we honor only relates to writing
> references. Consequently, we don't strictly need that configuration to
> be readily available at initialization time, and we can easiliy defer
> parsing it to a later point in time.
That's nice. So we don't actually need this configuration during
initialization and can instead lazily load it when writing the first
references. Makes sense.
> Implement this fix and add tests that verify that we can indeed properly
> parse these config knobs via an "onbranch" condition.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> refs/files-backend.c | 37 ++++++++++++++++++++++++++-----------
> t/t0600-reffiles-backend.sh | 21 +++++++++++++++++++++
> 2 files changed, 47 insertions(+), 11 deletions(-)
>
> diff --git a/refs/files-backend.c b/refs/files-backend.c
> index 79fb6735e1..d0f379dcd6 100644
> --- a/refs/files-backend.c
> +++ b/refs/files-backend.c
> @@ -84,12 +84,14 @@ struct files_ref_store {
> unsigned int store_flags;
>
> char *gitcommondir;
> - enum log_refs_config log_all_ref_updates;
> - int prefer_symlink_refs;
> -
> struct ref_cache *loose;
> -
> struct ref_store *packed_ref_store;
> +
> + struct files_ref_store_write_options {
> + enum log_refs_config log_all_ref_updates;
> + int prefer_symlink_refs;
> + bool initialized;
> + } write_opts_lazy_loaded;
It might be nice to leave some sort of breadcrumb comment to future
readers to explain why we lazy load this configuration.
> };
>
> static void clear_loose_ref_cache(struct files_ref_store *refs)
> @@ -121,17 +123,31 @@ static int files_ref_store_config(const char *var, const char *value,
> const struct config_context *ctx UNUSED,
> void *payload)
> {
> - struct files_ref_store *refs = payload;
> + struct files_ref_store_write_options *opts = payload;
>
> if (!strcmp(var, "core.prefersymlinkrefs")) {
> - refs->prefer_symlink_refs = git_config_bool(var, value);
> + opts->prefer_symlink_refs = git_config_bool(var, value);
> } else if (!strcmp(var, "core.logallrefupdates")) {
> - refs->log_all_ref_updates = refs_parse_log_all_ref_updates_config(value);
> + opts->log_all_ref_updates = refs_parse_log_all_ref_updates_config(value);
> }
>
> return 0;
> }
>
> +static const struct files_ref_store_write_options *files_ref_store_write_options(struct files_ref_store *refs)
> +{
> + struct files_ref_store_write_options *opts = &refs->write_opts_lazy_loaded;
> +
> + if (opts->initialized)
> + return opts;
> +
> + opts->log_all_ref_updates = LOG_REFS_UNSET;
> + repo_config(refs->base.repo, files_ref_store_config, opts);
> +
> + opts->initialized = true;
> + return opts;
> +}
> +
> /*
> * Create a new submodule ref cache and add it to the internal
> * set of caches.
> @@ -156,9 +172,7 @@ static struct ref_store *files_ref_store_init(struct repository *repo,
> refs->packed_ref_store =
> packed_ref_store_init(repo, NULL, refs->gitcommondir, opts);
> refs->store_flags = opts->access_flags;
> - refs->log_all_ref_updates = LOG_REFS_UNSET;
>
> - repo_config(repo, files_ref_store_config, refs);
Configs are no longer read eagerly during initialization.
The rest of this patch looks good to me.
-Justin
next prev parent reply other threads:[~2026-06-24 21:36 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 [this message]
2026-06-22 8:28 ` [PATCH v5 09/11] reftable: split up write options Patrick Steinhardt
2026-06-24 22:06 ` Justin Tobler
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=ajxKh-IrC2EPWJnW@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