From: Justin Tobler <jltobler@gmail.com>
To: git@vger.kernel.org
Cc: ps@pks.im, Justin Tobler <jltobler@gmail.com>
Subject: [PATCH v3 3/4] loose: lift loose object index writing logic into helper
Date: Thu, 29 Oct 2026 18:22:19 -0500 [thread overview]
Message-ID: <20261029232220.1245827-4-jltobler@gmail.com> (raw)
In-Reply-To: <20261029232220.1245827-1-jltobler@gmail.com>
Writing the in-memory loose object map to a "loose-object-idx" file is
handled via `repo_write_loose_object_map()`, which always writes the map
into the primary object directory. In a subsequent commit, a separate
"loose-object-idx" file is staged prior to commit and must be
constructed from a loose object map not attached to the primary loose
object source.
Extract the logic for writing a loose object index file into a separate
`loose_object_map_write()` helper function that allows callers to
explicitly specify both the loose object map as well as the file
descriptor to write the entries to. Note that the responsibility of
locking the file being written to is left to callers so that it is
possible for a lock to be held for longer than just this single
operation.
Signed-off-by: Justin Tobler <jltobler@gmail.com>
---
loose.c | 69 +++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 45 insertions(+), 24 deletions(-)
diff --git a/loose.c b/loose.c
index 5f72c644f9..f2e111c25e 100644
--- a/loose.c
+++ b/loose.c
@@ -146,25 +146,17 @@ int repo_read_loose_object_map(struct repository *repo)
return 0;
}
-int repo_write_loose_object_map(struct repository *repo)
+static int loose_object_map_write(struct repository *repo,
+ struct loose_object_map *loose_map, int fd)
{
- struct odb_source_files *files = odb_source_files_downcast(repo->objects->source);
- kh_oid_map_t *map = files->dirs->loose->map->to_compat;
- struct lock_file lock;
- int fd;
+ kh_oid_map_t *map = loose_map->to_compat;
+ struct strbuf buf = STRBUF_INIT;
khiter_t iter;
- struct strbuf buf = STRBUF_INIT, path = STRBUF_INIT;
-
- if (!should_use_loose_object_map(repo))
- return 0;
+ int ret = -1;
- 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,
- 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;
+ goto out;
for (; iter != kh_end(map); iter++) {
if (kh_exist(map, iter)) {
@@ -173,24 +165,53 @@ int repo_write_loose_object_map(struct repository *repo)
continue;
strbuf_addf(&buf, "%s %s\n", oid_to_hex(&kh_key(map, iter)), oid_to_hex(kh_value(map, iter)));
if (write_in_full(fd, buf.buf, buf.len) < 0)
- goto errout;
+ goto out;
strbuf_reset(&buf);
}
}
+
+ ret = 0;
+
+out:
strbuf_release(&buf);
+
+ return ret;
+}
+
+int repo_write_loose_object_map(struct repository *repo)
+{
+ struct odb_source_files *files = odb_source_files_downcast(repo->objects->source);
+ struct strbuf path = STRBUF_INIT;
+ struct lock_file lock;
+ int ret;
+ int fd;
+
+ if (!should_use_loose_object_map(repo))
+ return 0;
+
+ 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,
+ LOOSE_OBJECT_IDX_LOCK_TIMEOUT_MS);
+
+ if (loose_object_map_write(repo, files->dirs->loose->map, fd) < 0) {
+ ret = error_errno(_("unable to write %s"),
+ get_lock_file_path(&lock));
+ goto out;
+ }
+
if (commit_lock_file(&lock) < 0) {
- error_errno(_("could not write loose object index %s"), path.buf);
- strbuf_release(&path);
- return -1;
+ ret = error_errno(_("unable to write %s"), path.buf);
+ goto out;
}
- strbuf_release(&path);
- return 0;
-errout:
+
+ ret = 0;
+
+out:
rollback_lock_file(&lock);
- strbuf_release(&buf);
- error_errno(_("failed to write loose object index %s"), path.buf);
strbuf_release(&path);
- return -1;
+
+ return ret;
}
static int write_one_object(struct odb_source_loose *loose,
--
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 ` [PATCH v3 1/4] loose: use finite timeout when locking "loose-object-idx" file Justin Tobler
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 ` Justin Tobler [this message]
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-4-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox