b6c26a1a86
Summary: Jenkins would hang at a random time while running all the tests. The reason for that is a bug in skiplist implementation. Skiplist method find_or_larger was never ending and would continuously stay in the while loop because the next node (with the queried value) onto which it would try to jump would be marked as deleted and that would stop it from jumping on it, or ending on that node. Reviewers: buda, teon.banek, mislav.bradac Reviewed By: buda Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D334
38 lines
1.2 KiB
C++
38 lines
1.2 KiB
C++
#include "gtest/gtest.h"
|
|
|
|
#include <thread>
|
|
#include <vector>
|
|
|
|
#include "data_structures/concurrent/skiplist.hpp"
|
|
|
|
// Try to provoke find_or_larger to hang. This happened before and caused
|
|
// Jenkins to stop responding. It is hard to recreate deterministically and this
|
|
// is the best we can do without doing friend_tests or refactoring skiplist.
|
|
TEST(SkipList, HangDuringFindOrLarger) {
|
|
std::vector<std::thread> threads;
|
|
SkipList<int> skiplist;
|
|
const int num_of_threads = 8;
|
|
const int iter = 100000;
|
|
for (int i = 0; i < num_of_threads; ++i) {
|
|
threads.emplace_back([&iter, &skiplist]() {
|
|
auto accessor = skiplist.access();
|
|
for (int i = 0; i < iter; ++i) accessor.insert(rand() % 3);
|
|
});
|
|
threads.emplace_back([&iter, &skiplist]() {
|
|
auto accessor = skiplist.access();
|
|
for (int i = 0; i < iter; ++i) accessor.remove(rand() % 3);
|
|
});
|
|
threads.emplace_back([&iter, &skiplist]() {
|
|
auto accessor = skiplist.access();
|
|
for (int i = 0; i < iter; ++i)
|
|
accessor.find_or_larger<SkipList<int>::ConstIterator>(rand() % 3);
|
|
});
|
|
}
|
|
for (auto &thread : threads) thread.join();
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
::testing::InitGoogleTest(&argc, argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|