diff options
author | andybg <andybg@yandex-team.com> | 2025-03-28 11:11:49 +0300 |
---|---|---|
committer | andybg <andybg@yandex-team.com> | 2025-03-28 11:26:21 +0300 |
commit | 93724f9cd4e5c28a1e154375e40cb9722bcdb698 (patch) | |
tree | 48cd143b7d1dc68fee44f96edda2c6750227100d | |
parent | 71e9df83f284bf42c2f8ea872752bf02e1055555 (diff) | |
download | ydb-93724f9cd4e5c28a1e154375e40cb9722bcdb698.tar.gz |
Add an option to disable the fork aware mode for TThreadPool
Продолжение починки крэшей при форке
Ситуация такая же - используем subprocess для обработки данных ( subprocess не наши, написаны множеством команд на нескольких языках под конкретные ситуации), быстро избавиться от форка не получится. Есть шанс избавиться от этого пул треда, но тоже не быстро.
Предлагается простое решение - не вызывать `TAtforkQueueRestarter::Get()`совсем, тогда не будет создание singletonа и вызова `pthread_atfork`. Все это под опцией `SetForkAware` - кто хочет может ее включать, для всех остальных ничего не изменится.
Полная обратная совместимость, фикс ничего не мог зацепить. Проверил локально, вызова `pthread_atfork` нет в `unified agent` больше.
Тесты на это очень сложно написать, без больших изменений в тред пуле, пробовал с перехватом `pthread_atfork`, к сожалении, не только `TAtforkQueueRestarter` им пользуется и нормально перехватить тоже не получилось.
commit_hash:3711c6175ca64564f31f811ee1308d70ef6eb5e3
-rw-r--r-- | util/thread/pool.cpp | 10 | ||||
-rw-r--r-- | util/thread/pool.h | 6 |
2 files changed, 14 insertions, 2 deletions
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: diff --git a/util/thread/pool.h b/util/thread/pool.h index f7422645f96..6fef9ac0e50 100644 --- a/util/thread/pool.h +++ b/util/thread/pool.h @@ -86,6 +86,7 @@ struct TThreadPoolParams { IThreadFactory* Factory_ = SystemThreadFactory(); TString ThreadName_; bool EnumerateThreads_ = false; + bool IsForkAware_ = true; using TSelf = TThreadPoolParams; @@ -131,6 +132,11 @@ struct TThreadPoolParams { EnumerateThreads_ = true; return *this; } + + TSelf& SetForkAware(bool val) { + IsForkAware_ = val; + return *this; + } }; /** |