Do not miss exceptions from the ThreadPool

This commit is contained in:
Azat Khuzhin 2021-08-08 11:29:39 +03:00
parent 560e71dcfa
commit 83d871b701

View File

@ -192,6 +192,9 @@ template <typename Thread>
ThreadPoolImpl<Thread>::~ThreadPoolImpl() ThreadPoolImpl<Thread>::~ThreadPoolImpl()
{ {
finalize(); finalize();
/// wait() hadn't been called, log exception at least.
if (first_exception)
DB::tryLogException(first_exception, __PRETTY_FUNCTION__);
} }
template <typename Thread> template <typename Thread>
@ -270,11 +273,21 @@ void ThreadPoolImpl<Thread>::worker(typename std::list<Thread>::iterator thread_
} }
catch (...) catch (...)
{ {
ALLOW_ALLOCATIONS_IN_SCOPE;
/// job should be reset before decrementing scheduled_jobs to /// job should be reset before decrementing scheduled_jobs to
/// ensure that the Job destroyed before wait() returns. /// ensure that the Job destroyed before wait() returns.
job = {}; job = {};
{ {
/// In case thread pool will not be terminated on exception
/// (this is the case for GlobalThreadPool),
/// than first_exception may be overwritten and got lost,
/// and this usually is an error, since this will finish the thread,
/// and for this the caller may not be ready.
if (!shutdown_on_exception)
DB::tryLogException(std::current_exception(), __PRETTY_FUNCTION__);
std::unique_lock lock(mutex); std::unique_lock lock(mutex);
if (!first_exception) if (!first_exception)
first_exception = std::current_exception(); // NOLINT first_exception = std::current_exception(); // NOLINT