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
@ -282,14 +282,8 @@ static void check_connectivity(void)
|
||||
}
|
||||
}
|
||||
|
||||
static int fsck_sha1(const unsigned char *sha1)
|
||||
static int fsck_obj(struct object *obj)
|
||||
{
|
||||
struct object *obj = parse_object(sha1);
|
||||
if (!obj) {
|
||||
errors_found |= ERROR_OBJECT;
|
||||
return error("%s: object corrupt or missing",
|
||||
sha1_to_hex(sha1));
|
||||
}
|
||||
if (obj->flags & SEEN)
|
||||
return 0;
|
||||
obj->flags |= SEEN;
|
||||
@ -332,6 +326,29 @@ static int fsck_sha1(const unsigned char *sha1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fsck_sha1(const unsigned char *sha1)
|
||||
{
|
||||
struct object *obj = parse_object(sha1);
|
||||
if (!obj) {
|
||||
errors_found |= ERROR_OBJECT;
|
||||
return error("%s: object corrupt or missing",
|
||||
sha1_to_hex(sha1));
|
||||
}
|
||||
return fsck_obj(obj);
|
||||
}
|
||||
|
||||
static int fsck_obj_buffer(const unsigned char *sha1, enum object_type type,
|
||||
unsigned long size, void *buffer, int *eaten)
|
||||
{
|
||||
struct object *obj;
|
||||
obj = parse_object_buffer(sha1, type, size, buffer, eaten);
|
||||
if (!obj) {
|
||||
errors_found |= ERROR_OBJECT;
|
||||
return error("%s: object corrupt or missing", sha1_to_hex(sha1));
|
||||
}
|
||||
return fsck_obj(obj);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the sorting chunk size: make it reasonably
|
||||
* big so that we can sort well..
|
||||
@ -627,17 +644,8 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
|
||||
prepare_packed_git();
|
||||
for (p = packed_git; p; p = p->next)
|
||||
/* verify gives error messages itself */
|
||||
if (verify_pack(p))
|
||||
if (verify_pack(p, fsck_obj_buffer))
|
||||
errors_found |= ERROR_PACK;
|
||||
|
||||
for (p = packed_git; p; p = p->next) {
|
||||
uint32_t j, num;
|
||||
if (open_pack_index(p))
|
||||
continue;
|
||||
num = p->num_objects;
|
||||
for (j = 0; j < num; j++)
|
||||
fsck_sha1(nth_packed_object_sha1(p, j));
|
||||
}
|
||||
}
|
||||
|
||||
heads = 0;
|
||||
|
||||
Reference in New Issue
Block a user