From 93724f9cd4e5c28a1e154375e40cb9722bcdb698 Mon Sep 17 00:00:00 2001 From: andybg Date: Fri, 28 Mar 2025 11:11:49 +0300 Subject: Add an option to disable the fork aware mode for TThreadPool MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Продолжение починки крэшей при форке Ситуация такая же - используем subprocess для обработки данных ( subprocess не наши, написаны множеством команд на нескольких языках под конкретные ситуации), быстро избавиться от форка не получится. Есть шанс избавиться от этого пул треда, но тоже не быстро. Предлагается простое решение - не вызывать `TAtforkQueueRestarter::Get()`совсем, тогда не будет создание singletonа и вызова `pthread_atfork`. Все это под опцией `SetForkAware` - кто хочет может ее включать, для всех остальных ничего не изменится. Полная обратная совместимость, фикс ничего не мог зацепить. Проверил локально, вызова `pthread_atfork` нет в `unified agent` больше. Тесты на это очень сложно написать, без больших изменений в тред пуле, пробовал с перехватом `pthread_atfork`, к сожалении, не только `TAtforkQueueRestarter` им пользуется и нормально перехватить тоже не получилось. commit_hash:3711c6175ca64564f31f811ee1308d70ef6eb5e3 --- util/thread/pool.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'util/thread/pool.cpp') diff --git a/util/thread/pool.cpp b/util/thread/pool.cpp index 14feec7edaa..2cc72e7f4cc 100644 --- a/util/thread/pool.cpp +++ b/util/thread/pool.cpp @@ -80,8 +80,11 @@ public: , ThreadCountExpected(0) , ThreadCountReal(0) , Forked(false) + , IsForkAware_(params.IsForkAware_) { - TAtforkQueueRestarter::Get().RegisterObject(this); + if (IsForkAware_) { + TAtforkQueueRestarter::Get().RegisterObject(this); + } Start(thrnum, maxqueue); } @@ -92,7 +95,9 @@ public: // ¯\_(ツ)_/¯ } - TAtforkQueueRestarter::Get().UnregisterObject(this); + if (IsForkAware_) { + TAtforkQueueRestarter::Get().UnregisterObject(this); + } Y_ASSERT(Tharr.empty()); } @@ -268,6 +273,7 @@ private: size_t ThreadCountExpected; size_t ThreadCountReal; bool Forked; + bool IsForkAware_; class TAtforkQueueRestarter { public: -- cgit v1.3