packed-backend: mmap large "packed-refs" file during fsck
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>
This commit is contained in:
committed by
Junio C Hamano
parent
a0dee3f74b
commit
86ddd588f2
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user