fscache: add fscache hit statistics

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>
This commit is contained in:
Ben Peart 2018-09-25 16:28:16 -04:00 коммит произвёл Johannes Schindelin
Родитель e010243f12
Коммит 827e890cb7
1 изменённых файлов: 16 добавлений и 0 удалений

Просмотреть файл

@ -9,6 +9,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);
/*
@ -263,6 +267,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;
}
/*
@ -309,6 +315,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) {
@ -372,6 +379,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) */
@ -409,6 +417,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;
}
@ -425,6 +435,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);
}
@ -457,6 +471,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]))
@ -538,6 +553,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] == '.') ||