]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sparse-index: count lstat() calls
authorDerrick Stolee <stolee@gmail.com>
Fri, 28 Jun 2024 12:43:24 +0000 (12:43 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 28 Jun 2024 19:32:12 +0000 (12:32 -0700)
The clear_skip_worktree.. methods already report some statistics about
how many cache entries are checked against path_found() due to having
the skip-worktree bit set. However, due to path_found() performing some
caching, this isn't the only information that would be helpful to
report.

Add a new lstat_count member to the path_found_data struct to count the
number of times path_found() calls lstat(). This will be helpful to help
explain performance problems in this method as well as to demonstrate
future changes to the caching algorithm in a more concrete way than
end-to-end timings.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sparse-index.c

index fec4f3933600c16d3a680eb48b10efc810383d2a..8577fa726b800151eff3ae4e0a0fa7fd8d4a7fc0 100644 (file)
@@ -442,6 +442,7 @@ void ensure_correct_sparsity(struct index_state *istate)
 struct path_found_data {
        struct strbuf dir;
        int dir_found;
+       size_t lstat_count;
 };
 
 #define PATH_FOUND_DATA_INIT { \
@@ -469,6 +470,7 @@ static int path_found(const char *path, struct path_found_data *data)
        /*
         * If path itself exists, return 1.
         */
+       data->lstat_count++;
        if (!lstat(path, &st))
                return 1;
 
@@ -493,6 +495,7 @@ static int path_found(const char *path, struct path_found_data *data)
        strbuf_reset(&data->dir);
        strbuf_add(&data->dir, path, newdir - path + 1);
 
+       data->lstat_count++;
        data->dir_found = !lstat(data->dir.buf, &st);
 
        return 0;
@@ -524,6 +527,8 @@ static int clear_skip_worktree_from_present_files_sparse(struct index_state *ist
 
        trace2_data_intmax("index", istate->repo,
                           "sparse_path_count", path_count);
+       trace2_data_intmax("index", istate->repo,
+                          "sparse_lstat_count", data.lstat_count);
        trace2_region_leave("index", "clear_skip_worktree_from_present_files_sparse",
                            istate->repo);
        clear_path_found_data(&data);
@@ -553,6 +558,8 @@ static void clear_skip_worktree_from_present_files_full(struct index_state *ista
 
        trace2_data_intmax("index", istate->repo,
                           "full_path_count", path_count);
+       trace2_data_intmax("index", istate->repo,
+                          "full_lstat_count", data.lstat_count);
        trace2_region_leave("index", "clear_skip_worktree_from_present_files_full",
                            istate->repo);
        clear_path_found_data(&data);