From 64fd53cea864a26c9cd4b34646a787c1049587e6 Mon Sep 17 00:00:00 2001 From: Douglas Rumbaugh Date: Tue, 9 May 2023 14:37:32 -0400 Subject: MutableBuffer tests and bugfixes --- tests/mutable_buffer_tests.cpp | 300 +++++++++++++++++++++++++++++++++++++++++ tests/testing.h | 153 +++++++++++++++++++++ 2 files changed, 453 insertions(+) create mode 100644 tests/mutable_buffer_tests.cpp create mode 100644 tests/testing.h (limited to 'tests') diff --git a/tests/mutable_buffer_tests.cpp b/tests/mutable_buffer_tests.cpp new file mode 100644 index 0000000..8768551 --- /dev/null +++ b/tests/mutable_buffer_tests.cpp @@ -0,0 +1,300 @@ +#include +#include +#include +#include +#include + +#include "testing.h" +#include "framework/MutableBuffer.h" + +#include + +using namespace de; + +START_TEST(t_create) +{ + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(100, true, 50, rng); + + ck_assert_ptr_nonnull(buffer); + ck_assert_int_eq(buffer->get_capacity(), 100); + ck_assert_int_eq(buffer->get_record_count(), 0); + ck_assert_int_eq(buffer->is_full(), false); + ck_assert_ptr_nonnull(buffer->sorted_output()); + ck_assert_int_eq(buffer->get_tombstone_count(), 0); + ck_assert_int_eq(buffer->get_tombstone_capacity(), 50); + + delete buffer; + gsl_rng_free(rng); +} +END_TEST + + +START_TEST(t_insert) +{ + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(100, true, 50, rng); + + uint64_t key = 0; + uint32_t val = 5; + + for (size_t i=0; i<99; i++) { + ck_assert_int_eq(buffer->append(key, val, 1, false), 1); + ck_assert_int_eq(buffer->check_tombstone(key, val), 0); + + key++; + val++; + + ck_assert_int_eq(buffer->get_record_count(), i+1); + ck_assert_int_eq(buffer->get_tombstone_count(), 0); + ck_assert_int_eq(buffer->is_full(), 0); + } + + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 1); + + key++; + val++; + + ck_assert_int_eq(buffer->is_full(), 1); + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 0); + + delete buffer; + gsl_rng_free(rng); + +} +END_TEST + + +START_TEST(t_insert_tombstones) +{ + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(100, true, 50, rng); + + uint64_t key = 0; + uint32_t val = 5; + size_t ts_cnt = 0; + + for (size_t i=0; i<99; i++) { + bool ts = false; + if (i % 2 == 0) { + ts_cnt++; + ts=true; + } + + ck_assert_int_eq(buffer->append(key, val, 1.0, ts), 1); + ck_assert_int_eq(buffer->check_tombstone(key, val), ts); + + key++; + val++; + + ck_assert_int_eq(buffer->get_record_count(), i+1); + ck_assert_int_eq(buffer->get_tombstone_count(), ts_cnt); + ck_assert_int_eq(buffer->is_full(), 0); + } + + // inserting one more tombstone should not be possible + ck_assert_int_eq(buffer->append(key, val, 1.0, true), 0); + + + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 1); + + key++; + val++; + + ck_assert_int_eq(buffer->is_full(), 1); + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 0); + + delete buffer; + gsl_rng_free(rng); +} +END_TEST + + +START_TEST(t_truncate) +{ + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(100, true, 100, rng); + + uint64_t key = 0; + uint32_t val = 5; + size_t ts_cnt = 0; + + for (size_t i=0; i<100; i++) { + bool ts = false; + if (i % 2 == 0) { + ts_cnt++; + ts=true; + } + + ck_assert_int_eq(buffer->append(key, val, 1.0, ts), 1); + ck_assert_int_eq(buffer->check_tombstone(key, val), ts); + + key++; + val++; + + ck_assert_int_eq(buffer->get_record_count(), i+1); + ck_assert_int_eq(buffer->get_tombstone_count(), ts_cnt); + } + + ck_assert_int_eq(buffer->is_full(), 1); + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 0); + + ck_assert_int_eq(buffer->truncate(), 1); + + ck_assert_int_eq(buffer->is_full(), 0); + ck_assert_int_eq(buffer->get_record_count(), 0); + ck_assert_int_eq(buffer->get_tombstone_count(), 0); + ck_assert_int_eq(buffer->append(key, val, 1.0, false), 1); + + delete buffer; + gsl_rng_free(rng); + +} +END_TEST + + +START_TEST(t_sorted_output) +{ + size_t cnt = 100; + + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(cnt, true, cnt/2, rng); + + + std::vector keys(cnt); + for (size_t i=0; iappend(keys[i], val, 1.0, false); + } + + buffer->append(keys[cnt-2], val, 1.0, true); + buffer->append(keys[cnt-1], val, 1.0, true); + + + WeightedRec *sorted_records = buffer->sorted_output(); + std::sort(keys.begin(), keys.end()); + + for (size_t i=0; i> *values, size_t start, size_t stop, WeightedMBuffer *buffer) +{ + for (size_t i=start; iappend((*values)[i].first, (*values)[i].second, 1.0); + } + +} + +START_TEST(t_multithreaded_insert) +{ + size_t cnt = 10000; + auto rng = gsl_rng_alloc(gsl_rng_mt19937); + auto buffer = new WeightedMBuffer(cnt, true, cnt/2, rng); + + std::vector> records(cnt); + for (size_t i=0; i workers(thread_cnt); + size_t start = 0; + size_t stop = start + per_thread; + for (size_t i=0; iis_full(), 1); + ck_assert_int_eq(buffer->get_record_count(), cnt); + + std::sort(records.begin(), records.end()); + WeightedRec *sorted_records = buffer->sorted_output(); + for (size_t i=0; i + +#include +#include + +#include "util/types.h" +#include "util/base.h" +#include "framework/MutableBuffer.h" +#include "framework/InternalLevel.h" + +typedef de::Record WeightedRec; +typedef de::MutableBuffer WeightedMBuffer; +typedef de::InternalLevel WeightedLevel; + +typedef de::Record UnweightedRec; +typedef de::MutableBuffer UnweightedMBuffer; +typedef de::InternalLevel UnweightedLevel; + +static gsl_rng *g_rng = gsl_rng_alloc(gsl_rng_mt19937); + +static bool initialize_test_file(std::string fname, size_t page_cnt) +{ + auto flags = O_RDWR | O_CREAT | O_TRUNC; + mode_t mode = 0640; + char *page = nullptr; + + int fd = open(fname.c_str(), flags, mode); + if (fd == -1) { + goto error; + } + + page = (char *) aligned_alloc(de::SECTOR_SIZE, de::PAGE_SIZE); + if (!page) { + goto error_opened; + } + + for (size_t i=0; i<=page_cnt; i++) { + *((int *) page) = i; + if (write(fd, page, de::PAGE_SIZE) == -1) { + goto error_alloced; + } + } + + free(page); + + return 1; + +error_alloced: + free(page); + +error_opened: + close(fd); + +error: + return 0; +} + +static bool roughly_equal(int n1, int n2, size_t mag, double epsilon) { + return ((double) std::abs(n1 - n2) / (double) mag) < epsilon; +} + +static WeightedMBuffer *create_test_mbuffer(size_t cnt) +{ + auto buffer = new WeightedMBuffer(cnt, true, cnt, g_rng); + + for (size_t i = 0; i < cnt; i++) { + uint64_t key = rand(); + uint32_t val = rand(); + + buffer->append(key, val); + } + + return buffer; +} + +static WeightedMBuffer *create_test_mbuffer_tombstones(size_t cnt, size_t ts_cnt) +{ + auto buffer = new WeightedMBuffer(cnt, true, ts_cnt, g_rng); + + std::vector> tombstones; + + for (size_t i = 0; i < cnt; i++) { + uint64_t key = rand(); + uint32_t val = rand(); + + if (i < ts_cnt) { + tombstones.push_back({key, val}); + } + + buffer->append(key, val); + } + + for (size_t i=0; iappend(tombstones[i].first, tombstones[i].second, 1.0, true); + } + + return buffer; +} + +static WeightedMBuffer *create_weighted_mbuffer(size_t cnt) +{ + auto buffer = new WeightedMBuffer(cnt, true, cnt, g_rng); + + // Put in half of the count with weight one. + uint64_t key = 1; + for (size_t i=0; i< cnt / 2; i++) { + buffer->append(key, i, 2); + } + + // put in a quarter of the count with weight two. + key = 2; + for (size_t i=0; i< cnt / 4; i++) { + buffer->append(key, i, 4); + } + + // the remaining quarter with weight four. + key = 3; + for (size_t i=0; i< cnt / 4; i++) { + buffer->append(key, i, 8); + } + + return buffer; +} + +static WeightedMBuffer *create_double_seq_mbuffer(size_t cnt, bool ts=false) +{ + auto buffer = new WeightedMBuffer(cnt, true, cnt, g_rng); + + for (size_t i = 0; i < cnt / 2; i++) { + uint64_t key = i; + uint32_t val = i; + + buffer->append(key, val, 1.0, ts); + } + + for (size_t i = 0; i < cnt / 2; i++) { + uint64_t key = i; + uint32_t val = i + 1; + + buffer->append(key, val, 1.0, ts); + } + + return buffer; +} + + -- cgit v1.2.3