From: Christian Couder <christian.couder@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
"Nguyen Thai Ngoc Duy" <pclouds@gmail.com>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Christian Couder" <chriscool@tuxfamily.org>
Subject: [PATCH v3 00/21] Add configuration options for split-index
Date: Mon, 26 Dec 2016 11:22:01 +0100 [thread overview]
Message-ID: <20161226102222.17150-1-chriscool@tuxfamily.org> (raw)
Goal
~~~~
We want to make it possible to use the split-index feature
automatically by just setting a new "core.splitIndex" configuration
variable to true.
This can be valuable as split-index can help significantly speed up
`git rebase` especially along with the work to libify `git apply`
that has been merged to master
(see https://github.com/git/git/commit/81358dc238372793b1590efa149cc1581d1fbd98)
and is now in v2.11.
Design
~~~~~~
The design is similar as the previous work that introduced
"core.untrackedCache".
The new "core.splitIndex" configuration option can be either true,
false or undefined which is the default.
When it is true, the split index is created, if it does not already
exists, when the index is read. When it is false, the split index is
removed if it exists, when the index is read. Otherwise it is left as
is.
Along with this new configuration variable, the two following options
are also introduced:
- splitIndex.maxPercentChange
This is to avoid having too many changes accumulating in the split
index while in split index mode. The git-update-index
documentation says:
If split-index mode is already enabled and `--split-index` is
given again, all changes in $GIT_DIR/index are pushed back to
the shared index file.
but it is probably better to not expect the user to think about it
and to have a mechanism that pushes back all changes to the shared
index file automatically when some threshold is reached.
The default threshold is when the number of entries in the split
index file reaches 20% of the number of entries in the shared
index file. The new "splitIndex.maxPercentChange" config option
lets people tweak this value.
- splitIndex.sharedIndexExpire
To make sure that old sharedindex files are eventually removed
when a new one has been created, we "touch" the shared index file
every time a split index file using the shared index file is
either created or read from. Then we can delete shared indexes
with an mtime older than one week (by default), when we create a
new shared index file. The new "splitIndex.sharedIndexExpire"
config option lets people tweak this grace period.
This idea was suggested by Duy in:
https://public-inbox.org/git/CACsJy8BqMFASHf5kJgUh+bd7XG98CafNydE964VJyPXz-emEvA@mail.gmail.com/
and after some experiments, I agree that it is much simpler than
what I thought could be done during our discussion.
Junio also thinks that we have to do "time-based GC" in:
https://public-inbox.org/git/xmqqeg33ccjj.fsf@gitster.mtv.corp.google.com/
Note that this patch series doesn't address a leak when removing a
split-index, but Duy wrote that he has a patch to fix this leak:
https://public-inbox.org/git/CACsJy8AisF2ZVs7JdnVFp5wdskkbVQQQ=DBq5UzE1MOsCfBMtQ@mail.gmail.com/
Highlevel view of the patches in the series
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Except for patch 1/21, there are 3 big steps, one for each new
configuration variable introduced.
There only a few small differences between this patch series and the
v2 patch series sent a few weeks ago. Only two commits have been
changed a little, as suggested by Duy.
- Patch 1/21 marks a message for translation. It was a new patch
in v2 and it can be applied separately. (The patch 1/19 in v1,
which was a typo fix, has been merged separately into master
already.)
Step 1 is:
- Patches 2/21 to 5/21 introduce the functions that are reading
the "core.splitIndex" configuration variable and tweaking the
split index depending on its value.
- Patch 6/21 adds a few tests for the new feature.
- Patches 7/21 and 8/21 add some documentation for the new
feature.
The only change since v2 in this step is that an unnecessary
variable initialization has been droped in 2/21, as suggested by
Duy.
Step 2 is:
- Patches 9/21 and 10/21 introduce the functions that are reading
the "splitIndex.maxPercentChange" configuration variable and
regenerating a new shared index file depending on its value.
- Patch 11/21 adds a few tests for the new feature.
- Patch 12/21 add some documentation for the new feature.
There are no changes in this step since v2.
Step 3 is:
- Patches 13/21 to 16/21 introduce the functions that are reading
the "splitIndex.sharedIndexExpire" configuration variable and
expiring old shared index files depending on its value.
- Patch 17/21 adds a few tests for the new feature.
- Patches 18/21 and 19/21 are new patches. They update the mtime
of the shared index file when a split index based on the shared
index file is read from. 18/21 is a refactoring to make the
actual change in 19/21 easier.
- Patches 20/21 and 21/21 add some documentation for the new
feature.
The only change since v2 in this step is that the full shared
index path is passed to the can_delete_shared_index() function in
16/21 as suggested by Duy.
Links
~~~~~
This patch series is also available here:
https://github.com/chriscool/git/commits/config-split-index
The previous versions were:
RFC: https://github.com/chriscool/git/commits/config-split-index7
v1: https://github.com/chriscool/git/commits/config-split-index72
v2: https://github.com/chriscool/git/commits/config-split-index99
On the mailing list the related patch series and discussions were:
RFC: https://public-inbox.org/git/20160711172254.13439-1-chriscool@tuxfamily.org/
v1: https://public-inbox.org/git/20161023092648.12086-1-chriscool@tuxfamily.org/
v2: https://public-inbox.org/git/20161217145547.11748-1-chriscool@tuxfamily.org/
Christian Couder (21):
config: mark an error message up for translation
config: add git_config_get_split_index()
split-index: add {add,remove}_split_index() functions
read-cache: add and then use tweak_split_index()
update-index: warn in case of split-index incoherency
t1700: add tests for core.splitIndex
Documentation/config: add information for core.splitIndex
Documentation/git-update-index: talk about core.splitIndex config var
config: add git_config_get_max_percent_split_change()
read-cache: regenerate shared index if necessary
t1700: add tests for splitIndex.maxPercentChange
Documentation/config: add splitIndex.maxPercentChange
sha1_file: make check_and_freshen_file() non static
read-cache: touch shared index files when used
config: add git_config_get_expiry() from gc.c
read-cache: unlink old sharedindex files
t1700: test shared index file expiration
read-cache: refactor read_index_from()
read-cache: use freshen_shared_index() in read_index_from()
Documentation/config: add splitIndex.sharedIndexExpire
Documentation/git-update-index: explain splitIndex.*
Documentation/config.txt | 28 +++++++
Documentation/git-update-index.txt | 43 +++++++++--
builtin/gc.c | 15 +---
builtin/update-index.c | 25 +++---
cache.h | 8 ++
config.c | 42 +++++++++-
read-cache.c | 143 ++++++++++++++++++++++++++++++++--
sha1_file.c | 2 +-
split-index.c | 22 ++++++
split-index.h | 2 +
t/t1700-split-index.sh | 154 +++++++++++++++++++++++++++++++++++++
11 files changed, 442 insertions(+), 42 deletions(-)
--
2.11.0.209.gda91e66374.dirty
next reply other threads:[~2016-12-26 10:22 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-26 10:22 Christian Couder [this message]
2016-12-26 10:22 ` [PATCH v3 01/21] config: mark an error message up for translation Christian Couder
2016-12-26 10:22 ` [PATCH v3 02/21] config: add git_config_get_split_index() Christian Couder
2016-12-26 10:22 ` [PATCH v3 03/21] split-index: add {add,remove}_split_index() functions Christian Couder
2016-12-26 10:22 ` [PATCH v3 04/21] read-cache: add and then use tweak_split_index() Christian Couder
2016-12-26 10:22 ` [PATCH v3 05/21] update-index: warn in case of split-index incoherency Christian Couder
2016-12-26 10:22 ` [PATCH v3 06/21] t1700: add tests for core.splitIndex Christian Couder
2016-12-27 19:04 ` Junio C Hamano
2017-01-02 8:29 ` Christian Couder
2017-01-03 12:58 ` Junio C Hamano
2016-12-26 10:22 ` [PATCH v3 07/21] Documentation/config: add information " Christian Couder
2016-12-26 10:22 ` [PATCH v3 08/21] Documentation/git-update-index: talk about core.splitIndex config var Christian Couder
2016-12-27 19:07 ` Junio C Hamano
2017-01-02 9:39 ` Christian Couder
2017-01-07 21:38 ` Junio C Hamano
2017-01-09 11:18 ` Duy Nguyen
2017-01-23 15:55 ` Christian Couder
2017-01-23 19:59 ` Junio C Hamano
2016-12-26 10:22 ` [PATCH v3 09/21] config: add git_config_get_max_percent_split_change() Christian Couder
2016-12-26 10:22 ` [PATCH v3 10/21] read-cache: regenerate shared index if necessary Christian Couder
2016-12-27 19:08 ` Junio C Hamano
2017-01-02 11:23 ` Christian Couder
2016-12-26 10:22 ` [PATCH v3 11/21] t1700: add tests for splitIndex.maxPercentChange Christian Couder
2016-12-26 10:22 ` [PATCH v3 12/21] Documentation/config: add splitIndex.maxPercentChange Christian Couder
2016-12-27 19:09 ` Junio C Hamano
2017-01-02 13:50 ` Christian Couder
2016-12-26 10:22 ` [PATCH v3 13/21] sha1_file: make check_and_freshen_file() non static Christian Couder
2016-12-27 19:09 ` Junio C Hamano
2016-12-26 10:22 ` [PATCH v3 14/21] read-cache: touch shared index files when used Christian Couder
2016-12-27 19:10 ` Junio C Hamano
2017-01-02 14:09 ` Christian Couder
2017-01-07 21:46 ` Junio C Hamano
2017-01-09 10:55 ` Duy Nguyen
2017-01-09 14:34 ` Junio C Hamano
2017-01-19 12:13 ` Duy Nguyen
2017-01-19 19:00 ` Junio C Hamano
2017-01-20 10:44 ` Duy Nguyen
2017-01-23 18:14 ` Christian Couder
2017-01-23 18:53 ` Junio C Hamano
2017-01-25 14:35 ` Christian Couder
2017-01-25 20:52 ` Junio C Hamano
2017-01-31 14:06 ` Christian Couder
2017-01-31 19:22 ` Junio C Hamano
2017-01-31 21:09 ` Junio C Hamano
2016-12-26 10:22 ` [PATCH v3 15/21] config: add git_config_get_expiry() from gc.c Christian Couder
2016-12-26 10:22 ` [PATCH v3 16/21] read-cache: unlink old sharedindex files Christian Couder
2016-12-26 10:22 ` [PATCH v3 17/21] t1700: test shared index file expiration Christian Couder
2016-12-26 10:22 ` [PATCH v3 18/21] read-cache: refactor read_index_from() Christian Couder
2016-12-26 10:22 ` [PATCH v3 19/21] read-cache: use freshen_shared_index() in read_index_from() Christian Couder
2016-12-26 10:22 ` [PATCH v3 20/21] Documentation/config: add splitIndex.sharedIndexExpire Christian Couder
2016-12-27 19:11 ` Junio C Hamano
2017-01-02 14:33 ` Christian Couder
2016-12-26 10:22 ` [PATCH v3 21/21] Documentation/git-update-index: explain splitIndex.* Christian Couder
2016-12-27 19:13 ` Junio C Hamano
2017-01-02 16:04 ` Christian Couder
2016-12-26 10:29 ` [PATCH v3 00/21] Add configuration options for split-index Christian Couder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161226102222.17150-1-chriscool@tuxfamily.org \
--to=christian.couder@gmail.com \
--cc=avarab@gmail.com \
--cc=chriscool@tuxfamily.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pclouds@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).