avoid bug

This commit is contained in:
2024-04-26 13:15:00 +00:00
parent bb4aaebc5b
commit 39dffd88cd
7 changed files with 487 additions and 26 deletions

View File

@ -1,13 +1,19 @@
#include "bpt/buffer_pool_manager.h"
#include <gtest/gtest.h>
#include <spdlog/async.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/spdlog.h>
#include <cstddef>
#include <cstdio>
#include <cstring>
#include <deque>
#include <memory>
#include <random>
#include <string>
#include <vector>
#include "MemoryRiver.hpp"
#include "MemoryRiverStd.hpp"
#include "bpt/bpt_page.hpp"
#include "bpt/config.h"
#include "bpt/disk_manager.h"
@ -193,25 +199,154 @@ TEST(StoreTest, Test1) {
}
TEST(MemoryRiver, T1) {
remove("/tmp/test2.db");
typedef unsigned long long DataType;
MemoryRiver<DataType> river;
river.initialise("/tmp/test2.db");
int x = 3;
river.write_info(x, 1);
DataType dat1 = 0x1f2f3f4f5f6f7f8f;
std::vector<DataType> record;
std::vector<size_t> id_record;
int test_cnt = 3;
for (int i = 0; i < test_cnt; i++) {
DataType tmp = dat1 + i;
size_t element_id = river.write(tmp);
record.push_back(tmp);
id_record.push_back(element_id);
const int test_cnt = 30000;
remove("/tmp/test2.db");
{
MemoryRiver<DataType> river;
river.initialise("/tmp/test2.db");
int x = 3;
river.write_info(x, 1);
DataType dat1 = 0x1f2f3f4f5f6f7f8f;
for (int i = 0; i < test_cnt; i++) {
DataType tmp = dat1 + i;
size_t element_id = river.write(tmp);
record.push_back(tmp);
id_record.push_back(element_id);
}
for (int i = 0; i < test_cnt; i++) {
DataType tmp;
river.read(tmp, id_record[i]);
EXPECT_EQ(record[i], tmp);
}
std::random_device r;
std::default_random_engine rng(r());
for (int i = 0; i < 1000; i++) {
int t = rng() % record.size();
river.Delete(id_record[t]);
record.erase(record.begin() + t);
id_record.erase(id_record.begin() + t);
}
}
for (int i = 0; i < test_cnt; i++) {
DataType tmp;
river.read(tmp, id_record[i]);
EXPECT_EQ(record[i], tmp);
{
MemoryRiver<DataType> river("/tmp/test2.db");
int x;
river.get_info(x, 1);
EXPECT_EQ(3, x);
for (int i = 0; i < test_cnt; i++) {
DataType tmp;
river.read(tmp, id_record[i]);
EXPECT_EQ(record[i], tmp);
}
}
}
template <size_t length>
class FixLengthString {
public:
char data[length];
FixLengthString &operator=(const FixLengthString &other) {
memcpy(data, other.data, length);
return *this;
}
bool operator==(const FixLengthString &other) const { return memcmp(data, other.data, length) == 0; }
};
TEST(MemoryRiver, T2) {
spdlog::set_level(spdlog::level::debug);
auto logger_ptr = spdlog::stderr_color_mt("stderr_logger");
const static size_t string_len = 5;
typedef FixLengthString<string_len> DataType;
std::deque<size_t> index_collection;
std::unordered_map<size_t, std::pair<int, int>> index_track;
size_t interal_id_tot = 0;
const unsigned int RndSeed = 3794; // testing::GTEST_FLAG(random_seed);
std::mt19937 rnd(RndSeed);
remove("/tmp/T2.std");
remove("/tmp/T2.dat");
const int kInfoLength = 100;
{
sol::MemoryRiver<DataType, kInfoLength> STD("/tmp/T2.std");
MemoryRiver<DataType, kInfoLength> mr("/tmp/T2.dat");
int total_opts = 5;
while (total_opts-- > 0) {
int opt = rnd() % 6;
switch (opt) {
case 0: {
// get_info
int idx = 1 + rnd() % kInfoLength;
int std_ans, mr_ans;
STD.get_info(std_ans, idx);
mr.get_info(mr_ans, idx);
EXPECT_EQ(std_ans, mr_ans);
break;
}
case 1: {
// write_info
int idx = 1 + rnd() % kInfoLength;
int val = rnd();
STD.write_info(val, idx);
mr.write_info(val, idx);
break;
}
case 2: {
// write
interal_id_tot++;
index_collection.push_back(interal_id_tot);
DataType tmp;
for (int i = 0; i < string_len; i++) tmp.data[i] = 'a' + rnd() % 26;
tmp.data[string_len - 1] = '\0';
index_track[interal_id_tot].first = STD.write(tmp);
index_track[interal_id_tot].second = mr.write(tmp);
logger_ptr->info("Write: {}", tmp.data);
logger_ptr->info("internal id: {}", interal_id_tot);
logger_ptr->info("index in STD: {}", index_track[interal_id_tot].first);
logger_ptr->info("index in MR: {}", index_track[interal_id_tot].second);
break;
}
case 3: {
// update
if (index_collection.empty()) goto nxt;
size_t selected_internal_id = index_collection[rnd() % index_collection.size()];
DataType tmp;
for (int i = 0; i < string_len; i++) tmp.data[i] = 'a' + rnd() % 26;
tmp.data[string_len - 1] = '\0';
STD.update(tmp, index_track[selected_internal_id].first);
mr.update(tmp, index_track[selected_internal_id].second);
logger_ptr->info("Update: {}", tmp.data);
logger_ptr->info("internal id: {}", selected_internal_id);
logger_ptr->info("index in STD: {}", index_track[selected_internal_id].first);
logger_ptr->info("index in MR: {}", index_track[selected_internal_id].second);
break;
}
case 4: {
// read
if (index_collection.empty()) goto nxt;
size_t selected_internal_id = index_collection[rnd() % index_collection.size()];
DataType std_ans, mr_ans;
STD.read(std_ans, index_track[selected_internal_id].first);
mr.read(mr_ans, index_track[selected_internal_id].second);
logger_ptr->info("Read: {}", selected_internal_id);
logger_ptr->info("MR: read {} from {}", mr_ans.data, index_track[selected_internal_id].second);
logger_ptr->info("STD: read {} from {}", std_ans.data, index_track[selected_internal_id].first);
EXPECT_EQ(std_ans, mr_ans);
}
case 5: {
// Delete
if (index_collection.empty()) goto nxt;
size_t selected_internal_id = index_collection[rnd() % index_collection.size()];
logger_ptr->info("Delete: {}", selected_internal_id);
logger_ptr->info("index in STD: {}", index_track[selected_internal_id].first);
logger_ptr->info("index in MR: {}", index_track[selected_internal_id].second);
STD.Delete(index_track[selected_internal_id].first);
mr.Delete(index_track[selected_internal_id].second);
index_collection.erase(std::find(index_collection.begin(), index_collection.end(), selected_internal_id));
index_track.erase(selected_internal_id);
break;
}
}
nxt:;
}
}
}