Merge branch 'jt/reftable-geometric-compaction'
The strategy to compact multiple tables of reftables after many operations accumulate many entries has been improved to avoid accumulating too many tables uncollected. * jt/reftable-geometric-compaction: reftable/stack: use geometric table compaction reftable/stack: add env to disable autocompaction reftable/stack: expose option to disable auto-compaction
This commit is contained in:
@ -325,7 +325,7 @@ static void test_reftable_stack_transaction_api_performs_auto_compaction(void)
|
||||
* we can ensure that we indeed honor this setting and have
|
||||
* better control over when exactly auto compaction runs.
|
||||
*/
|
||||
st->disable_auto_compact = i != n;
|
||||
st->config.disable_auto_compact = i != n;
|
||||
|
||||
err = reftable_stack_new_addition(&add, st);
|
||||
EXPECT_ERR(err);
|
||||
@ -497,6 +497,7 @@ static void test_reftable_stack_add(void)
|
||||
struct reftable_write_options cfg = {
|
||||
.exact_log_message = 1,
|
||||
.default_permissions = 0660,
|
||||
.disable_auto_compact = 1,
|
||||
};
|
||||
struct reftable_stack *st = NULL;
|
||||
char *dir = get_tmp_dir(__LINE__);
|
||||
@ -508,7 +509,6 @@ static void test_reftable_stack_add(void)
|
||||
|
||||
err = reftable_new_stack(&st, dir, cfg);
|
||||
EXPECT_ERR(err);
|
||||
st->disable_auto_compact = 1;
|
||||
|
||||
for (i = 0; i < N; i++) {
|
||||
char buf[256];
|
||||
@ -770,59 +770,13 @@ static void test_reftable_stack_hash_id(void)
|
||||
clear_dir(dir);
|
||||
}
|
||||
|
||||
static void test_log2(void)
|
||||
{
|
||||
EXPECT(1 == fastlog2(3));
|
||||
EXPECT(2 == fastlog2(4));
|
||||
EXPECT(2 == fastlog2(5));
|
||||
}
|
||||
|
||||
static void test_sizes_to_segments(void)
|
||||
{
|
||||
uint64_t sizes[] = { 2, 3, 4, 5, 7, 9 };
|
||||
/* .................0 1 2 3 4 5 */
|
||||
|
||||
size_t seglen = 0;
|
||||
struct segment *segs =
|
||||
sizes_to_segments(&seglen, sizes, ARRAY_SIZE(sizes));
|
||||
EXPECT(segs[2].log == 3);
|
||||
EXPECT(segs[2].start == 5);
|
||||
EXPECT(segs[2].end == 6);
|
||||
|
||||
EXPECT(segs[1].log == 2);
|
||||
EXPECT(segs[1].start == 2);
|
||||
EXPECT(segs[1].end == 5);
|
||||
reftable_free(segs);
|
||||
}
|
||||
|
||||
static void test_sizes_to_segments_empty(void)
|
||||
{
|
||||
size_t seglen = 0;
|
||||
struct segment *segs = sizes_to_segments(&seglen, NULL, 0);
|
||||
EXPECT(seglen == 0);
|
||||
reftable_free(segs);
|
||||
}
|
||||
|
||||
static void test_sizes_to_segments_all_equal(void)
|
||||
{
|
||||
uint64_t sizes[] = { 5, 5 };
|
||||
size_t seglen = 0;
|
||||
struct segment *segs =
|
||||
sizes_to_segments(&seglen, sizes, ARRAY_SIZE(sizes));
|
||||
EXPECT(seglen == 1);
|
||||
EXPECT(segs[0].start == 0);
|
||||
EXPECT(segs[0].end == 2);
|
||||
reftable_free(segs);
|
||||
}
|
||||
|
||||
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 };
|
||||
struct segment min =
|
||||
suggest_compaction_segment(sizes, ARRAY_SIZE(sizes));
|
||||
EXPECT(min.start == 2);
|
||||
EXPECT(min.end == 7);
|
||||
EXPECT(min.start == 1);
|
||||
EXPECT(min.end == 10);
|
||||
}
|
||||
|
||||
static void test_suggest_compaction_segment_nothing(void)
|
||||
@ -933,9 +887,21 @@ static void test_empty_add(void)
|
||||
reftable_stack_destroy(st2);
|
||||
}
|
||||
|
||||
static int fastlog2(uint64_t sz)
|
||||
{
|
||||
int l = 0;
|
||||
if (sz == 0)
|
||||
return 0;
|
||||
for (; sz; sz /= 2)
|
||||
l++;
|
||||
return l - 1;
|
||||
}
|
||||
|
||||
static void test_reftable_stack_auto_compaction(void)
|
||||
{
|
||||
struct reftable_write_options cfg = { 0 };
|
||||
struct reftable_write_options cfg = {
|
||||
.disable_auto_compact = 1,
|
||||
};
|
||||
struct reftable_stack *st = NULL;
|
||||
char *dir = get_tmp_dir(__LINE__);
|
||||
|
||||
@ -945,7 +911,6 @@ static void test_reftable_stack_auto_compaction(void)
|
||||
err = reftable_new_stack(&st, dir, cfg);
|
||||
EXPECT_ERR(err);
|
||||
|
||||
st->disable_auto_compact = 1; /* call manually below for coverage. */
|
||||
for (i = 0; i < N; i++) {
|
||||
char name[100];
|
||||
struct reftable_ref_record ref = {
|
||||
@ -994,7 +959,7 @@ static void test_reftable_stack_add_performs_auto_compaction(void)
|
||||
* we can ensure that we indeed honor this setting and have
|
||||
* better control over when exactly auto compaction runs.
|
||||
*/
|
||||
st->disable_auto_compact = i != n;
|
||||
st->config.disable_auto_compact = i != n;
|
||||
|
||||
strbuf_reset(&refname);
|
||||
strbuf_addf(&refname, "branch-%04d", i);
|
||||
@ -1121,7 +1086,6 @@ static void test_reftable_stack_compaction_concurrent_clean(void)
|
||||
int stack_test_main(int argc, const char *argv[])
|
||||
{
|
||||
RUN_TEST(test_empty_add);
|
||||
RUN_TEST(test_log2);
|
||||
RUN_TEST(test_names_equal);
|
||||
RUN_TEST(test_parse_names);
|
||||
RUN_TEST(test_read_file);
|
||||
@ -1142,9 +1106,6 @@ int stack_test_main(int argc, const char *argv[])
|
||||
RUN_TEST(test_reftable_stack_update_index_check);
|
||||
RUN_TEST(test_reftable_stack_uptodate);
|
||||
RUN_TEST(test_reftable_stack_validate_refname);
|
||||
RUN_TEST(test_sizes_to_segments);
|
||||
RUN_TEST(test_sizes_to_segments_all_equal);
|
||||
RUN_TEST(test_sizes_to_segments_empty);
|
||||
RUN_TEST(test_suggest_compaction_segment);
|
||||
RUN_TEST(test_suggest_compaction_segment_nothing);
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user