From 754372aeccb74815cbb16f32ceacb04b4c5aaba9 Mon Sep 17 00:00:00 2001 From: Douglas Rumbaugh Date: Wed, 20 Sep 2023 14:03:23 -0400 Subject: Bugfixes for tiering Fixed a few issues that manifested during the tiering tests, 1) When a version is copied, it now contains copies of the levels, not just pointers (the levels themselves still hold pointers to the shards, though). 2) Ensure that tasks are scheduled with the correct timestamp, they were originally being scheduled backwards. The get_merge_tasks() method already returns them in the correct order, so reversing them again put it in the wrong order. --- tests/dynamic_extension_tests.inc | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'tests/dynamic_extension_tests.inc') diff --git a/tests/dynamic_extension_tests.inc b/tests/dynamic_extension_tests.inc index b9866c3..bee28f7 100644 --- a/tests/dynamic_extension_tests.inc +++ b/tests/dynamic_extension_tests.inc @@ -45,6 +45,25 @@ START_TEST(t_insert) END_TEST +START_TEST(t_debug_insert) +{ + auto ext_wirs = new DE(100, 2, 1); + + uint64_t key = 0; + uint32_t val = 0; + for (size_t i=0; i<1000; i++) { + WRec r = {key, val, 1}; + ck_assert_int_eq(ext_wirs->insert(r), 1); + ck_assert_int_eq(ext_wirs->get_record_count(), i+1); + key++; + val++; + } + + delete ext_wirs; +} +END_TEST + + START_TEST(t_insert_with_mem_merges) { auto ext_wirs = new DE(100, 2, 1); @@ -329,8 +348,12 @@ START_TEST(t_static_structure) } size_t deletes = 0; + size_t t_reccnt = 0; + size_t k=0; for (auto rec : records) { + k++; ck_assert_int_eq(ext_wirs->insert(rec), 1); + t_reccnt++; if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) { std::vector del_vec; @@ -378,6 +401,7 @@ Suite *unit_testing() TCase *insert = tcase_create("de::DynamicExtension::insert Testing"); tcase_add_test(insert, t_insert); tcase_add_test(insert, t_insert_with_mem_merges); + tcase_add_test(insert, t_debug_insert); suite_add_tcase(unit, insert); TCase *sampling = tcase_create("de::DynamicExtension::range_sample Testing"); -- cgit v1.2.3 From 7ecfb22c32b7986ed1a2439c1abbeed298e4153a Mon Sep 17 00:00:00 2001 From: Douglas Rumbaugh Date: Fri, 20 Oct 2023 17:00:42 -0400 Subject: Initial pass w/ new scheduler setup currently there's a race condition of some type to sort out. --- tests/dynamic_extension_tests.inc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'tests/dynamic_extension_tests.inc') diff --git a/tests/dynamic_extension_tests.inc b/tests/dynamic_extension_tests.inc index bee28f7..2f82e92 100644 --- a/tests/dynamic_extension_tests.inc +++ b/tests/dynamic_extension_tests.inc @@ -213,10 +213,11 @@ START_TEST(t_range_sample_weighted) for (size_t i=0; i<1000; i++) { auto result = ext_wirs->query(&p); - total_samples += result.size(); + auto r = result.get(); + total_samples += r.size(); - for (size_t j=0; j Date: Mon, 6 Nov 2023 10:01:23 -0500 Subject: Scheduling: Switched over to a thread pool model --- tests/dynamic_extension_tests.inc | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'tests/dynamic_extension_tests.inc') diff --git a/tests/dynamic_extension_tests.inc b/tests/dynamic_extension_tests.inc index 2f82e92..df88d98 100644 --- a/tests/dynamic_extension_tests.inc +++ b/tests/dynamic_extension_tests.inc @@ -77,6 +77,8 @@ START_TEST(t_insert_with_mem_merges) val++; } + ext_wirs->await_next_epoch(); + ck_assert_int_eq(ext_wirs->get_record_count(), 300); ck_assert_int_eq(ext_wirs->get_height(), 1); @@ -197,6 +199,9 @@ START_TEST(t_range_sample_weighted) WRec r = {keys[i], (uint32_t) i, weight}; ext_wirs->insert(r); } + + ext_wirs->await_next_epoch(); + size_t k = 1000; uint64_t lower_key = 0; uint64_t upper_key = 5; @@ -277,6 +282,8 @@ START_TEST(t_tombstone_merging_01) ck_assert(ext_wirs->validate_tombstone_proportion()); } + ext_wirs->await_next_epoch(); + ck_assert(ext_wirs->validate_tombstone_proportion()); gsl_rng_free(rng); -- cgit v1.2.3 From cc415c7c100a17c4e944915aeab01be99b14adb9 Mon Sep 17 00:00:00 2001 From: Douglas Rumbaugh Date: Tue, 7 Nov 2023 13:36:11 -0500 Subject: Switched default DE test case over to ISAMTree --- tests/dynamic_extension_tests.inc | 206 ++++++++++++++++---------------------- 1 file changed, 84 insertions(+), 122 deletions(-) (limited to 'tests/dynamic_extension_tests.inc') diff --git a/tests/dynamic_extension_tests.inc b/tests/dynamic_extension_tests.inc index 2f82e92..aa12e31 100644 --- a/tests/dynamic_extension_tests.inc +++ b/tests/dynamic_extension_tests.inc @@ -12,75 +12,74 @@ START_TEST(t_create) { - auto ext_wirs = new DE(100, 2, 1); + auto test_de = new DE(100, 2, 1); + ck_assert_ptr_nonnull(test_de); + ck_assert_int_eq(test_de->get_record_count(), 0); + ck_assert_int_eq(test_de->get_height(), 0); - ck_assert_ptr_nonnull(ext_wirs); - ck_assert_int_eq(ext_wirs->get_record_count(), 0); - ck_assert_int_eq(ext_wirs->get_height(), 0); - - delete ext_wirs; + delete test_de; } END_TEST START_TEST(t_insert) { - auto ext_wirs = new DE(100, 2, 1); + auto test_de = new DE(100, 2, 1); uint64_t key = 0; uint32_t val = 0; for (size_t i=0; i<100; i++) { - WRec r = {key, val, 1}; - ck_assert_int_eq(ext_wirs->insert(r), 1); + Rec r = {key, val}; + ck_assert_int_eq(test_de->insert(r), 1); key++; val++; } - ck_assert_int_eq(ext_wirs->get_height(), 0); - ck_assert_int_eq(ext_wirs->get_record_count(), 100); + ck_assert_int_eq(test_de->get_height(), 0); + ck_assert_int_eq(test_de->get_record_count(), 100); - delete ext_wirs; + delete test_de; } END_TEST START_TEST(t_debug_insert) { - auto ext_wirs = new DE(100, 2, 1); + auto test_de = new DE(100, 2, 1); uint64_t key = 0; uint32_t val = 0; for (size_t i=0; i<1000; i++) { - WRec r = {key, val, 1}; - ck_assert_int_eq(ext_wirs->insert(r), 1); - ck_assert_int_eq(ext_wirs->get_record_count(), i+1); + Rec r = {key, val}; + ck_assert_int_eq(test_de->insert(r), 1); + ck_assert_int_eq(test_de->get_record_count(), i+1); key++; val++; } - delete ext_wirs; + delete test_de; } END_TEST START_TEST(t_insert_with_mem_merges) { - auto ext_wirs = new DE(100, 2, 1); + auto test_de = new DE(100, 2, 1); uint64_t key = 0; uint32_t val = 0; for (size_t i=0; i<300; i++) { - WRec r = {key, val, 1}; - ck_assert_int_eq(ext_wirs->insert(r), 1); + Rec r = {key, val}; + ck_assert_int_eq(test_de->insert(r), 1); key++; val++; } - ck_assert_int_eq(ext_wirs->get_record_count(), 300); - ck_assert_int_eq(ext_wirs->get_height(), 1); + ck_assert_int_eq(test_de->get_record_count(), 300); + ck_assert_int_eq(test_de->get_height(), 1); - delete ext_wirs; + delete test_de; } END_TEST @@ -88,13 +87,13 @@ END_TEST /* START_TEST(t_range_sample_memtable) { - auto ext_wirs = new DE(100, 2, 1); + auto test_de = new DE(100, 2, 1); uint64_t key = 0; uint32_t val = 0; for (size_t i=0; i<100; i++) { - WRec r = {key, val, 1}; - ck_assert_int_eq(ext_wirs->insert(r), 1); + Rec r = {key, val}; + ck_assert_int_eq(test_de->insert(r), 1); key++; val++; } @@ -104,9 +103,9 @@ START_TEST(t_range_sample_memtable) char *buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE); char *util_buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE); - WRec sample_set[100]; + Rec sample_set[100]; - ext_wirs->range_sample(sample_set, lower_bound, upper_bound, 100); + test_de->range_sample(sample_set, lower_bound, upper_bound, 100); for(size_t i=0; i<100; i++) { ck_assert_int_le(sample_set[i].key, upper_bound); @@ -116,20 +115,20 @@ START_TEST(t_range_sample_memtable) free(buf); free(util_buf); - delete ext_wirs; + delete test_de; } END_TEST START_TEST(t_range_sample_memlevels) { - auto ext_wirs = new DE(100, 2, 1); + auto test_de = new DE(100, 2, 1); uint64_t key = 0; uint32_t val = 0; for (size_t i=0; i<300; i++) { - WRec r = {key, val, 1}; - ck_assert_int_eq(ext_wirs->insert(r), 1); + Rec r = {key, val}; + ck_assert_int_eq(test_de->insert(r), 1); key++; val++; } @@ -140,8 +139,8 @@ START_TEST(t_range_sample_memlevels) char *buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE); char *util_buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE); - WRec sample_set[100]; - ext_wirs->range_sample(sample_set, lower_bound, upper_bound, 100); + Rec sample_set[100]; + test_de->range_sample(sample_set, lower_bound, upper_bound, 100); for(size_t i=0; i<100; i++) { ck_assert_int_le(sample_set[i].key, upper_bound); @@ -151,33 +150,19 @@ START_TEST(t_range_sample_memlevels) free(buf); free(util_buf); - delete ext_wirs; + delete test_de; } END_TEST */ -START_TEST(t_range_sample_weighted) +START_TEST(t_range_query) { - auto ext_wirs = new DE(100, 2, 1); + auto test_de = new DE(100, 2, 1); size_t n = 10000; std::vector keys; - - uint64_t key = 1; - for (size_t i=0; i< n / 2; i++) { - keys.push_back(key); - } - - // put in a quarter of the count with weight two. - key = 2; - for (size_t i=0; i< n / 4; i++) { - keys.push_back(key); - } - - // the remaining quarter with weight four. - key = 3; - for (size_t i=0; i< n / 4; i++) { - keys.push_back(key); + for (size_t i=0; iinsert(r); + Rec r = {keys[i], (uint32_t) i}; + ck_assert_int_eq(test_de->insert(r), 1); } - size_t k = 1000; - uint64_t lower_key = 0; - uint64_t upper_key = 5; - size_t cnt[3] = {0}; - size_t total_samples = 0; + std::sort(keys.begin(), keys.end()); + + auto idx = rand() % (keys.size() - 250); - wirs_query_parms p; + uint64_t lower_key = keys[idx]; + uint64_t upper_key = keys[idx + 250]; + + rq::Parms p; p.lower_bound = lower_key; p.upper_bound = upper_key; - p.sample_size = k; - p.rng = gsl_rng_alloc(gsl_rng_mt19937); - - for (size_t i=0; i<1000; i++) { - auto result = ext_wirs->query(&p); - auto r = result.get(); - total_samples += r.size(); + auto result = test_de->query(&p); + auto r = result.get(); + std::sort(r.begin(), r.end()); + ck_assert_int_eq(r.size(), 251); - for (size_t j=0; jinsert(r), 1); + Rec r = {rec.first, rec.second}; + ck_assert_int_eq(test_de->insert(r), 1); if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) { std::vector> del_vec; std::sample(to_delete.begin(), to_delete.end(), std::back_inserter(del_vec), 3, std::mt19937{std::random_device{}()}); for (size_t i=0; ierase(dr); + Rec dr = {del_vec[i].first, del_vec[i].second}; + test_de->erase(dr); deletes++; to_delete.erase(del_vec[i]); deleted.insert(del_vec[i]); @@ -274,24 +242,24 @@ START_TEST(t_tombstone_merging_01) to_delete.insert(rec); } - ck_assert(ext_wirs->validate_tombstone_proportion()); + ck_assert(test_de->validate_tombstone_proportion()); } - ck_assert(ext_wirs->validate_tombstone_proportion()); + ck_assert(test_de->validate_tombstone_proportion()); gsl_rng_free(rng); - delete ext_wirs; + delete test_de; } END_TEST DE *create_test_tree(size_t reccnt, size_t memlevel_cnt) { auto rng = gsl_rng_alloc(gsl_rng_mt19937); - auto ext_wirs = new DE(1000, 2, 1); + auto test_de = new DE(1000, 2, 1); - std::set records; - std::set to_delete; - std::set deleted; + std::set records; + std::set to_delete; + std::set deleted; while (records.size() < reccnt) { uint64_t key = rand(); @@ -304,14 +272,14 @@ DE *create_test_tree(size_t reccnt, size_t memlevel_cnt) { size_t deletes = 0; for (auto rec : records) { - ck_assert_int_eq(ext_wirs->insert(rec), 1); + ck_assert_int_eq(test_de->insert(rec), 1); if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) { - std::vector del_vec; + std::vector del_vec; std::sample(to_delete.begin(), to_delete.end(), std::back_inserter(del_vec), 3, std::mt19937{std::random_device{}()}); for (size_t i=0; ierase(del_vec[i]); + test_de->erase(del_vec[i]); deletes++; to_delete.erase(del_vec[i]); deleted.insert(del_vec[i]); @@ -325,7 +293,7 @@ DE *create_test_tree(size_t reccnt, size_t memlevel_cnt) { gsl_rng_free(rng); - return ext_wirs; + return test_de; } START_TEST(t_static_structure) @@ -333,11 +301,11 @@ START_TEST(t_static_structure) auto rng = gsl_rng_alloc(gsl_rng_mt19937); size_t reccnt = 100000; - auto ext_wirs = new DE(100, 2, 1); + auto test_de = new DE(100, 2, 1); - std::set records; - std::set to_delete; - std::set deleted; + std::set records; + std::set to_delete; + std::set deleted; while (records.size() < reccnt) { uint64_t key = rand(); @@ -345,7 +313,7 @@ START_TEST(t_static_structure) if (records.find({key, val}) != records.end()) continue; - records.insert({key, val, 1}); + records.insert({key, val}); } size_t deletes = 0; @@ -353,15 +321,15 @@ START_TEST(t_static_structure) size_t k=0; for (auto rec : records) { k++; - ck_assert_int_eq(ext_wirs->insert(rec), 1); + ck_assert_int_eq(test_de->insert(rec), 1); t_reccnt++; if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) { - std::vector del_vec; + std::vector del_vec; std::sample(to_delete.begin(), to_delete.end(), std::back_inserter(del_vec), 3, std::mt19937{std::random_device{}()}); for (size_t i=0; ierase(del_vec[i]), 1); + ck_assert_int_eq(test_de->erase(del_vec[i]), 1); deletes++; to_delete.erase(del_vec[i]); @@ -374,7 +342,7 @@ START_TEST(t_static_structure) } } - auto flat = ext_wirs->create_static_structure(); + auto flat = test_de->create_static_structure(); ck_assert_int_eq(flat->get_record_count(), reccnt - deletes); uint64_t prev_key = 0; @@ -386,7 +354,7 @@ START_TEST(t_static_structure) gsl_rng_free(rng); delete flat; - delete ext_wirs; + delete test_de; } END_TEST @@ -399,21 +367,15 @@ Suite *unit_testing() tcase_add_test(create, t_create); suite_add_tcase(unit, create); - TCase *insert = tcase_create("de::DynamicExtension::insert Testing"); + TCase *insert = tcase_create("de::DynamicExtension::insert Testing"); tcase_add_test(insert, t_insert); tcase_add_test(insert, t_insert_with_mem_merges); tcase_add_test(insert, t_debug_insert); suite_add_tcase(unit, insert); - TCase *sampling = tcase_create("de::DynamicExtension::range_sample Testing"); - - tcase_add_test(sampling, t_range_sample_weighted); - suite_add_tcase(unit, sampling); - - /* - tcase_add_test(sampling, t_range_sample_memtable); - tcase_add_test(sampling, t_range_sample_memlevels); - */ + TCase *query = tcase_create("de::DynamicExtension::range_query Testing"); + tcase_add_test(query, t_range_query); + suite_add_tcase(unit, query); TCase *ts = tcase_create("de::DynamicExtension::tombstone_compaction Testing"); tcase_add_test(ts, t_tombstone_merging_01); -- cgit v1.2.3 From 357cab549c2ed33970562b84ff6f83923742343d Mon Sep 17 00:00:00 2001 From: Douglas Rumbaugh Date: Tue, 7 Nov 2023 15:34:24 -0500 Subject: Comment and License updates --- tests/dynamic_extension_tests.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tests/dynamic_extension_tests.inc') diff --git a/tests/dynamic_extension_tests.inc b/tests/dynamic_extension_tests.inc index bcb5ae6..dac7d51 100644 --- a/tests/dynamic_extension_tests.inc +++ b/tests/dynamic_extension_tests.inc @@ -1,12 +1,12 @@ /* - * tests/dynamic_extension_tests.cpp + * tests/dynamic_extension_tests.inc * * Unit tests for Dynamic Extension Framework * * Copyright (C) 2023 Douglas Rumbaugh * Dong Xie * - * All rights reserved. Published under the Modified BSD License. + * Distributed under the Modified BSD License. * */ -- cgit v1.2.3 From 90bb0614fc1d8f1a185a778e31aaf9027c01aeb8 Mon Sep 17 00:00:00 2001 From: Douglas Rumbaugh Date: Mon, 13 Nov 2023 11:44:09 -0500 Subject: Tombstone Compaction: re-enabled tombstone compaction Currently, proactive buffer tombstone compaction is disabled by forcing the buffer tombstone capacity to match its record capacity. It isn't clear how to best handle proactive buffer compactions in an environment where new buffers are spawned anyway. --- tests/dynamic_extension_tests.inc | 2 -- 1 file changed, 2 deletions(-) (limited to 'tests/dynamic_extension_tests.inc') diff --git a/tests/dynamic_extension_tests.inc b/tests/dynamic_extension_tests.inc index dac7d51..be82132 100644 --- a/tests/dynamic_extension_tests.inc +++ b/tests/dynamic_extension_tests.inc @@ -245,8 +245,6 @@ START_TEST(t_tombstone_merging_01) if (gsl_rng_uniform(rng) < 0.25 && deleted.find(rec) == deleted.end()) { to_delete.insert(rec); } - - ck_assert(test_de->validate_tombstone_proportion()); } test_de->await_next_epoch(); -- cgit v1.2.3 From c4514c2e62a711189cf3c914297885d97fb51a09 Mon Sep 17 00:00:00 2001 From: Douglas Rumbaugh Date: Fri, 12 Jan 2024 14:08:33 -0500 Subject: Initial pass at unit test refactoring Restructured unit tests to be a bit more modular. I have some further plans to expand on this, particular for the query tests (including both shard and framework level test functions that can be injected at will). --- tests/dynamic_extension_tests.inc | 416 -------------------------------------- 1 file changed, 416 deletions(-) delete mode 100644 tests/dynamic_extension_tests.inc (limited to 'tests/dynamic_extension_tests.inc') diff --git a/tests/dynamic_extension_tests.inc b/tests/dynamic_extension_tests.inc deleted file mode 100644 index be82132..0000000 --- a/tests/dynamic_extension_tests.inc +++ /dev/null @@ -1,416 +0,0 @@ -/* - * tests/dynamic_extension_tests.inc - * - * Unit tests for Dynamic Extension Framework - * - * Copyright (C) 2023 Douglas Rumbaugh - * Dong Xie - * - * Distributed under the Modified BSD License. - * - */ - -START_TEST(t_create) -{ - auto test_de = new DE(100, 2, 1); - - ck_assert_ptr_nonnull(test_de); - ck_assert_int_eq(test_de->get_record_count(), 0); - ck_assert_int_eq(test_de->get_height(), 0); - - delete test_de; -} -END_TEST - - -START_TEST(t_insert) -{ - auto test_de = new DE(100, 2, 1); - - uint64_t key = 0; - uint32_t val = 0; - for (size_t i=0; i<100; i++) { - Rec r = {key, val}; - ck_assert_int_eq(test_de->insert(r), 1); - key++; - val++; - } - - ck_assert_int_eq(test_de->get_height(), 0); - ck_assert_int_eq(test_de->get_record_count(), 100); - - delete test_de; -} -END_TEST - - -START_TEST(t_debug_insert) -{ - auto test_de = new DE(100, 2, 1); - - uint64_t key = 0; - uint32_t val = 0; - for (size_t i=0; i<1000; i++) { - Rec r = {key, val}; - ck_assert_int_eq(test_de->insert(r), 1); - ck_assert_int_eq(test_de->get_record_count(), i+1); - key++; - val++; - } - - delete test_de; -} -END_TEST - - -START_TEST(t_insert_with_mem_merges) -{ - auto test_de = new DE(100, 2, 1); - - uint64_t key = 0; - uint32_t val = 0; - for (size_t i=0; i<300; i++) { - Rec r = {key, val}; - ck_assert_int_eq(test_de->insert(r), 1); - key++; - val++; - } - - test_de->await_next_epoch(); - - ck_assert_int_eq(test_de->get_record_count(), 300); - ck_assert_int_eq(test_de->get_height(), 1); - - delete test_de; -} -END_TEST - - -/* -START_TEST(t_range_sample_memtable) -{ - auto test_de = new DE(100, 2, 1); - - uint64_t key = 0; - uint32_t val = 0; - for (size_t i=0; i<100; i++) { - Rec r = {key, val}; - ck_assert_int_eq(test_de->insert(r), 1); - key++; - val++; - } - - uint64_t lower_bound = 20; - uint64_t upper_bound = 50; - - char *buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE); - char *util_buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE); - Rec sample_set[100]; - - test_de->range_sample(sample_set, lower_bound, upper_bound, 100); - - for(size_t i=0; i<100; i++) { - ck_assert_int_le(sample_set[i].key, upper_bound); - ck_assert_int_ge(sample_set[i].key, lower_bound); - } - - free(buf); - free(util_buf); - - delete test_de; -} -END_TEST - - -START_TEST(t_range_sample_memlevels) -{ - auto test_de = new DE(100, 2, 1); - - uint64_t key = 0; - uint32_t val = 0; - for (size_t i=0; i<300; i++) { - Rec r = {key, val}; - ck_assert_int_eq(test_de->insert(r), 1); - key++; - val++; - } - - uint64_t lower_bound = 100; - uint64_t upper_bound = 250; - - char *buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE); - char *util_buf = (char *) std::aligned_alloc(SECTOR_SIZE, PAGE_SIZE); - - Rec sample_set[100]; - test_de->range_sample(sample_set, lower_bound, upper_bound, 100); - - for(size_t i=0; i<100; i++) { - ck_assert_int_le(sample_set[i].key, upper_bound); - ck_assert_int_ge(sample_set[i].key, lower_bound); - } - - free(buf); - free(util_buf); - - delete test_de; -} -END_TEST -*/ - -START_TEST(t_range_query) -{ - auto test_de = new DE(100, 2, 1); - size_t n = 10000; - - std::vector keys; - for (size_t i=0; iinsert(r), 1); - } - - test_de->await_next_epoch(); - - std::sort(keys.begin(), keys.end()); - - auto idx = rand() % (keys.size() - 250); - - uint64_t lower_key = keys[idx]; - uint64_t upper_key = keys[idx + 250]; - - rq::Parms p; - p.lower_bound = lower_key; - p.upper_bound = upper_key; - - auto result = test_de->query(&p); - auto r = result.get(); - std::sort(r.begin(), r.end()); - ck_assert_int_eq(r.size(), 251); - - for (size_t i=0; i> records; - std::set> to_delete; - std::set> deleted; - - while (records.size() < reccnt) { - uint64_t key = rand(); - uint32_t val = rand(); - - if (records.find({key, val}) != records.end()) continue; - - records.insert({key, val}); - } - - size_t deletes = 0; - size_t cnt=0; - for (auto rec : records) { - Rec r = {rec.first, rec.second}; - ck_assert_int_eq(test_de->insert(r), 1); - - if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) { - std::vector> del_vec; - std::sample(to_delete.begin(), to_delete.end(), std::back_inserter(del_vec), 3, std::mt19937{std::random_device{}()}); - - for (size_t i=0; ierase(dr); - deletes++; - to_delete.erase(del_vec[i]); - deleted.insert(del_vec[i]); - } - } - - if (gsl_rng_uniform(rng) < 0.25 && deleted.find(rec) == deleted.end()) { - to_delete.insert(rec); - } - } - - test_de->await_next_epoch(); - - ck_assert(test_de->validate_tombstone_proportion()); - - gsl_rng_free(rng); - delete test_de; -} -END_TEST - -DE *create_test_tree(size_t reccnt, size_t memlevel_cnt) { - auto rng = gsl_rng_alloc(gsl_rng_mt19937); - - auto test_de = new DE(1000, 2, 1); - - std::set records; - std::set to_delete; - std::set deleted; - - while (records.size() < reccnt) { - uint64_t key = rand(); - uint32_t val = rand(); - - if (records.find({key, val}) != records.end()) continue; - - records.insert({key, val}); - } - - size_t deletes = 0; - for (auto rec : records) { - ck_assert_int_eq(test_de->insert(rec), 1); - - if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) { - std::vector del_vec; - std::sample(to_delete.begin(), to_delete.end(), std::back_inserter(del_vec), 3, std::mt19937{std::random_device{}()}); - - for (size_t i=0; ierase(del_vec[i]); - deletes++; - to_delete.erase(del_vec[i]); - deleted.insert(del_vec[i]); - } - } - - if (gsl_rng_uniform(rng) < 0.25 && deleted.find(rec) == deleted.end()) { - to_delete.insert(rec); - } - } - - gsl_rng_free(rng); - - return test_de; -} - -START_TEST(t_static_structure) -{ - auto rng = gsl_rng_alloc(gsl_rng_mt19937); - - size_t reccnt = 100000; - auto test_de = new DE(100, 2, 1); - - std::set records; - std::set to_delete; - std::set deleted; - - while (records.size() < reccnt) { - uint64_t key = rand(); - uint32_t val = rand(); - - if (records.find({key, val}) != records.end()) continue; - - records.insert({key, val}); - } - - size_t deletes = 0; - size_t t_reccnt = 0; - size_t k=0; - for (auto rec : records) { - k++; - ck_assert_int_eq(test_de->insert(rec), 1); - t_reccnt++; - - if (gsl_rng_uniform(rng) < 0.05 && !to_delete.empty()) { - std::vector del_vec; - std::sample(to_delete.begin(), to_delete.end(), std::back_inserter(del_vec), 3, std::mt19937{std::random_device{}()}); - - for (size_t i=0; ierase(del_vec[i]), 1); - - deletes++; - to_delete.erase(del_vec[i]); - deleted.insert(del_vec[i]); - } - } - - if (gsl_rng_uniform(rng) < 0.25 && deleted.find(rec) == deleted.end()) { - to_delete.insert(rec); - } - } - - auto flat = test_de->create_static_structure(); - ck_assert_int_eq(flat->get_record_count(), reccnt - deletes); - - uint64_t prev_key = 0; - for (size_t i=0; iget_record_count(); i++) { - auto k = flat->get_record_at(i)->rec.key; - ck_assert_int_ge(k, prev_key); - prev_key = k; - } - - gsl_rng_free(rng); - delete flat; - delete test_de; -} -END_TEST - - -Suite *unit_testing() -{ - Suite *unit = suite_create("de::DynamicExtension Unit Testing"); - - TCase *create = tcase_create("de::DynamicExtension::constructor Testing"); - tcase_add_test(create, t_create); - suite_add_tcase(unit, create); - - TCase *insert = tcase_create("de::DynamicExtension::insert Testing"); - tcase_add_test(insert, t_insert); - tcase_add_test(insert, t_insert_with_mem_merges); - tcase_add_test(insert, t_debug_insert); - suite_add_tcase(unit, insert); - - TCase *query = tcase_create("de::DynamicExtension::range_query Testing"); - tcase_add_test(query, t_range_query); - suite_add_tcase(unit, query); - - TCase *ts = tcase_create("de::DynamicExtension::tombstone_compaction Testing"); - tcase_add_test(ts, t_tombstone_merging_01); - tcase_set_timeout(ts, 500); - suite_add_tcase(unit, ts); - - TCase *flat = tcase_create("de::DynamicExtension::create_static_structure Testing"); - tcase_add_test(flat, t_static_structure); - tcase_set_timeout(flat, 500); - suite_add_tcase(unit, flat); - - return unit; -} - -int run_unit_tests() -{ - int failed = 0; - Suite *unit = unit_testing(); - SRunner *unit_runner = srunner_create(unit); - - srunner_run_all(unit_runner, CK_NORMAL); - failed = srunner_ntests_failed(unit_runner); - srunner_free(unit_runner); - - return failed; -} - - -int main() -{ - int unit_failed = run_unit_tests(); - - return (unit_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; -} -- cgit v1.2.3