diff options
author | arkady-e1ppa <arkady-e1ppa@yandex-team.com> | 2023-11-16 17:24:02 +0300 |
---|---|---|
committer | arkady-e1ppa <arkady-e1ppa@yandex-team.com> | 2023-11-16 18:51:45 +0300 |
commit | 6b40f0f1060a3e9d54347e52c7dc8fb278e6e86b (patch) | |
tree | da4c8447ff495a023682292e1ac90309312ddb8f /yt | |
parent | 8f8023320207d4dfa6e9b6c595fe272382595cdd (diff) | |
download | ydb-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.cpp | 3 | ||||
-rw-r--r-- | yt/yt/library/ytprof/http/handler.cpp | 5 |
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"))) |