mirror of
https://github.com/git/git.git
synced 2026-01-09 17:46:37 +00:00
fsck: avoid reading every object twice
During verify_pack() all objects are read for SHA-1 check. Then fsck_sha1() is called on every object, which read the object again (fsck_sha1 -> parse_object -> read_sha1_file). Avoid reading an object twice, do fsck_sha1 while we have an object uncompressed data in verify_pack. On git.git, with this patch I got: $ /usr/bin/time ./git fsck >/dev/null 98.97user 0.90system 1:40.01elapsed 99%CPU (0avgtext+0avgdata 616624maxresident)k 0inputs+0outputs (0major+194186minor)pagefaults 0swaps Without it: $ /usr/bin/time ./git fsck >/dev/null 231.23user 2.35system 3:53.82elapsed 99%CPU (0avgtext+0avgdata 636688maxresident)k 0inputs+0outputs (0major+461629minor)pagefaults 0swaps Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
473935188c
commit
c9486eb04d
13
pack-check.c
13
pack-check.c
@@ -42,7 +42,8 @@ int check_pack_crc(struct packed_git *p, struct pack_window **w_curs,
|
||||
}
|
||||
|
||||
static int verify_packfile(struct packed_git *p,
|
||||
struct pack_window **w_curs)
|
||||
struct pack_window **w_curs,
|
||||
verify_fn fn)
|
||||
{
|
||||
off_t index_size = p->index_size;
|
||||
const unsigned char *index_base = p->index_data;
|
||||
@@ -120,6 +121,12 @@ static int verify_packfile(struct packed_git *p,
|
||||
else if (check_sha1_signature(entries[i].sha1, data, size, typename(type)))
|
||||
err = error("packed %s from %s is corrupt",
|
||||
sha1_to_hex(entries[i].sha1), p->pack_name);
|
||||
else if (fn) {
|
||||
int eaten = 0;
|
||||
fn(entries[i].sha1, type, size, data, &eaten);
|
||||
if (eaten)
|
||||
data = NULL;
|
||||
}
|
||||
free(data);
|
||||
}
|
||||
free(entries);
|
||||
@@ -150,7 +157,7 @@ int verify_pack_index(struct packed_git *p)
|
||||
return err;
|
||||
}
|
||||
|
||||
int verify_pack(struct packed_git *p)
|
||||
int verify_pack(struct packed_git *p, verify_fn fn)
|
||||
{
|
||||
int err = 0;
|
||||
struct pack_window *w_curs = NULL;
|
||||
@@ -159,7 +166,7 @@ int verify_pack(struct packed_git *p)
|
||||
if (!p->index_data)
|
||||
return -1;
|
||||
|
||||
err |= verify_packfile(p, &w_curs);
|
||||
err |= verify_packfile(p, &w_curs, fn);
|
||||
unuse_pack(&w_curs);
|
||||
|
||||
return err;
|
||||
|
||||
Reference in New Issue
Block a user