Skip to content

Commit

Permalink
mingw: add infrastructure for read-only file system level caches
Browse files Browse the repository at this point in the history
Add a macro to mark code sections that only read from the file system,
along with a config option and documentation.

This facilitates implementation of relatively simple file system level
caches without the need to synchronize with the file system.

Enable read-only sections for 'git status' and preload_index.

Signed-off-by: Karsten Blees <blees@dcon.de>
  • Loading branch information
kblees authored and dscho committed Sep 24, 2024
1 parent 1913d2b commit 6d42e40
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Documentation/config/core.txt
Original file line number Diff line number Diff line change
Expand Up @@ -685,6 +685,12 @@ relatively high IO latencies. When enabled, Git will do the
index comparison to the filesystem data in parallel, allowing
overlapping IO's. Defaults to true.

core.fscache::
Enable additional caching of file system data for some operations.
+
Git for Windows uses this to bulk-read and cache lstat data of entire
directories (instead of doing lstat file by file).

core.unsetenvvars::
Windows-only: comma-separated list of environment variables'
names that need to be unset before spawning any other process.
Expand Down
1 change: 1 addition & 0 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -1568,6 +1568,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
PATHSPEC_PREFER_FULL,
prefix, argv);

enable_fscache(1);
if (status_format != STATUS_FORMAT_PORCELAIN &&
status_format != STATUS_FORMAT_PORCELAIN_V2)
progress_flag = REFRESH_PROGRESS;
Expand Down
6 changes: 6 additions & 0 deletions compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ enum hide_dotfiles_type {
static int core_restrict_inherited_handles = -1;
static enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
static char *unset_environment_variables;
int core_fscache;

int mingw_core_config(const char *var, const char *value,
const struct config_context *ctx, void *cb)
Expand All @@ -256,6 +257,11 @@ int mingw_core_config(const char *var, const char *value,
return 0;
}

if (!strcmp(var, "core.fscache")) {
core_fscache = git_config_bool(var, value);
return 0;
}

if (!strcmp(var, "core.unsetenvvars")) {
if (!value)
return config_error_nonbool(var);
Expand Down
2 changes: 2 additions & 0 deletions compat/mingw.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ typedef _sigset_t sigset_t;
#undef _POSIX_THREAD_SAFE_FUNCTIONS
#endif

extern int core_fscache;

struct config_context;
int mingw_core_config(const char *var, const char *value,
const struct config_context *ctx, void *cb);
Expand Down
15 changes: 15 additions & 0 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -1520,6 +1520,21 @@ static inline int is_missing_file_error(int errno_)
return (errno_ == ENOENT || errno_ == ENOTDIR);
}

/*
* Enable/disable a read-only cache for file system data on platforms that
* support it.
*
* Implementing a live-cache is complicated and requires special platform
* support (inotify, ReadDirectoryChangesW...). enable_fscache shall be used
* to mark sections of git code that extensively read from the file system
* without modifying anything. Implementations can use this to cache e.g. stat
* data or even file content without the need to synchronize with the file
* system.
*/
#ifndef enable_fscache
#define enable_fscache(x) /* noop */
#endif

int cmd_main(int, const char **);

/*
Expand Down
3 changes: 3 additions & 0 deletions preload-index.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ void preload_index(struct index_state *index,
pthread_mutex_init(&pd.mutex, NULL);
}

enable_fscache(1);
for (i = 0; i < threads; i++) {
struct thread_data *p = data+i;
int err;
Expand Down Expand Up @@ -167,6 +168,8 @@ void preload_index(struct index_state *index,

trace2_data_intmax("index", NULL, "preload/sum_lstat", t2_sum_lstat);
trace2_region_leave("index", "preload", NULL);

enable_fscache(0);
}

int repo_read_index_preload(struct repository *repo,
Expand Down

0 comments on commit 6d42e40

Please sign in to comment.