From: Justin Tobler <jltobler@gmail.com>
To: git@vger.kernel.org
Cc: ps@pks.im, Justin Tobler <jltobler@gmail.com>
Subject: [PATCH v3 1/4] loose: use finite timeout when locking "loose-object-idx" file
Date: Thu, 29 Oct 2026 18:22:17 -0500 [thread overview]
Message-ID: <20261029232220.1245827-2-jltobler@gmail.com> (raw)
In-Reply-To: <20261029232220.1245827-1-jltobler@gmail.com>
Loose object index file writers first attempt to acquire a lock via
`repo_hold_lock_file_for_update_timeout()` and specify a timeout value
of -1. With a negative timeout value, the lock acquisition retries
indefinitely while the lockfile still exists. If a process dies while
holding the lock and leaves a stale lockfile behind, every subsequent
writer of the mapping file hangs forever instead of reporting an error.
Introduce LOOSE_OBJECT_IDX_LOCK_TIMEOUT_MS to set the timeout to 1000ms
and use it for all callers that lock a "loose-object-idx" file. A value
of 1000ms matches the default timeout used for "core.packedRefsTimeout"
and should provide concurrent writers sufficient time to acquire the
lock.
Signed-off-by: Justin Tobler <jltobler@gmail.com>
---
loose.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/loose.c b/loose.c
index d6a2bb5ba3..c6f4ee0ec6 100644
--- a/loose.c
+++ b/loose.c
@@ -14,6 +14,8 @@
static const char *loose_object_header = "# loose-object-idx\n";
+#define LOOSE_OBJECT_IDX_LOCK_TIMEOUT_MS 1000
+
static inline int should_use_loose_object_map(struct repository *repo)
{
return repo->compat_hash_algo && repo->gitdir;
@@ -137,7 +139,8 @@ int repo_write_loose_object_map(struct repository *repo)
repo_common_path_replace(repo, &path, "objects/loose-object-idx");
fd = repo_hold_lock_file_for_update_timeout(repo, &lock, path.buf,
- LOCK_DIE_ON_ERROR, -1);
+ LOCK_DIE_ON_ERROR,
+ LOOSE_OBJECT_IDX_LOCK_TIMEOUT_MS);
iter = kh_begin(map);
if (write_in_full(fd, loose_object_header, strlen(loose_object_header)) < 0)
goto errout;
@@ -180,7 +183,8 @@ static int write_one_object(struct odb_source_loose *loose,
strbuf_addf(&path, "%s/loose-object-idx", loose->base.path);
repo_hold_lock_file_for_update_timeout(loose->base.odb->repo, &lock,
- path.buf, LOCK_DIE_ON_ERROR, -1);
+ path.buf, LOCK_DIE_ON_ERROR,
+ LOOSE_OBJECT_IDX_LOCK_TIMEOUT_MS);
fd = open(path.buf, O_WRONLY | O_CREAT | O_APPEND, 0666);
if (fd < 0)
--
2.56.0.173.gf57c9a7388
next prev parent reply other threads:[~2026-10-29 23:22 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-22 23:40 [PATCH] tmp-objdir: merge loose object index when migrating tmpdir Justin Tobler
2026-10-23 12:19 ` Patrick Steinhardt
2026-10-23 21:25 ` Justin Tobler
2026-10-26 6:39 ` Patrick Steinhardt
2026-10-26 17:58 ` Justin Tobler
2026-10-29 0:24 ` [PATCH v2 0/4] loose: fix migrating "loose-object-idx" with batch fsync Justin Tobler
2026-10-29 0:24 ` [PATCH v2 1/4] loose: use finite timeout when locking "loose-object-idx" file Justin Tobler
2026-10-29 8:05 ` Patrick Steinhardt
2026-10-29 0:24 ` [PATCH v2 2/4] loose: lift loose object index parsing logic into helper Justin Tobler
2026-10-29 8:05 ` Patrick Steinhardt
2026-10-29 21:10 ` Justin Tobler
2026-10-29 0:24 ` [PATCH v2 3/4] loose: lift loose object index writing " Justin Tobler
2026-10-29 8:05 ` Patrick Steinhardt
2026-10-29 21:18 ` Justin Tobler
2026-10-29 0:24 ` [PATCH v2 4/4] tmp-objdir: merge loose object index when migrating tmpdir Justin Tobler
2026-10-29 8:05 ` Patrick Steinhardt
2026-10-29 21:20 ` Justin Tobler
2026-10-29 22:22 ` [PATCH v2 0/4] loose: fix migrating "loose-object-idx" with batch fsync Junio C Hamano
2026-10-29 22:45 ` Justin Tobler
2026-10-29 23:22 ` [PATCH v3 " Justin Tobler
2026-10-29 23:22 ` Justin Tobler [this message]
2026-10-29 23:22 ` [PATCH v3 2/4] loose: lift loose object index parsing logic into helper Justin Tobler
2026-10-29 23:22 ` [PATCH v3 3/4] loose: lift loose object index writing " Justin Tobler
2026-10-29 23:22 ` [PATCH v3 4/4] tmp-objdir: merge loose object index when migrating tmpdir 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=20261029232220.1245827-2-jltobler@gmail.com \
--to=jltobler@gmail.com \
--cc=git@vger.kernel.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.