From 55def1c5ada63ec8a0093d8054882d7e079daa26 Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Fri, 18 Mar 2022 22:13:12 +0300 Subject: [PATCH] test/allocator_replay_test: introduce check for duplicates This performs check for duplicates using free dump. Signed-off-by: Igor Fedotov --- src/test/objectstore/allocator_replay_test.cc | 73 ++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/src/test/objectstore/allocator_replay_test.cc b/src/test/objectstore/allocator_replay_test.cc index 76041f40cae71..18959a56cbe01 100644 --- a/src/test/objectstore/allocator_replay_test.cc +++ b/src/test/objectstore/allocator_replay_test.cc @@ -20,7 +20,7 @@ using namespace std; void usage(const string &name) { - cerr << "Usage: " << name << " " << std::endl; + cerr << "Usage: " << name << " " << std::endl; } void usage_replay_alloc(const string &name) { @@ -458,6 +458,73 @@ int export_as_binary(char* fname, char* target_fname) return r; } +int check_duplicates(char* fname) +{ + interval_set free_extents; + interval_set invalid_extentsA; + interval_set invalid_extentsB; + auto dummy_create_fn = + [&](std::string_view alloc_type, + int64_t capacity, + int64_t alloc_unit, + std::string_view alloc_name) { + }; + size_t errors = 0; + size_t pos = 0; + size_t first_err_pos = 0; + auto add_fn = [&](uint64_t offset, + uint64_t len) { + ++pos; + if (free_extents.intersects(offset, len)) { + invalid_extentsB.insert(offset, len); + ++errors; + if (first_err_pos == 0) { + first_err_pos = pos; + } + } else { + free_extents.insert(offset, len); + } + }; + int r = replay_free_dump_and_apply_raw( + fname, + dummy_create_fn, + add_fn); + if (r < 0) { + return r; + } + pos = 0; + auto add_fn2 = [&](uint64_t offset, + uint64_t len) { + ++pos; + if (pos < first_err_pos) { + if (invalid_extentsB.intersects(offset, len)) { + invalid_extentsA.insert(offset, len); + } + } + }; + r = replay_free_dump_and_apply_raw( + fname, + dummy_create_fn, + add_fn2); + ceph_assert(r >= 0); + auto itA = invalid_extentsA.begin(); + auto itB = invalid_extentsB.begin(); + while (itA != invalid_extentsA.end()) { + std::cerr << "error: overlapping extents: " << std::hex + << itA.get_start() << "~" << itA.get_end() - itA.get_start() + << " vs."; + while (itB != invalid_extentsB.end() && + itB.get_start() >= itA.get_start() && + itB.get_end() <= itA.get_end()) { + std::cerr << " " << itB.get_start() << "~" << itB.get_end() - itB.get_start(); + ++itB; + } + std::cerr << std::dec << std::endl; + ++itA; + } + return r >= 0 ? errors != 0 : r; +} + int main(int argc, char **argv) { vector args; @@ -471,7 +538,7 @@ int main(int argc, char **argv) usage(argv[0]); return 1; } - if (strcmp(argv[2], "raw_duplicate") == 0) { + if (strcmp(argv[2], "raw_duplicates") == 0) { return replay_and_check_for_duplicate(argv[1]); } else if (strcmp(argv[2], "free_dump") == 0) { return replay_free_dump_and_apply(argv[1], @@ -621,5 +688,7 @@ int main(int argc, char **argv) }); } else if (strcmp(argv[2], "export_binary") == 0) { return export_as_binary(argv[1], argv[3]); + } else if (strcmp(argv[2], "duplicates") == 0) { + return check_duplicates(argv[1]); } } -- 2.39.5