Skip to content

Commit

Permalink
fscache: add fscache hit statistics
Browse files Browse the repository at this point in the history
Track fscache hits and misses for lstat and opendir requests.  Reporting of
statistics is done when the cache is disabled for the last time and freed
and is only reported if GIT_TRACE_FSCACHE is set.

Sample output is:

11:33:11.836428 compat/win32/fscache.c:433 fscache: lstat 3775, opendir 263, total requests/misses 4052/269

Signed-off-by: Ben Peart <benpeart@microsoft.com>
  • Loading branch information
benpeart authored and dscho committed Sep 24, 2024
1 parent 26798fc commit 57d95da
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions compat/win32/fscache.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ static int initialized;
static volatile long enabled;
static struct hashmap map;
static CRITICAL_SECTION mutex;
static unsigned int lstat_requests;
static unsigned int opendir_requests;
static unsigned int fscache_requests;
static unsigned int fscache_misses;
static struct trace_key trace_fscache = TRACE_KEY_INIT(FSCACHE);

/*
Expand Down Expand Up @@ -265,6 +269,8 @@ static void fscache_clear(void)
{
hashmap_clear_and_free(&map, struct fsentry, ent);
hashmap_init(&map, (hashmap_cmp_fn)fsentry_cmp, NULL, 0);
lstat_requests = opendir_requests = 0;
fscache_misses = fscache_requests = 0;
}

/*
Expand Down Expand Up @@ -311,6 +317,7 @@ static struct fsentry *fscache_get(struct fsentry *key)
int dir_not_found;

EnterCriticalSection(&mutex);
fscache_requests++;
/* check if entry is in cache */
fse = fscache_get_wait(key);
if (fse) {
Expand Down Expand Up @@ -374,6 +381,7 @@ static struct fsentry *fscache_get(struct fsentry *key)
}

/* add directory listing to the cache */
fscache_misses++;
fscache_add(fse);

/* lookup file entry if requested (fse already points to directory) */
Expand Down Expand Up @@ -411,6 +419,8 @@ int fscache_enable(int enable)
return 0;

InitializeCriticalSection(&mutex);
lstat_requests = opendir_requests = 0;
fscache_misses = fscache_requests = 0;
hashmap_init(&map, (hashmap_cmp_fn) fsentry_cmp, NULL, 0);
initialized = 1;
}
Expand All @@ -427,6 +437,10 @@ int fscache_enable(int enable)
opendir = dirent_opendir;
lstat = mingw_lstat;
EnterCriticalSection(&mutex);
trace_printf_key(&trace_fscache, "fscache: lstat %u, opendir %u, "
"total requests/misses %u/%u\n",
lstat_requests, opendir_requests,
fscache_requests, fscache_misses);
fscache_clear();
LeaveCriticalSection(&mutex);
}
Expand Down Expand Up @@ -459,6 +473,7 @@ int fscache_lstat(const char *filename, struct stat *st)
if (!fscache_enabled(filename))
return mingw_lstat(filename, st);

lstat_requests++;
/* split filename into path + name */
len = strlen(filename);
if (len && is_dir_sep(filename[len - 1]))
Expand Down Expand Up @@ -540,6 +555,7 @@ DIR *fscache_opendir(const char *dirname)
if (!fscache_enabled(dirname))
return dirent_opendir(dirname);

opendir_requests++;
/* prepare name (strip trailing '/', replace '.') */
len = strlen(dirname);
if ((len == 1 && dirname[0] == '.') ||
Expand Down

0 comments on commit 57d95da

Please sign in to comment.