aboutsummaryrefslogtreecommitdiffstats
path: root/yt
diff options
context:
space:
mode:
authorarkady-e1ppa <arkady-e1ppa@yandex-team.com>2023-11-16 17:24:02 +0300
committerarkady-e1ppa <arkady-e1ppa@yandex-team.com>2023-11-16 18:51:45 +0300
commit6b40f0f1060a3e9d54347e52c7dc8fb278e6e86b (patch)
treeda4c8447ff495a023682292e1ac90309312ddb8f /yt
parent8f8023320207d4dfa6e9b6c595fe272382595cdd (diff)
downloadydb-6b40f0f1060a3e9d54347e52c7dc8fb278e6e86b.tar.gz
Active spinlock tracking from pr3151306. Added TracelessGuards to disable mentioned tracking
1) Добавлена возможность инструментировать ваш любимый мьютекс/спинлок/что-либо с методами Acquire/Release со схожим смыслом. Делается это засчет методов ```NThreading::NDetail::RecordSpinlockAcquired```/```NThreading::NDetail::RecordSpinlockReleased```. Они отслеживают число захваченных спинлоков. 2) Добавлен макрос ```REGISTER_TRACKED_SPIN_LOCK_CLASS```, который позволяет номинально проверить на этапе компиляции, что данный спинлок отслеживается. 3) Добавлен метод ```NThreading::VerifyNoSpinlockAffinity```, который коркается, если число захваченных спинлоков больше нуля. 4) Добавлены Traceless версии (почти) всех гардов, чтобы можно было не отслеживать конкретную критическую секцию, если очень нужно. 5) Внутри файберного ```WaitUntilSet``` вызывается ```VerifyNoSpinlockAffinity``` -- делать ```WaitFor``` или ```Yield``` внутри отслеживаемых критических секций нельзя. Если очень хочется -- используем TracelessGuard нужного вида. 6) Теперь отслеживаются такие спинлоки и их наследники: ```TSpinLock```, ```TRecursiveSpinLock```, ```TReaderWriterSpinLock```. 7) Зарегистрированы как отслеживаемые все вышеперечисленные спинлоки и их Padded версии. 8) Все эти действия имеют эффект только в дебаг сборке. В релизе вся эта диагностика стирается.
Diffstat (limited to 'yt')
-rw-r--r--yt/yt/core/concurrency/fiber_scheduler_thread.cpp3
-rw-r--r--yt/yt/library/ytprof/http/handler.cpp5
2 files changed, 7 insertions, 1 deletions
diff --git a/yt/yt/core/concurrency/fiber_scheduler_thread.cpp b/yt/yt/core/concurrency/fiber_scheduler_thread.cpp
index 60f0d81b8f..7fcb074e84 100644
--- a/yt/yt/core/concurrency/fiber_scheduler_thread.cpp
+++ b/yt/yt/core/concurrency/fiber_scheduler_thread.cpp
@@ -11,6 +11,8 @@
#include <yt/yt/core/misc/shutdown.h>
#include <yt/yt/core/misc/singleton.h>
+#include <library/cpp/yt/threading/spin_lock_count.h>
+
#include <yt/yt/core/tracing/trace_context.h>
#include <library/cpp/yt/memory/memory_tag.h>
@@ -948,6 +950,7 @@ void WaitUntilSet(TFuture<void> future, IInvokerPtr invoker)
return;
}
+ NThreading::VerifyNoSpinLockAffinity();
YT_VERIFY(invoker != GetSyncInvoker());
// Ensure canceler created.
diff --git a/yt/yt/library/ytprof/http/handler.cpp b/yt/yt/library/ytprof/http/handler.cpp
index 382ffc1fec..2dbc631957 100644
--- a/yt/yt/library/ytprof/http/handler.cpp
+++ b/yt/yt/library/ytprof/http/handler.cpp
@@ -18,6 +18,8 @@
#include <library/cpp/cgiparam/cgiparam.h>
+#include <library/cpp/yt/threading/traceless_guard.h>
+
#include <util/system/mutex.h>
namespace NYT::NYTProf {
@@ -40,7 +42,8 @@ public:
void HandleRequest(const IRequestPtr& req, const IResponseWriterPtr& rsp) override
{
try {
- TTryGuard guard(Lock_);
+ auto guard = NThreading::TracelessTryGuard(Lock_);
+
if (!guard) {
rsp->SetStatus(EStatusCode::TooManyRequests);
WaitFor(rsp->WriteBody(TSharedRef::FromString("Profile fetch already running")))