Skip to content

Commit

Permalink
reset.c: enable fscache
Browse files Browse the repository at this point in the history
In git reset --hard, unpack-trees() is called with oneway_merge().
oneway_merge calls lstat for each files in a repository.
It is bottleneck of git reset --hard, especially in large repository.

This patch improves time by using fscache.
In chromium repository, time of git reset --hard is changed like below.
I took 3 times stats in the repository.

master:
TotalSeconds: 21.0337971
TotalSeconds: 20.0046612
TotalSeconds: 20.6501752
Avg: 20.5628778333333

this patch:
TotalSeconds: 4.8552376
TotalSeconds: 4.8722343
TotalSeconds: 4.9268245
Avg: 4.88476546666667

Signed-off-by: Takuto Ikuta <tikuta@chromium.org>
  • Loading branch information
Takuto Ikuta committed Jan 16, 2018
1 parent d0192a7 commit ce7699f
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion builtin/reset.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ static int reset_index(const struct object_id *oid, int reset_type, int quiet)
struct tree *tree;
struct unpack_trees_options opts;
int ret = -1;
int unpack_result;

memset(&opts, 0, sizeof(opts));
opts.head_idx = 1;
Expand Down Expand Up @@ -91,7 +92,11 @@ static int reset_index(const struct object_id *oid, int reset_type, int quiet)
}
nr++;

if (unpack_trees(nr, desc, &opts))
enable_fscache(1);
unpack_result = unpack_trees(nr, desc, &opts);
enable_fscache(0);

if (unpack_result)
goto out;

if (reset_type == MIXED || reset_type == HARD) {
Expand Down

0 comments on commit ce7699f

Please sign in to comment.