1
0
Fork 0
forked from lthn/blockchain

unittests: lmdb.2gb_test improved to catch a stochastic bug (2)

This commit is contained in:
sowle 2019-12-20 03:15:54 +03:00
parent edbf8ecbb2
commit 209b1626c6
No known key found for this signature in database
GPG key ID: C07A24B2D89D49FC

View file

@ -16,6 +16,7 @@
#include "common/db_abstract_accessor.h"
#include "common/db_backend_lmdb.h"
#include "serialization/serialization.h"
#include "common/db_backend_mdbx.h"
using namespace tools;
@ -892,7 +893,8 @@ namespace lmdb_test
//////////////////////////////////////////////////////////////////////////////
// 2gb_test
//////////////////////////////////////////////////////////////////////////////
TEST(lmdb, 2gb_test)
template<typename db_backend_t>
void db_2gb_test()
{
bool r = false;
epee::shared_recursive_mutex rw_lock;
@ -901,9 +903,9 @@ namespace lmdb_test
static const uint64_t buffer_size = 64 * 1024; // 64 KB
static const uint64_t db_total_size = static_cast<uint64_t>(2.1 * 1024 * 1024 * 1024); // 2.1 GB -- a bit more than 2GB to test 2GB boundary
static const std::string db_file_path = "2gb_lmdb_test";
static const std::string db_file_path = std::string("2gb_") + typeid(db_backend_t).name() + "_test";
std::shared_ptr<db::lmdb_db_backend> lmdb_ptr = std::make_shared<db::lmdb_db_backend>();
std::shared_ptr<db_backend_t> lmdb_ptr = std::make_shared<db_backend_t>();
db::basic_db_accessor bdba(lmdb_ptr, rw_lock);
//
@ -924,6 +926,27 @@ namespace lmdb_test
buffer.resize(buffer_size);
crypto::generate_random_bytes(buffer_size, buffer.data());
std::vector<std::vector<uint8_t>> buffer_paranoidal_copies;
buffer_paranoidal_copies.resize(3);
for (size_t i = 0; i < buffer_paranoidal_copies.size(); ++i)
buffer_paranoidal_copies[i].assign(buffer.begin(), buffer.end());
auto check_buffer_paranoidal_copies = [&]() {
for (size_t buffer_index = 0; buffer_index < buffer_paranoidal_copies.size(); ++buffer_index)
{
for(size_t i = 0; i < buffer_size; ++i)
{
if (buffer[i] != buffer_paranoidal_copies[buffer_index][i])
{
std::cout << "!!! buffer differs from paranoidal copy #" << buffer_index << " at byte " << i << ": " << static_cast<uint32_t>(buffer[i]) << " != " << static_cast<uint32_t>(buffer_paranoidal_copies[buffer_index][i]) << std::endl;
break;
}
}
}
};
check_buffer_paranoidal_copies();
uint64_t total_data = 0;
for (uint64_t key = 0; key < db_total_size / buffer_size; ++key)
{
@ -970,6 +993,9 @@ namespace lmdb_test
// read data doesn't match with written one
std::cout << "ERROR: data missmatch at key " << key << ", total_data = " << total_data << std::endl;
// paranoid checks
check_buffer_paranoidal_copies();
size_t wrong_bytes = 0;
size_t wrong_bytes_min_idx = SIZE_MAX;
size_t wrong_bytes_max_idx = 0;
@ -1029,4 +1055,14 @@ namespace lmdb_test
}
TEST(lmdb, 2gb_test)
{
db_2gb_test<db::lmdb_db_backend>();
}
TEST(mdbx, 2gb_test)
{
db_2gb_test<db::mdbx_db_backend>();
}
} // namespace lmdb_test