aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandybg <andybg@yandex-team.com>2025-03-28 11:11:49 +0300
committerandybg <andybg@yandex-team.com>2025-03-28 11:26:21 +0300
commit93724f9cd4e5c28a1e154375e40cb9722bcdb698 (patch)
tree48cd143b7d1dc68fee44f96edda2c6750227100d
parent71e9df83f284bf42c2f8ea872752bf02e1055555 (diff)
downloadydb-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.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;
+ }
};
/**