opening sockets while other threads call IOService run is not thread safe
found this using clang on macOS
boost version 1.84
ubuntu does not show same issue using g++
boost version 1.74
this issue is relevant to all hooks that use IoServiceThreadPool:
ping_check
radius
CmdHttpListener
HttpClient
MtTcpListenerMgr
however following libs/classes start the listener/sockets before running IOService run:
ping_check
CmdHttpListener
MtTcpListenerMgr
so libs with issues:
radius: Exchange
ha: HAService / HttpClient / ConnectionPool / Connection
radius can be easily fixed by creating a connection pool with the same number of connections as the thread pool.
ha creates connections dynamically, so it is harder to fix...
I confirm that HA has the same issue:
==================
WARNING: ThreadSanitizer: data race (pid=64152)
Read of size 1 at 0x7b2800002718 by thread T5:
#0 boost::asio::detail::kqueue_reactor::run(long, boost::asio::detail::op_queue<boost::asio::detail::scheduler_operation>&) kqueue_reactor.ipp:487 (libkea-dhcp_ddns.55.dylib:x86_64+0x21076)
#1 non-virtual thunk to boost::asio::detail::kqueue_reactor::run(long, boost::asio::detail::op_queue<boost::asio::detail::scheduler_operation>&) kqueue_reactor.hpp (libkea-dhcp_ddns.55.dylib:x86_64+0x216fd)
#2 boost::asio::detail::scheduler::do_run_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&, boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) scheduler.ipp:477 (libkea-asiolink.70.dylib:x86_64+0x10c78)
#3 boost::asio::detail::scheduler::run(boost::system::error_code&) scheduler.ipp:210 (libkea-asiolink.70.dylib:x86_64+0x10774)
#4 boost::asio::io_context::run() io_context.ipp:64 (libkea-asiolink.70.dylib:x86_64+0x1fcde)
#5 isc::asiolink::IOService::run() io_service.cc:130 (libkea-asiolink.70.dylib:x86_64+0x1db76)
#6 isc::asiolink::IoServiceThreadPool::threadWork() io_service_thread_pool.cc:230 (libkea-asiolink.70.dylib:x86_64+0x29aa0)
#7 void* std::__1::__thread_proxy[abi:ue170006]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, std::__1::__bind<void (isc::asiolink::IoServiceThreadPool::*)(), isc::asiolink::IoServiceThreadPool*>>>(void*) thread.h:238 (libkea-asiolink.70.dylib:x86_64+0x2a345)
Previous write of size 1 at 0x7b2800002718 by main thread (mutexes: write M0, write M1, write M2):
#0 boost::asio::detail::conditionally_enabled_mutex::conditionally_enabled_mutex(bool) conditionally_enabled_mutex.hpp:109 (libkea-http.69.dylib:x86_64+0x18a5b)
#1 boost::asio::detail::kqueue_reactor::allocate_descriptor_state() kqueue_reactor.ipp:566 (libkea-http.69.dylib:x86_64+0x1f9bd)
#2 boost::asio::detail::reactive_socket_service_base::do_open(boost::asio::detail::reactive_socket_service_base::base_implementation_type&, int, int, int, boost::system::error_code&) reactive_socket_service_base.ipp:188 (libkea-http.69.dylib:x86_64+0x1f511)
#3 boost::asio::basic_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>::open(boost::asio::ip::tcp const&) basic_socket.hpp:424 (libkea-http.69.dylib:x86_64+0x1e54f)
#4 isc::asiolink::TCPSocket<(anonymous namespace)::SocketCallback>::open(isc::asiolink::IOEndpoint const*, (anonymous namespace)::SocketCallback&) tcp_socket.h:291 (libkea-http.69.dylib:x86_64+0x12c80)
#5 (anonymous namespace)::Connection::doTransactionInternal(boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, long, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc (libkea-http.69.dylib:x86_64+0x47294)
#6 (anonymous namespace)::Connection::doTransaction(boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, long, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc:1231 (libkea-http.69.dylib:x86_64+0xba7f)
#7 (anonymous namespace)::ConnectionPool::queueRequestInternal(isc::http::Url const&, boost::shared_ptr<isc::asiolink::TlsContext> const&, boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, long, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc:708 (libkea-http.69.dylib:x86_64+0x7a18)
#8 isc::http::HttpClient::asyncSendRequest(isc::http::Url const&, boost::shared_ptr<isc::asiolink::TlsContext> const&, boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, isc::http::HttpClient::RequestTimeout const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc:2009 (libkea-http.69.dylib:x86_64+0x1cd2)
#9 isc::ha::HAService::asyncSendHeartbeat() ha_service.cc:1764 (libdhcp_ha.so:x86_64+0x70051)
#10 std::__1::__function::__func<std::__1::__bind<void (isc::ha::HAService::*)(), isc::ha::HAService*>, std::__1::allocator<std::__1::__bind<void (isc::ha::HAService::*)(), isc::ha::HAService*>>, void ()>::operator()() function.h:364 (libdhcp_ha.so:x86_64+0x82acb)
#11 isc::asiolink::IntervalTimerImpl::callback(boost::system::error_code const&) interval_timer.cc:174 (libkea-asiolink.70.dylib:x86_64+0x7662)
#12 boost::asio::detail::wait_handler<std::__1::__bind<void (isc::asiolink::IntervalTimerImpl::*)(boost::system::error_code const&), boost::shared_ptr<isc::asiolink::IntervalTimerImpl>, std::__1::placeholders::__ph<1> const&>, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) wait_handler.hpp:76 (libkea-asiolink.70.dylib:x86_64+0x17758)
#13 boost::asio::detail::scheduler::do_poll_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&, boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) scheduler.ipp:629 (libkea-asiolink.70.dylib:x86_64+0x20deb)
#14 boost::asio::detail::scheduler::poll(boost::system::error_code&) scheduler.ipp:277 (libkea-asiolink.70.dylib:x86_64+0x205f1)
#15 boost::asio::io_context::poll() io_context.ipp:94 (libkea-asiolink.70.dylib:x86_64+0x202ee)
#16 isc::asiolink::IOService::poll() io_service.cc:140 (libkea-asiolink.70.dylib:x86_64+0x1dc66)
#17 isc::dhcp::Dhcpv4Srv::run() dhcp4_srv.cc:1135 (kea-dhcp4:x86_64+0x100049f50)
#18 main main.cc:282 (kea-dhcp4:x86_64+0x100002e42)
Location is heap block of size 160 at 0x7b28000026c0 allocated by main thread:
#0 operator new(unsigned long) <null>:180886319 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x8027d)
#1 boost::asio::detail::kqueue_reactor::allocate_descriptor_state() kqueue_reactor.ipp:566 (libkea-http.69.dylib:x86_64+0x1f9a4)
#2 boost::asio::detail::reactive_socket_service_base::do_open(boost::asio::detail::reactive_socket_service_base::base_implementation_type&, int, int, int, boost::system::error_code&) reactive_socket_service_base.ipp:188 (libkea-http.69.dylib:x86_64+0x1f511)
#3 boost::asio::basic_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>::open(boost::asio::ip::tcp const&) basic_socket.hpp:424 (libkea-http.69.dylib:x86_64+0x1e54f)
#4 isc::asiolink::TCPSocket<(anonymous namespace)::SocketCallback>::open(isc::asiolink::IOEndpoint const*, (anonymous namespace)::SocketCallback&) tcp_socket.h:291 (libkea-http.69.dylib:x86_64+0x12c80)
#5 (anonymous namespace)::Connection::doTransactionInternal(boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, long, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc (libkea-http.69.dylib:x86_64+0x47294)
#6 (anonymous namespace)::Connection::doTransaction(boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, long, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc:1231 (libkea-http.69.dylib:x86_64+0xba7f)
#7 (anonymous namespace)::ConnectionPool::queueRequestInternal(isc::http::Url const&, boost::shared_ptr<isc::asiolink::TlsContext> const&, boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, long, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc:708 (libkea-http.69.dylib:x86_64+0x7a18)
#8 isc::http::HttpClient::asyncSendRequest(isc::http::Url const&, boost::shared_ptr<isc::asiolink::TlsContext> const&, boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, isc::http::HttpClient::RequestTimeout const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc:2009 (libkea-http.69.dylib:x86_64+0x1cd2)
#9 isc::ha::HAService::asyncSendHeartbeat() ha_service.cc:1764 (libdhcp_ha.so:x86_64+0x70051)
#10 std::__1::__function::__func<std::__1::__bind<void (isc::ha::HAService::*)(), isc::ha::HAService*>, std::__1::allocator<std::__1::__bind<void (isc::ha::HAService::*)(), isc::ha::HAService*>>, void ()>::operator()() function.h:364 (libdhcp_ha.so:x86_64+0x82acb)
#11 isc::asiolink::IntervalTimerImpl::callback(boost::system::error_code const&) interval_timer.cc:174 (libkea-asiolink.70.dylib:x86_64+0x7662)
#12 boost::asio::detail::wait_handler<std::__1::__bind<void (isc::asiolink::IntervalTimerImpl::*)(boost::system::error_code const&), boost::shared_ptr<isc::asiolink::IntervalTimerImpl>, std::__1::placeholders::__ph<1> const&>, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) wait_handler.hpp:76 (libkea-asiolink.70.dylib:x86_64+0x17758)
#13 boost::asio::detail::scheduler::do_poll_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&, boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) scheduler.ipp:629 (libkea-asiolink.70.dylib:x86_64+0x20deb)
#14 boost::asio::detail::scheduler::poll(boost::system::error_code&) scheduler.ipp:277 (libkea-asiolink.70.dylib:x86_64+0x205f1)
#15 boost::asio::io_context::poll() io_context.ipp:94 (libkea-asiolink.70.dylib:x86_64+0x202ee)
#16 isc::asiolink::IOService::poll() io_service.cc:140 (libkea-asiolink.70.dylib:x86_64+0x1dc66)
#17 isc::dhcp::Dhcpv4Srv::run() dhcp4_srv.cc:1135 (kea-dhcp4:x86_64+0x100049f50)
#18 main main.cc:282 (kea-dhcp4:x86_64+0x100002e42)
Mutex M0 (0x7b2000004238) created at:
#0 pthread_mutex_lock <null>:180886319 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x3a920)
#1 std::__1::mutex::lock() <null>:180886319 (libc++.1.dylib:x86_64+0x10af8)
#2 isc::ha::HAService::asyncSendHeartbeat() ha_service.cc:1764 (libdhcp_ha.so:x86_64+0x70051)
#3 std::__1::__function::__func<std::__1::__bind<void (isc::ha::HAService::*)(), isc::ha::HAService*>, std::__1::allocator<std::__1::__bind<void (isc::ha::HAService::*)(), isc::ha::HAService*>>, void ()>::operator()() function.h:364 (libdhcp_ha.so:x86_64+0x82acb)
#4 isc::asiolink::IntervalTimerImpl::callback(boost::system::error_code const&) interval_timer.cc:174 (libkea-asiolink.70.dylib:x86_64+0x7662)
#5 boost::asio::detail::wait_handler<std::__1::__bind<void (isc::asiolink::IntervalTimerImpl::*)(boost::system::error_code const&), boost::shared_ptr<isc::asiolink::IntervalTimerImpl>, std::__1::placeholders::__ph<1> const&>, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) wait_handler.hpp:76 (libkea-asiolink.70.dylib:x86_64+0x17758)
#6 boost::asio::detail::scheduler::do_poll_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&, boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) scheduler.ipp:629 (libkea-asiolink.70.dylib:x86_64+0x20deb)
#7 boost::asio::detail::scheduler::poll(boost::system::error_code&) scheduler.ipp:277 (libkea-asiolink.70.dylib:x86_64+0x205f1)
#8 boost::asio::io_context::poll() io_context.ipp:94 (libkea-asiolink.70.dylib:x86_64+0x202ee)
#9 isc::asiolink::IOService::poll() io_service.cc:140 (libkea-asiolink.70.dylib:x86_64+0x1dc66)
#10 isc::dhcp::Dhcpv4Srv::run() dhcp4_srv.cc:1135 (kea-dhcp4:x86_64+0x100049f50)
#11 main main.cc:282 (kea-dhcp4:x86_64+0x100002e42)
Mutex M1 (0x7bb4000081d8) created at:
#0 pthread_mutex_lock <null>:180886319 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x3a920)
#1 std::__1::mutex::lock() <null>:180886319 (libc++.1.dylib:x86_64+0x10af8)
#2 (anonymous namespace)::ConnectionPool::queueRequestInternal(isc::http::Url const&, boost::shared_ptr<isc::asiolink::TlsContext> const&, boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, long, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc:708 (libkea-http.69.dylib:x86_64+0x7a18)
#3 isc::http::HttpClient::asyncSendRequest(isc::http::Url const&, boost::shared_ptr<isc::asiolink::TlsContext> const&, boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, isc::http::HttpClient::RequestTimeout const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc:2009 (libkea-http.69.dylib:x86_64+0x1cd2)
#4 isc::ha::HAService::asyncSendHeartbeat() ha_service.cc:1764 (libdhcp_ha.so:x86_64+0x70051)
#5 std::__1::__function::__func<std::__1::__bind<void (isc::ha::HAService::*)(), isc::ha::HAService*>, std::__1::allocator<std::__1::__bind<void (isc::ha::HAService::*)(), isc::ha::HAService*>>, void ()>::operator()() function.h:364 (libdhcp_ha.so:x86_64+0x82acb)
#6 isc::asiolink::IntervalTimerImpl::callback(boost::system::error_code const&) interval_timer.cc:174 (libkea-asiolink.70.dylib:x86_64+0x7662)
#7 boost::asio::detail::wait_handler<std::__1::__bind<void (isc::asiolink::IntervalTimerImpl::*)(boost::system::error_code const&), boost::shared_ptr<isc::asiolink::IntervalTimerImpl>, std::__1::placeholders::__ph<1> const&>, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) wait_handler.hpp:76 (libkea-asiolink.70.dylib:x86_64+0x17758)
#8 boost::asio::detail::scheduler::do_poll_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&, boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) scheduler.ipp:629 (libkea-asiolink.70.dylib:x86_64+0x20deb)
#9 boost::asio::detail::scheduler::poll(boost::system::error_code&) scheduler.ipp:277 (libkea-asiolink.70.dylib:x86_64+0x205f1)
#10 boost::asio::io_context::poll() io_context.ipp:94 (libkea-asiolink.70.dylib:x86_64+0x202ee)
#11 isc::asiolink::IOService::poll() io_service.cc:140 (libkea-asiolink.70.dylib:x86_64+0x1dc66)
#12 isc::dhcp::Dhcpv4Srv::run() dhcp4_srv.cc:1135 (kea-dhcp4:x86_64+0x100049f50)
#13 main main.cc:282 (kea-dhcp4:x86_64+0x100002e42)
Mutex M2 (0x7b4400001af0) created at:
#0 pthread_mutex_init <null>:180886319 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x2f855)
#1 boost::asio::detail::conditionally_enabled_mutex::conditionally_enabled_mutex(bool) conditionally_enabled_mutex.hpp:108 (libkea-dhcp_ddns.55.dylib:x86_64+0x23a19)
#2 boost::asio::detail::kqueue_reactor::kqueue_reactor(boost::asio::execution_context&) kqueue_reactor.ipp:55 (libkea-dhcp_ddns.55.dylib:x86_64+0x1ff22)
#3 boost::asio::execution_context::service* boost::asio::detail::service_registry::create<boost::asio::detail::kqueue_reactor, boost::asio::execution_context>(void*) service_registry.hpp:86 (libkea-dhcp_ddns.55.dylib:x86_64+0x1fc8a)
#4 boost::asio::detail::service_registry::do_use_service(boost::asio::execution_context::service::key const&, boost::asio::execution_context::service* (*)(void*), void*) service_registry.ipp:132 (libkea-asiolink.70.dylib:x86_64+0xa4f0)
#5 boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptime>>::deadline_timer_service(boost::asio::execution_context&) deadline_timer_service.hpp:72 (libkea-asiolink.70.dylib:x86_64+0xa799)
#6 boost::asio::execution_context::service* boost::asio::detail::service_registry::create<boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptime>>, boost::asio::io_context>(void*) service_registry.hpp:86 (libkea-asiolink.70.dylib:x86_64+0xa3aa)
#7 boost::asio::detail::service_registry::do_use_service(boost::asio::execution_context::service::key const&, boost::asio::execution_context::service* (*)(void*), void*) service_registry.ipp:132 (libkea-asiolink.70.dylib:x86_64+0xa4f0)
#8 isc::asiolink::IntervalTimerImpl::IntervalTimerImpl(boost::shared_ptr<isc::asiolink::IOService> const&) interval_timer.cc:107 (libkea-asiolink.70.dylib:x86_64+0x68ae)
#9 isc::asiolink::IntervalTimer::IntervalTimer(boost::shared_ptr<isc::asiolink::IOService> const&) interval_timer.cc:179 (libkea-asiolink.70.dylib:x86_64+0x79e0)
#10 (anonymous namespace)::Connection::Connection(boost::shared_ptr<isc::asiolink::IOService> const&, boost::shared_ptr<isc::asiolink::TlsContext> const&, boost::shared_ptr<(anonymous namespace)::ConnectionPool> const&, isc::http::Url const&) client.cc:1133 (libkea-http.69.dylib:x86_64+0xa34c)
#11 (anonymous namespace)::ConnectionPool::queueRequestInternal(isc::http::Url const&, boost::shared_ptr<isc::asiolink::TlsContext> const&, boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, long, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc:702 (libkea-http.69.dylib:x86_64+0x78d1)
#12 isc::http::HttpClient::asyncSendRequest(isc::http::Url const&, boost::shared_ptr<isc::asiolink::TlsContext> const&, boost::shared_ptr<isc::http::HttpRequest> const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::function<void (boost::system::error_code const&, boost::shared_ptr<isc::http::HttpResponse> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)> const&, isc::http::HttpClient::RequestTimeout const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<bool (boost::system::error_code const&, int)> const&, std::__1::function<void (int)> const&) client.cc:2009 (libkea-http.69.dylib:x86_64+0x1cd2)
#13 isc::ha::HAService::asyncSendHeartbeat() ha_service.cc:1764 (libdhcp_ha.so:x86_64+0x70051)
#14 std::__1::__function::__func<std::__1::__bind<void (isc::ha::HAService::*)(), isc::ha::HAService*>, std::__1::allocator<std::__1::__bind<void (isc::ha::HAService::*)(), isc::ha::HAService*>>, void ()>::operator()() function.h:364 (libdhcp_ha.so:x86_64+0x82acb)
#15 isc::asiolink::IntervalTimerImpl::callback(boost::system::error_code const&) interval_timer.cc:174 (libkea-asiolink.70.dylib:x86_64+0x7662)
#16 boost::asio::detail::wait_handler<std::__1::__bind<void (isc::asiolink::IntervalTimerImpl::*)(boost::system::error_code const&), boost::shared_ptr<isc::asiolink::IntervalTimerImpl>, std::__1::placeholders::__ph<1> const&>, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) wait_handler.hpp:76 (libkea-asiolink.70.dylib:x86_64+0x17758)
#17 boost::asio::detail::scheduler::do_poll_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&, boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) scheduler.ipp:629 (libkea-asiolink.70.dylib:x86_64+0x20deb)
#18 boost::asio::detail::scheduler::poll(boost::system::error_code&) scheduler.ipp:277 (libkea-asiolink.70.dylib:x86_64+0x205f1)
#19 boost::asio::io_context::poll() io_context.ipp:94 (libkea-asiolink.70.dylib:x86_64+0x202ee)
#20 isc::asiolink::IOService::poll() io_service.cc:140 (libkea-asiolink.70.dylib:x86_64+0x1dc66)
#21 isc::dhcp::Dhcpv4Srv::run() dhcp4_srv.cc:1135 (kea-dhcp4:x86_64+0x100049f50)
#22 main main.cc:282 (kea-dhcp4:x86_64+0x100002e42)
Thread T5 (tid=2007280, running) created by main thread at:
#0 pthread_create <null>:180886319 (libclang_rt.tsan_osx_dynamic.dylib:x86_64h+0x2ebcf)
#1 std::__1::thread::thread<std::__1::__bind<void (isc::asiolink::IoServiceThreadPool::*)(), isc::asiolink::IoServiceThreadPool*>, void>(std::__1::__bind<void (isc::asiolink::IoServiceThreadPool::*)(), isc::asiolink::IoServiceThreadPool*>&&) thread.h:254 (libkea-asiolink.70.dylib:x86_64+0x2a24e)
#2 isc::asiolink::IoServiceThreadPool::setState(isc::asiolink::IoServiceThreadPool::State) io_service_thread_pool.cc:147 (libkea-asiolink.70.dylib:x86_64+0x28c14)
#3 isc::asiolink::IoServiceThreadPool::run() io_service_thread_pool.cc:56 (libkea-asiolink.70.dylib:x86_64+0x2861e)
#4 isc::http::HttpClient::start() client.cc:2022 (libkea-http.69.dylib:x86_64+0x2308)
#5 isc::ha::HAService::startClientAndListener() ha_service.cc:3363 (libdhcp_ha.so:x86_64+0x7fe1a)
#6 std::__1::__function::__func<isc::ha::HAImpl::startServices(boost::shared_ptr<isc::asiolink::IOService> const&, boost::shared_ptr<isc::dhcp::NetworkState> const&, isc::ha::HAServerType const&)::$_0, std::__1::allocator<isc::ha::HAImpl::startServices(boost::shared_ptr<isc::asiolink::IOService> const&, boost::shared_ptr<isc::dhcp::NetworkState> const&, isc::ha::HAServerType const&)::$_0>, void ()>::operator()() function.h:364 (libdhcp_ha.so:x86_64+0x58fa4)
#7 boost::asio::detail::completion_handler<std::__1::function<void ()>, boost::asio::io_context::basic_executor_type<std::__1::allocator<void>, 0ul>>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) completion_handler.hpp:74 (libkea-asiolink.70.dylib:x86_64+0x21d3b)
#8 boost::asio::detail::scheduler::do_poll_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&, boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) scheduler.ipp:629 (libkea-asiolink.70.dylib:x86_64+0x20deb)
#9 boost::asio::detail::scheduler::poll(boost::system::error_code&) scheduler.ipp:277 (libkea-asiolink.70.dylib:x86_64+0x205f1)
#10 boost::asio::io_context::poll() io_context.ipp:94 (libkea-asiolink.70.dylib:x86_64+0x202ee)
#11 isc::asiolink::IOService::poll() io_service.cc:140 (libkea-asiolink.70.dylib:x86_64+0x1dc66)
#12 isc::dhcp::ControlledDhcpv4Srv::commandConfigSetHandler(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, boost::shared_ptr<isc::data::Element const>) ctrl_dhcp4_srv.cc:455 (kea-dhcp4:x86_64+0x10000e351)
#13 isc::dhcp::ControlledDhcpv4Srv::processCommand(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, boost::shared_ptr<isc::data::Element const>) ctrl_dhcp4_srv.cc:871 (kea-dhcp4:x86_64+0x100009ef3)
#14 isc::dhcp::ControlledDhcpv4Srv::loadConfigFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) ctrl_dhcp4_srv.cc:163 (kea-dhcp4:x86_64+0x100008544)
#15 isc::dhcp::ControlledDhcpv4Srv::init(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) ctrl_dhcp4_srv.cc:99 (kea-dhcp4:x86_64+0x100007ed4)
#16 main main.cc:253 (kea-dhcp4:x86_64+0x100002ded)
SUMMARY: ThreadSanitizer: data race kqueue_reactor.ipp:487 in boost::asio::detail::kqueue_reactor::run(long, boost::asio::detail::op_queue<boost::asio::detail::scheduler_operation>&)
==================