diff options
| author | vvvv <[email protected]> | 2024-11-01 15:41:40 +0300 |
|---|---|---|
| committer | vvvv <[email protected]> | 2024-11-01 15:55:52 +0300 |
| commit | 3325f745e67f7f442790822b5c9c5e9996708be7 (patch) | |
| tree | f7318d68bbe8990092715436444b05297ce35777 /yql/essentials/utils/failure_injector/failure_injector.cpp | |
| parent | 6dce3f1c71786f2694b73b1a5155efc58f4557dd (diff) | |
Moved yql/utils YQL-19206
Также была выделена жирная зависимость из yql/utils в yql/utils/network, в результате library/cpp/getopt была добавлена явно в те проекты, которые ее ранее наследовали, а не указывали явно
commit_hash:36aa4c41f807b4cbbf70a3ed7ac0a1a5079bb75d
Diffstat (limited to 'yql/essentials/utils/failure_injector/failure_injector.cpp')
| -rw-r--r-- | yql/essentials/utils/failure_injector/failure_injector.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/yql/essentials/utils/failure_injector/failure_injector.cpp b/yql/essentials/utils/failure_injector/failure_injector.cpp new file mode 100644 index 00000000000..4f4f9c1eb69 --- /dev/null +++ b/yql/essentials/utils/failure_injector/failure_injector.cpp @@ -0,0 +1,64 @@ +#include "failure_injector.h" + +#include <yql/essentials/utils/log/log.h> +#include <yql/essentials/utils/yql_panic.h> + +#include <util/generic/singleton.h> + +namespace NYql { + +void TFailureInjector::Activate() { + Singleton<TFailureInjector>()->ActivateImpl(); +} + +void TFailureInjector::Set(std::string_view name, ui64 skip, ui64 countOfFails) { + Singleton<TFailureInjector>()->SetImpl(name, skip, countOfFails); +} + +void TFailureInjector::Reach(std::string_view name, std::function<void()> action) { + Singleton<TFailureInjector>()->ReachImpl(name, action); +} + +void TFailureInjector::ActivateImpl() { + Enabled_.store(true); + YQL_LOG(DEBUG) << "TFailureInjector::Activate"; +} + +THashMap<TString, TFailureInjector::TFailureSpec> TFailureInjector::GetCurrentState() { + return Singleton<TFailureInjector>()->GetCurrentStateImpl(); +} + +THashMap<TString, TFailureInjector::TFailureSpec> TFailureInjector::GetCurrentStateImpl() { + THashMap<TString, TFailureInjector::TFailureSpec> copy; + with_lock(Lock) { + copy = FailureSpecs; + } + return copy; +} + +void TFailureInjector::ReachImpl(std::string_view name, std::function<void()> action) { + if (!Enabled_.load()) { + return; + } + with_lock(Lock) { + if (auto failureSpec = FailureSpecs.FindPtr(name)) { + YQL_LOG(DEBUG) << "TFailureInjector::Reach: " << name << ", Skip=" << failureSpec->Skip << ", Fails=" << failureSpec->CountOfFails; + if (failureSpec->Skip > 0) { + --failureSpec->Skip; + } else if (failureSpec->CountOfFails > 0) { + YQL_LOG(DEBUG) << "TFailureInjector::OnReach: " << name; + --failureSpec->CountOfFails; + action(); + } + } + } +} + +void TFailureInjector::SetImpl(std::string_view name, ui64 skip, ui64 countOfFails) { + with_lock(Lock) { + YQL_ENSURE(countOfFails > 0, "failure " << name << ", 'countOfFails' must be positive"); + FailureSpecs[TString{name}] = TFailureSpec{skip, countOfFails}; + } +} + +} // NYql |
