]> git.ipfire.org Git - thirdparty/git.git/commitdiff
packed-backend: mmap large "packed-refs" file during fsck
authorshejialuo <shejialuo@gmail.com>
Wed, 14 May 2025 15:50:42 +0000 (23:50 +0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 14 May 2025 19:32:59 +0000 (12:32 -0700)
During fsck, we use "strbuf_read" to read the content of "packed-refs"
without using mmap mechanism. This is a bad practice which would consume
more memory than using mmap mechanism. Besides, as all code paths in
"packed-backend.c" use this way, we should make "fsck" align with the
current codebase.

As we have introduced the helper function "allocate_snapshot_buffer", we
can simply use this function to use mmap mechanism.

Suggested-by: Jeff King <peff@peff.net>
Suggested-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: shejialuo <shejialuo@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs/packed-backend.c

index 1da44a3d6d789d33d9e7dcbef699eb8c8ef20edd..7fd73a0e6da3b5a4db630730f6e50c55e38747eb 100644 (file)
@@ -2068,7 +2068,7 @@ static int packed_fsck(struct ref_store *ref_store,
 {
        struct packed_ref_store *refs = packed_downcast(ref_store,
                                                        REF_STORE_READ, "fsck");
-       struct strbuf packed_ref_content = STRBUF_INIT;
+       struct snapshot snapshot = { 0 };
        unsigned int sorted = 0;
        struct stat st;
        int ret = 0;
@@ -2112,7 +2112,7 @@ static int packed_fsck(struct ref_store *ref_store,
                goto cleanup;
        }
 
-       if (!st.st_size) {
+       if (!allocate_snapshot_buffer(&snapshot, fd, &st)) {
                struct fsck_ref_report report = { 0 };
                report.path = "packed-refs";
                ret = fsck_report_ref(o, &report,
@@ -2121,21 +2121,16 @@ static int packed_fsck(struct ref_store *ref_store,
                goto cleanup;
        }
 
-       if (strbuf_read(&packed_ref_content, fd, 0) < 0) {
-               ret = error_errno(_("unable to read '%s'"), refs->path);
-               goto cleanup;
-       }
-
-       ret = packed_fsck_ref_content(o, ref_store, &sorted, packed_ref_content.buf,
-                                     packed_ref_content.buf + packed_ref_content.len);
+       ret = packed_fsck_ref_content(o, ref_store, &sorted, snapshot.start,
+                                     snapshot.eof);
        if (!ret && sorted)
-               ret = packed_fsck_ref_sorted(o, ref_store, packed_ref_content.buf,
-                                            packed_ref_content.buf + packed_ref_content.len);
+               ret = packed_fsck_ref_sorted(o, ref_store, snapshot.start,
+                                            snapshot.eof);
 
 cleanup:
        if (fd >= 0)
                close(fd);
-       strbuf_release(&packed_ref_content);
+       clear_snapshot_buffer(&snapshot);
        return ret;
 }