mirror of
https://github.com/Zygo/bees.git
synced 2025-07-01 08:12:27 +02:00
seeker: add a real-world test case
This seek_backward failed in bees because an extent appeared during the search: fetch(probe_pos = 6821971036, target_pos = 6821971036) = 6822575316..6822575316 probe_pos 6821971004 = probe_pos - have_delta 32 (want_delta 32) fetch(probe_pos = 6821971004, target_pos = 6821971036) = 6822575316..6822575316 probe_pos 6821970972 = probe_pos - have_delta 32 (want_delta 32) fetch(probe_pos = 6821970972, target_pos = 6821971036) = 6822575316..6822575316 probe_pos 6821970908 = probe_pos - have_delta 64 (want_delta 64) fetch(probe_pos = 6821970908, target_pos = 6821971036) = 6822575316..6822575316 probe_pos 6821970780 = probe_pos - have_delta 128 (want_delta 128) fetch(probe_pos = 6821970780, target_pos = 6821971036) = 6822575316..6822575316 probe_pos 6821970524 = probe_pos - have_delta 256 (want_delta 256) fetch(probe_pos = 6821970524, target_pos = 6821971036) = 6822575316..6822575316 probe_pos 6821970012 = probe_pos - have_delta 512 (want_delta 512) fetch(probe_pos = 6821970012, target_pos = 6821971036) = 6822575316..6822575316 probe_pos 6821968988 = probe_pos - have_delta 1024 (want_delta 1024) fetch(probe_pos = 6821968988, target_pos = 6821971036) = 6822575316..6822575316 probe_pos 6821966940 = probe_pos - have_delta 2048 (want_delta 2048) fetch(probe_pos = 6821966940, target_pos = 6821971036) = 6822575316..6822575316 probe_pos 6821962844 = probe_pos - have_delta 4096 (want_delta 4096) fetch(probe_pos = 6821962844, target_pos = 6821971036) = 6821962845..6821962848 found_low = true, lower_bound = 6821962845 lower_bound = high_pos 6821962848 loop: lower_bound 6821962848, probe_pos 6821966942, upper_bound 6821971036 fetch(probe_pos = 6821966942, target_pos = 6821971036) = 6822575316..6822575316 upper_bound = probe_pos 6821966942 loop: lower_bound 6821962848, probe_pos 6821964895, upper_bound 6821966942 fetch(probe_pos = 6821964895, target_pos = 6821971036) = 6822575316..6822575316 upper_bound = probe_pos 6821964895 loop: lower_bound 6821962848, probe_pos 6821963871, upper_bound 6821964895 fetch(probe_pos = 6821963871, target_pos = 6821971036) = 6822575316..6822575316 upper_bound = probe_pos 6821963871 loop: lower_bound 6821962848, probe_pos 6821963359, upper_bound 6821963871 fetch(probe_pos = 6821963359, target_pos = 6821971036) = 6821963411..6821963422 lower_bound = high_pos 6821963422 loop: lower_bound 6821963422, probe_pos 6821963646, upper_bound 6821963871 fetch(probe_pos = 6821963646, target_pos = 6821971036) = 6822575316..6822575316 Here, we found nothing between 6821963646 and 6822575316, so upper_bound is reduced to 6821963646... upper_bound = probe_pos 6821963646 loop: lower_bound 6821963422, probe_pos 6821963534, upper_bound 6821963646 fetch(probe_pos = 6821963534, target_pos = 6821971036) = 6821963536..6821963539 lower_bound = high_pos 6821963539 loop: lower_bound 6821963539, probe_pos 6821963592, upper_bound 6821963646 fetch(probe_pos = 6821963592, target_pos = 6821971036) = 6821963835..6821963841 ...but here, we found 6821963835 and 6821963841, which are between 6821963646 and 6822575316. They were not there before, so the binary search result is now invalid because new extent items were added while it was running. This results in an exception: lower_bound = high_pos 6821963841 --- BEGIN TRACE --- exception --- objectid = 27942759813120, adjusted to 27942793363456 at bees-roots.cc:1103 Crawling extent BeesCrawlState 250:0 offset 0x0 transid 1311734..1311735 at bees-roots.cc:991 get_state_end at bees-roots.cc:988 find_next_extent 250 at bees-roots.cc:929 --- END TRACE --- exception --- *** EXCEPTION *** exception type std::out_of_range: lower_bound = 6821963841, upper_bound = 6821963646 failed constraint check (lower_bound <= upper_bound) at ../include/crucible/seeker.h:139 The exception prevents the result of seek_backward from returning a value, which prevents a nonsense result from a consumer of that value. Copy the details of this search into a test case. Note that the test case won't reproduce the exception because the simulation of fetch() is not changing the results part way through. Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
@ -19,7 +19,9 @@ seeker_finder(const vector<uint64_t> &vec, uint64_t lower, uint64_t upper)
|
||||
if (ub != s.end()) ++ub;
|
||||
if (ub != s.end()) ++ub;
|
||||
for (; ub != s.end(); ++ub) {
|
||||
if (*ub > upper) break;
|
||||
if (*ub > upper) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return set<uint64_t>(lb, ub);
|
||||
}
|
||||
@ -28,7 +30,7 @@ static bool test_fails = false;
|
||||
|
||||
static
|
||||
void
|
||||
seeker_test(const vector<uint64_t> &vec, uint64_t const target)
|
||||
seeker_test(const vector<uint64_t> &vec, uint64_t const target, bool const always_out = false)
|
||||
{
|
||||
cerr << "Find " << target << " in {";
|
||||
for (auto i : vec) {
|
||||
@ -39,10 +41,10 @@ seeker_test(const vector<uint64_t> &vec, uint64_t const target)
|
||||
tl_seeker_debug_str = make_shared<ostringstream>();
|
||||
bool local_test_fails = false;
|
||||
bool excepted = catch_all([&]() {
|
||||
auto found = seek_backward(target, [&](uint64_t lower, uint64_t upper) {
|
||||
const auto found = seek_backward(target, [&](uint64_t lower, uint64_t upper) {
|
||||
++loops;
|
||||
return seeker_finder(vec, lower, upper);
|
||||
});
|
||||
}, uint64_t(32));
|
||||
cerr << found;
|
||||
uint64_t my_found = 0;
|
||||
for (auto i : vec) {
|
||||
@ -58,10 +60,10 @@ seeker_test(const vector<uint64_t> &vec, uint64_t const target)
|
||||
}
|
||||
});
|
||||
cerr << " (" << loops << " loops)" << endl;
|
||||
if (excepted || local_test_fails) {
|
||||
if (excepted || local_test_fails || always_out) {
|
||||
cerr << dynamic_pointer_cast<ostringstream>(tl_seeker_debug_str)->str();
|
||||
test_fails = true;
|
||||
}
|
||||
test_fails = test_fails || local_test_fails;
|
||||
tl_seeker_debug_str.reset();
|
||||
}
|
||||
|
||||
@ -93,6 +95,39 @@ test_seeker()
|
||||
seeker_test(vector<uint64_t> { 0, numeric_limits<uint64_t>::max() }, numeric_limits<uint64_t>::max());
|
||||
seeker_test(vector<uint64_t> { 0, numeric_limits<uint64_t>::max() }, numeric_limits<uint64_t>::max() - 1);
|
||||
seeker_test(vector<uint64_t> { 0, numeric_limits<uint64_t>::max() - 1 }, numeric_limits<uint64_t>::max());
|
||||
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, 0);
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, 1);
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, 2);
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, 3);
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, 4);
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, 5);
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, 6);
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, 7);
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, 8);
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, 9);
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, numeric_limits<uint64_t>::max() );
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, numeric_limits<uint64_t>::max() - 1 );
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, numeric_limits<uint64_t>::max() - 2 );
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, numeric_limits<uint64_t>::max() - 3 );
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, numeric_limits<uint64_t>::max() - 4 );
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, numeric_limits<uint64_t>::max() - 5 );
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, numeric_limits<uint64_t>::max() - 6 );
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, numeric_limits<uint64_t>::max() - 7 );
|
||||
seeker_test(vector<uint64_t> { 0, 1, 2, 4, 8 }, numeric_limits<uint64_t>::max() - 8 );
|
||||
|
||||
// Pulled from a bees debug log
|
||||
seeker_test(vector<uint64_t> {
|
||||
6821962845,
|
||||
6821962848,
|
||||
6821963411,
|
||||
6821963422,
|
||||
6821963536,
|
||||
6821963539,
|
||||
6821963835, // <- appeared during the search, causing an exception
|
||||
6821963841,
|
||||
6822575316,
|
||||
}, 6821971036, true);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user