Merge branch 'jn/eoie-ieot'

As the warning message shown by existing versions of Git for
unknown index extensions is a bit too alarming, two new extensions
are held back and not written by default for the upcoming release.

* jn/eoie-ieot:
  index: make index.threads=true enable ieot and eoie
  ieot: default to not writing IEOT section
  eoie: default to not writing EOIE section
This commit is contained in:
Junio C Hamano 2018-11-21 20:39:02 +09:00
commit cdda0ccebf
5 changed files with 69 additions and 18 deletions

View file

@ -1,3 +1,19 @@
index.recordEndOfIndexEntries::
Specifies whether the index file should include an "End Of Index
Entry" section. This reduces index load time on multiprocessor
machines but produces a message "ignoring EOIE extension" when
reading the index using Git versions before 2.20. Defaults to
'true' if index.threads has been explicitly enabled, 'false'
otherwise.
index.recordOffsetTable::
Specifies whether the index file should include an "Index Entry
Offset Table" section. This reduces index load time on
multiprocessor machines but produces a message "ignoring IEOT
extension" when reading the index using Git versions before 2.20.
Defaults to 'true' if index.threads has been explicitly enabled,
'false' otherwise.
index.threads:: index.threads::
Specifies the number of threads to spawn when loading the index. Specifies the number of threads to spawn when loading the index.
This is meant to reduce index load time on multiprocessor machines. This is meant to reduce index load time on multiprocessor machines.

View file

@ -2294,22 +2294,25 @@ int git_config_get_fsmonitor(void)
return 0; return 0;
} }
int git_config_get_index_threads(void) int git_config_get_index_threads(int *dest)
{ {
int is_bool, val = 0; int is_bool, val;
val = git_env_ulong("GIT_TEST_INDEX_THREADS", 0); val = git_env_ulong("GIT_TEST_INDEX_THREADS", 0);
if (val) if (val) {
return val; *dest = val;
return 0;
}
if (!git_config_get_bool_or_int("index.threads", &is_bool, &val)) { if (!git_config_get_bool_or_int("index.threads", &is_bool, &val)) {
if (is_bool) if (is_bool)
return val ? 0 : 1; *dest = val ? 0 : 1;
else else
return val; *dest = val;
return 0;
} }
return 0; /* auto */ return 1;
} }
NORETURN NORETURN

View file

@ -246,11 +246,11 @@ extern int git_config_get_bool(const char *key, int *dest);
extern int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest); extern int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest);
extern int git_config_get_maybe_bool(const char *key, int *dest); extern int git_config_get_maybe_bool(const char *key, int *dest);
extern int git_config_get_pathname(const char *key, const char **dest); extern int git_config_get_pathname(const char *key, const char **dest);
extern int git_config_get_index_threads(int *dest);
extern int git_config_get_untracked_cache(void); extern int git_config_get_untracked_cache(void);
extern int git_config_get_split_index(void); extern int git_config_get_split_index(void);
extern int git_config_get_max_percent_split_change(void); extern int git_config_get_max_percent_split_change(void);
extern int git_config_get_fsmonitor(void); extern int git_config_get_fsmonitor(void);
extern int git_config_get_index_threads(void);
/* This dies if the configured or default date is in the future */ /* This dies if the configured or default date is in the future */
extern int git_config_get_expiry(const char *key, const char **output); extern int git_config_get_expiry(const char *key, const char **output);

View file

@ -2176,7 +2176,8 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist)
src_offset = sizeof(*hdr); src_offset = sizeof(*hdr);
nr_threads = git_config_get_index_threads(); if (git_config_get_index_threads(&nr_threads))
nr_threads = 1;
/* TODO: does creating more threads than cores help? */ /* TODO: does creating more threads than cores help? */
if (!nr_threads) { if (!nr_threads) {
@ -2689,6 +2690,36 @@ void update_index_if_able(struct index_state *istate, struct lock_file *lockfile
rollback_lock_file(lockfile); rollback_lock_file(lockfile);
} }
static int record_eoie(void)
{
int val;
if (!git_config_get_bool("index.recordendofindexentries", &val))
return val;
/*
* As a convenience, the end of index entries extension
* used for threading is written by default if the user
* explicitly requested threaded index reads.
*/
return !git_config_get_index_threads(&val) && val != 1;
}
static int record_ieot(void)
{
int val;
if (!git_config_get_bool("index.recordoffsettable", &val))
return val;
/*
* As a convenience, the offset table used for threading is
* written by default if the user explicitly requested
* threaded index reads.
*/
return !git_config_get_index_threads(&val) && val != 1;
}
/* /*
* On success, `tempfile` is closed. If it is the temporary file * On success, `tempfile` is closed. If it is the temporary file
* of a `struct lock_file`, we will therefore effectively perform * of a `struct lock_file`, we will therefore effectively perform
@ -2747,12 +2778,10 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
if (ce_write(&c, newfd, &hdr, sizeof(hdr)) < 0) if (ce_write(&c, newfd, &hdr, sizeof(hdr)) < 0)
return -1; return -1;
if (HAVE_THREADS) if (!HAVE_THREADS || git_config_get_index_threads(&nr_threads))
nr_threads = git_config_get_index_threads();
else
nr_threads = 1; nr_threads = 1;
if (nr_threads != 1) { if (nr_threads != 1 && record_ieot()) {
int ieot_blocks, cpus; int ieot_blocks, cpus;
/* /*
@ -2936,7 +2965,7 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
* read. Write it out regardless of the strip_extensions parameter as we need it * read. Write it out regardless of the strip_extensions parameter as we need it
* when loading the shared index. * when loading the shared index.
*/ */
if (offset) { if (offset && record_eoie()) {
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
write_eoie_extension(&sb, &eoie_c, offset); write_eoie_extension(&sb, &eoie_c, offset);

View file

@ -25,14 +25,17 @@ test_expect_success 'enable split index' '
git update-index --split-index && git update-index --split-index &&
test-tool dump-split-index .git/index >actual && test-tool dump-split-index .git/index >actual &&
indexversion=$(test-tool index-version <.git/index) && indexversion=$(test-tool index-version <.git/index) &&
# NEEDSWORK: Stop hard-coding checksums.
if test "$indexversion" = "4" if test "$indexversion" = "4"
then then
own=3527df833c6c100d3d1d921a9a782d62a8be4b58 own=432ef4b63f32193984f339431fd50ca796493569
base=746f7ab2ed44fb839efdfbffcf399d0b113fb4cb base=508851a7f0dfa8691e9f69c7f055865389012491
else else
own=5e9b60117ece18da410ddecc8b8d43766a0e4204 own=8299b0bcd1ac364e5f1d7768efb62fa2da79a339
base=4370042739b31cd17a5c5cd6043a77c9a00df113 base=39d890139ee5356c7ef572216cebcd27aa41f9df
fi && fi &&
cat >expect <<-EOF && cat >expect <<-EOF &&
own $own own $own
base $base base $base