summaryrefslogtreecommitdiffstats
path: root/util/thread
diff options
context:
space:
mode:
authorandybg <[email protected]>2025-03-28 11:11:49 +0300
committerandybg <[email protected]>2025-03-28 11:26:21 +0300
commit93724f9cd4e5c28a1e154375e40cb9722bcdb698 (patch)
tree48cd143b7d1dc68fee44f96edda2c6750227100d /util/thread
parent71e9df83f284bf42c2f8ea872752bf02e1055555 (diff)
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
Diffstat (limited to 'util/thread')
-rw-r--r--util/thread/pool.cpp10
-rw-r--r--util/thread/pool.h6
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;
+ }
};
/**