Skip to content

Memory Leak in tests #1282

@JackPGreen

Description

@JackPGreen

Raised from #1279 (comment)

The good news is that asan has already spotted some issues:

==37969==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 48 byte(s) in 2 object(s) allocated from:
    #0 0x7fda668fe548 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:95
    #1 0x5564bcfc6901 in hazelcast::client::test::thread_pool::ThreadPoolTest_testEqualThreadAndJobs_Test::TestBody() /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/hazelcast/test/src/HazelcastTests8.cpp:2733
    #2 0x5564be3078f3 in void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/src/gtest.cc:2433
    #3 0x5564be2f8fa0 in void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/src/gtest.cc:2469
    #4 0x5564be2a3afd in testing::Test::Run() /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/src/gtest.cc:2508
    #5 0x5564be2a4fd0 in testing::TestInfo::Run() /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/src/gtest.cc:2684
    #6 0x5564be2a5d2b in testing::TestSuite::Run() /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/src/gtest.cc:2816
    #7 0x5564be2c28ef in testing::internal::UnitTestImpl::RunAllTests() /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/src/gtest.cc:5338
    #8 0x5564be30aca8 in bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/src/gtest.cc:2433
    #9 0x5564be2fb991 in bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/src/gtest.cc:2469
    #10 0x5564be2bf3ac in testing::UnitTest::Run() /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/src/gtest.cc:4925
    #11 0x5564be3291f0 in RUN_ALL_TESTS() /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/include/gtest/gtest.h:2473
    #12 0x5564be32913c in main /home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/googletest-src/googletest/src/gtest_main.cc:45
    #13 0x7fda6602a1c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #14 0x7fda6602a28a in __libc_start_main_impl ../csu/libc-start.c:360
    #15 0x5564bc4f0e14 in _start (/home/runner/work/hazelcast-cpp-client/hazelcast-cpp-client/build/hazelcast/test/src/client_test+0x3e2e14) (BuildId: 1ae11315358a2aa750dab7fc7ac35241e01a2005

We create a new client via a future, but the future is never cleaned up.

client = new hazelcast_client{ new_client(std::move(config)).get() };

Context:

namespace thread_pool {
class ThreadPoolTest
: public ClientTest
, public testing::WithParamInterface<int32_t>
{
protected:
struct ThreadState
{
explicit ThreadState(int latch_count)
: latch1(latch_count)
{
}
boost::latch latch1;
std::set<boost::thread::id> thread_ids;
};
protected:
static void SetUpTestCase()
{
instance = new HazelcastServer(default_server_factory());
}
static void TearDownTestCase()
{
delete client;
delete instance;
client = nullptr;
instance = nullptr;
}
static HazelcastServer* instance;
static hazelcast_client* client;
};
HazelcastServer* ThreadPoolTest::instance = nullptr;
hazelcast_client* ThreadPoolTest::client = nullptr;
TEST_P(ThreadPoolTest, testEqualThreadAndJobs)
{
int32_t num_of_thread = 5;
int32_t num_of_jobs = GetParam();
client_config config;
config.set_executor_pool_size(num_of_thread);
if (client != nullptr) {
client->shutdown().get();
}
client = new hazelcast_client{ new_client(std::move(config)).get() };
spi::ClientContext ctx(*client);
auto state = std::make_shared<ThreadState>(num_of_jobs);
std::mutex mutex_for_thread_id;
uint32_t expected_thread_num = std::min(num_of_jobs, num_of_thread);
boost::barrier sync_barrier(expected_thread_num);
ASSERT_EQ(0, state->thread_ids.size());
for (int i = 0; i < num_of_jobs; i++) {
ctx.get_client_execution_service().get_user_executor().submit(
[state, &mutex_for_thread_id, &sync_barrier]() {
sync_barrier.count_down_and_wait();
auto curr_thread_id = boost::this_thread::get_id();
{
std::lock_guard<std::mutex> lg(mutex_for_thread_id);
state->thread_ids.insert(curr_thread_id);
}
state->latch1.count_down();
});
}
ASSERT_OPEN_EVENTUALLY(state->latch1);
ASSERT_EQ( expected_thread_num, state->thread_ids.size());
}
INSTANTIATE_TEST_SUITE_P(ThreadPoolTestSuite,
ThreadPoolTest,
::testing::Values(5, 10, 2));
} // namespace thread_pool

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions