From: "Justin Tobler via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Patrick Steinhardt <ps@pks.im>,
Karthik Nayak <karthik.188@gmail.com>,
Justin Tobler <jltobler@gmail.com>
Subject: [PATCH v3 0/3] reftable/stack: use geometric table compaction
Date: Fri, 29 Mar 2024 04:16:46 +0000 [thread overview]
Message-ID: <pull.1683.v3.git.1711685809.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1683.v2.git.1711060819.gitgitgadget@gmail.com>
Hello again,
This is the third version my patch series that refactors the reftable
compaction strategy to instead follow a geometric sequence. Changes compared
to v2:
* Added test to validate the GIT_TEST_REFTABLE_NO_AUTOCOMPACTION
environment variable works as expected.
* Added additional clarifying comments and examples to explain how the new
compaction strategy works.
* Removed outdated comment from stack_test.c test
Thanks for taking a look!
-Justin
Justin Tobler (3):
reftable/stack: add env to disable autocompaction
reftable/stack: use geometric table compaction
reftable/stack: make segment end inclusive
reftable/stack.c | 124 ++++++++++++++++++-------------------
reftable/stack.h | 3 -
reftable/stack_test.c | 67 +++++---------------
reftable/system.h | 1 +
t/t0610-reftable-basics.sh | 58 ++++++++++++-----
5 files changed, 120 insertions(+), 133 deletions(-)
base-commit: c75fd8d8150afdf836b63a8e0534d9b9e3e111ba
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1683%2Fjltobler%2Fjt%2Freftable-geometric-compaction-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1683/jltobler/jt/reftable-geometric-compaction-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/1683
Range-diff vs v2:
1: cb6b152e5c8 ! 1: 2fdd8ea1133 reftable/stack: add env to disable autocompaction
@@ reftable/stack.c: int reftable_addition_commit(struct reftable_addition *add)
## reftable/system.h ##
@@ reftable/system.h: license that can be found in the LICENSE file or at
- #include "strbuf.h"
+ #include "tempfile.h"
#include "hash-ll.h" /* hash ID, sizes.*/
#include "dir.h" /* remove_dir_recursively, for tests.*/
+#include "parse.h"
int hash_size(uint32_t id);
+
+ ## t/t0610-reftable-basics.sh ##
+@@ t/t0610-reftable-basics.sh: test_expect_success 'ref transaction: writes cause auto-compaction' '
+ test_line_count = 1 repo/.git/reftable/tables.list
+ '
+
++test_expect_success 'ref transaction: environment variable disables auto-compaction' '
++ test_when_finished "rm -rf repo" &&
++
++ git init repo &&
++ test_commit -C repo A &&
++ for i in $(test_seq 20)
++ do
++ GIT_TEST_REFTABLE_NO_AUTOCOMPACTION=true git -C repo update-ref branch-$i HEAD || return 1
++ done &&
++ test_line_count = 23 repo/.git/reftable/tables.list &&
++
++ git -C repo update-ref foo HEAD &&
++ test_line_count = 1 repo/.git/reftable/tables.list
++'
++
+ check_fsync_events () {
+ local trace="$1" &&
+ shift &&
2: def70084523 ! 2: 7e62c2286ae reftable/stack: use geometric table compaction
@@ Commit message
Instead, to avoid unbounded growth of the table list, the compaction
strategy is updated to ensure tables follow a geometric sequence after
- each operation. This is done by walking the table list in reverse index
- order to identify the compaction segment start and end. The compaction
- segment end is found by identifying the first table which has a
- preceding table size less than twice the current table. Next, the
- compaction segment start is found iterating through the remaining tables
- in the list checking if the previous table size is less than twice the
- cumulative of tables from the segment end. This ensures the correct
- segment start is found and that the newly compacted table does not
- violate the geometric sequence.
+ each operation by individually evaluating each table in reverse index
+ order. This strategy results in a much simpler and more robust algorithm
+ compared to the previous one while also maintaining a minimal ordered
+ set of tables on-disk.
When creating 10 thousand references, the new strategy has no
performance impact:
@@ reftable/stack.c: static int segment_size(struct segment *s)
+ * they are already valid members of the geometric sequence. Due to the
+ * properties of a geometric sequence, it is not possible for the sum of
+ * these tables to exceed the value of the ending point table.
++ *
++ * Example table size sequence requiring no compaction:
++ * 64, 32, 16, 8, 4, 2, 1
++ *
++ * Example compaction segment end set to table with size 3:
++ * 64, 32, 16, 8, 4, 3, 1
+ */
+ for (i = n - 1; i > 0; i--) {
+ if (sizes[i - 1] < sizes[i] * 2) {
@@ reftable/stack.c: static int segment_size(struct segment *s)
break;
+ }
+ }
-+
+
+- min_seg.start = prev;
+- min_seg.bytes += sizes[prev];
+ /*
+ * Find the starting table of the compaction segment by iterating
+ * through the remaining tables and keeping track of the accumulated
-+ * size of all tables seen from the segment end table.
++ * size of all tables seen from the segment end table. The previous
++ * table is compared to the accumulated size because the tables from the
++ * segment end are merged backwards recursively.
+ *
+ * Note that we keep iterating even after we have found the first
+ * starting point. This is because there may be tables in the stack
+ * preceding that first starting point which violate the geometric
+ * sequence.
++ *
++ * Example compaction segment start set to table with size 32:
++ * 128, 32, 16, 8, 4, 3, 1
+ */
+ for (; i > 0; i--) {
+ uint64_t curr = bytes;
+ bytes += sizes[i - 1];
-
-- min_seg.start = prev;
-- min_seg.bytes += sizes[prev];
++
+ if (sizes[i - 1] < curr * 2) {
+ seg.start = i - 1;
+ seg.bytes = bytes;
@@ reftable/stack_test.c: static void test_reftable_stack_hash_id(void)
static void test_suggest_compaction_segment(void)
{
- uint64_t sizes[] = { 128, 64, 17, 16, 9, 9, 9, 16, 16 };
+- /* .................0 1 2 3 4 5 6 */
+ uint64_t sizes[] = { 512, 64, 17, 16, 9, 9, 9, 16, 2, 16 };
- /* .................0 1 2 3 4 5 6 */
struct segment min =
suggest_compaction_segment(sizes, ARRAY_SIZE(sizes));
- EXPECT(min.start == 2);
@@ t/t0610-reftable-basics.sh: test_expect_success 'ref transaction: writes cause a
test_commit -C repo --no-tag B &&
test_line_count = 1 repo/.git/reftable/tables.list
+@@ t/t0610-reftable-basics.sh: test_expect_success 'ref transaction: environment variable disables auto-compact
+ do
+ GIT_TEST_REFTABLE_NO_AUTOCOMPACTION=true git -C repo update-ref branch-$i HEAD || return 1
+ done &&
+- test_line_count = 23 repo/.git/reftable/tables.list &&
++ test_line_count = 22 repo/.git/reftable/tables.list &&
+
+ git -C repo update-ref foo HEAD &&
+ test_line_count = 1 repo/.git/reftable/tables.list
'
+test_expect_success 'ref transaction: alternating table sizes are compacted' '
3: a23e3fc6972 ! 3: 9a33914c852 reftable/segment: make segment end inclusive
@@ Metadata
Author: Justin Tobler <jltobler@gmail.com>
## Commit message ##
- reftable/segment: make segment end inclusive
+ reftable/stack: make segment end inclusive
For a reftable segment, the start of the range is inclusive and the end
is exclusive. In practice we increment the end when creating the
--
gitgitgadget
next prev parent reply other threads:[~2024-03-29 4:16 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-05 20:03 [PATCH] reftable/stack: use geometric table compaction Justin Tobler via GitGitGadget
2024-03-06 12:30 ` Patrick Steinhardt
2024-03-06 12:37 ` Patrick Steinhardt
2024-03-21 22:48 ` Justin Tobler
2024-03-21 22:40 ` [PATCH v2 0/3] " Justin Tobler via GitGitGadget
2024-03-21 22:40 ` [PATCH v2 1/3] reftable/stack: add env to disable autocompaction Justin Tobler via GitGitGadget
2024-03-22 1:25 ` Patrick Steinhardt
2024-03-21 22:40 ` [PATCH v2 2/3] reftable/stack: use geometric table compaction Justin Tobler via GitGitGadget
2024-03-22 1:25 ` Patrick Steinhardt
2024-03-27 13:24 ` Karthik Nayak
2024-03-21 22:40 ` [PATCH v2 3/3] reftable/segment: make segment end inclusive Justin Tobler via GitGitGadget
2024-03-22 1:25 ` [PATCH v2 0/3] reftable/stack: use geometric table compaction Patrick Steinhardt
2024-04-03 10:13 ` Han-Wen Nienhuys
2024-04-03 10:18 ` Patrick Steinhardt
2024-04-03 15:14 ` Justin Tobler
2024-04-03 16:40 ` Junio C Hamano
2024-03-29 4:16 ` Justin Tobler via GitGitGadget [this message]
2024-03-29 4:16 ` [PATCH v3 1/3] reftable/stack: add env to disable autocompaction Justin Tobler via GitGitGadget
2024-03-29 18:25 ` Junio C Hamano
2024-03-29 21:56 ` Junio C Hamano
2024-04-02 7:23 ` Patrick Steinhardt
2024-04-02 17:23 ` Junio C Hamano
2024-03-29 4:16 ` [PATCH v3 2/3] reftable/stack: use geometric table compaction Justin Tobler via GitGitGadget
2024-04-02 7:23 ` Patrick Steinhardt
2024-03-29 4:16 ` [PATCH v3 3/3] reftable/stack: make segment end inclusive Justin Tobler via GitGitGadget
2024-03-29 18:36 ` Junio C Hamano
2024-04-02 7:23 ` Patrick Steinhardt
2024-04-03 0:20 ` [PATCH v4 0/2] reftable/stack: use geometric table compaction Justin Tobler via GitGitGadget
2024-04-03 0:20 ` [PATCH v4 1/2] reftable/stack: add env to disable autocompaction Justin Tobler via GitGitGadget
2024-04-03 0:20 ` [PATCH v4 2/2] reftable/stack: use geometric table compaction Justin Tobler via GitGitGadget
2024-04-03 4:47 ` [PATCH v4 0/2] " Patrick Steinhardt
2024-04-03 11:12 ` Karthik Nayak
2024-04-03 16:56 ` Junio C Hamano
2024-04-04 18:29 ` [PATCH v5 0/3] " Justin Tobler via GitGitGadget
2024-04-04 18:29 ` [PATCH v5 1/3] reftable/stack: allow disabling of auto-compaction Justin Tobler via GitGitGadget
2024-04-08 6:12 ` Patrick Steinhardt
2024-04-04 18:29 ` [PATCH v5 2/3] reftable/stack: add env to disable autocompaction Justin Tobler via GitGitGadget
2024-04-08 6:12 ` Patrick Steinhardt
2024-04-08 16:18 ` Junio C Hamano
2024-04-04 18:29 ` [PATCH v5 3/3] reftable/stack: use geometric table compaction Justin Tobler via GitGitGadget
2024-04-08 6:12 ` [PATCH v5 0/3] " Patrick Steinhardt
2024-04-08 16:17 ` Justin Tobler
2024-04-08 16:16 ` [PATCH v6 " Justin Tobler via GitGitGadget
2024-04-08 16:16 ` [PATCH v6 1/3] reftable/stack: expose option to disable auto-compaction Justin Tobler via GitGitGadget
2024-04-08 16:16 ` [PATCH v6 2/3] reftable/stack: add env to disable autocompaction Justin Tobler via GitGitGadget
2024-04-08 16:16 ` [PATCH v6 3/3] reftable/stack: use geometric table compaction Justin Tobler via GitGitGadget
2024-04-08 16:20 ` [PATCH v6 0/3] " Patrick Steinhardt
2024-04-08 19:12 ` Junio C Hamano
2024-04-03 19:12 ` [PATCH v2 " Junio C Hamano
2024-04-03 19:30 ` Patrick Steinhardt
2024-04-04 5:34 ` Patrick Steinhardt
2024-04-04 18:28 ` Justin Tobler
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=pull.1683.v3.git.1711685809.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=jltobler@gmail.com \
--cc=karthik.188@gmail.com \
--cc=ps@pks.im \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.