Skip to content

Commit

Permalink
trace2: add stats for fsync operations
Browse files Browse the repository at this point in the history
Add some global trace2 statistics for the number of fsyncs performed
during the lifetime of a Git process.

These stats are printed as part of trace2_cmd_exit_fl, which is
presumably where we might want to print any other cross-cutting
statistics.

Signed-off-by: Neeraj Singh <neerajsi@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
neerajsi-msft authored and gitster committed Mar 30, 2022
1 parent 805e0a6 commit 9a49876
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 0 deletions.
5 changes: 5 additions & 0 deletions git-compat-util.h
Expand Up @@ -1281,6 +1281,11 @@ enum fsync_action {
*/
int git_fsync(int fd, enum fsync_action action);

/*
* Writes out trace statistics for fsync using the trace2 API.
*/
void trace_git_fsync_stats(void);

/*
* Preserves errno, prints a message, but gives no warning for ENOENT.
* Returns 0 on success, which includes trying to unlink an object that does
Expand Down
4 changes: 4 additions & 0 deletions t/t0211/scrub_perf.perl
Expand Up @@ -59,6 +59,10 @@
# and highly variable. Just omit them.
goto SKIP_LINE;
}
if ($tokens[$col_category] =~ m/fsync/) {
# fsync events aren't interesting for the test
goto SKIP_LINE;
}
}

# t_abs and t_rel are either blank or a float. Replace the float
Expand Down
1 change: 1 addition & 0 deletions trace2.c
Expand Up @@ -214,6 +214,7 @@ int trace2_cmd_exit_fl(const char *file, int line, int code)
if (!trace2_enabled)
return code;

trace_git_fsync_stats();
trace2_collect_process_info(TRACE2_PROCESS_INFO_EXIT);

tr2main_exit_code = code;
Expand Down
12 changes: 12 additions & 0 deletions wrapper.c
Expand Up @@ -4,6 +4,9 @@
#include "cache.h"
#include "config.h"

static intmax_t count_fsync_writeout_only;
static intmax_t count_fsync_hardware_flush;

#ifdef HAVE_RTLGENRANDOM
/* This is required to get access to RtlGenRandom. */
#define SystemFunction036 NTAPI SystemFunction036
Expand Down Expand Up @@ -564,6 +567,7 @@ int git_fsync(int fd, enum fsync_action action)
{
switch (action) {
case FSYNC_WRITEOUT_ONLY:
count_fsync_writeout_only += 1;

#ifdef __APPLE__
/*
Expand Down Expand Up @@ -595,6 +599,8 @@ int git_fsync(int fd, enum fsync_action action)
return -1;

case FSYNC_HARDWARE_FLUSH:
count_fsync_hardware_flush += 1;

/*
* On macOS, a special fcntl is required to really flush the
* caches within the storage controller. As of this writing,
Expand All @@ -610,6 +616,12 @@ int git_fsync(int fd, enum fsync_action action)
}
}

void trace_git_fsync_stats(void)
{
trace2_data_intmax("fsync", the_repository, "fsync/writeout-only", count_fsync_writeout_only);
trace2_data_intmax("fsync", the_repository, "fsync/hardware-flush", count_fsync_hardware_flush);
}

static int warn_if_unremovable(const char *op, const char *file, int rc)
{
int err;
Expand Down

0 comments on commit 9a49876

Please sign in to comment.