summaryrefslogtreecommitdiffstats
path: root/yql/essentials/utils/failure_injector/failure_injector.cpp
diff options
context:
space:
mode:
authorvvvv <[email protected]>2024-11-01 15:41:40 +0300
committervvvv <[email protected]>2024-11-01 15:55:52 +0300
commit3325f745e67f7f442790822b5c9c5e9996708be7 (patch)
treef7318d68bbe8990092715436444b05297ce35777 /yql/essentials/utils/failure_injector/failure_injector.cpp
parent6dce3f1c71786f2694b73b1a5155efc58f4557dd (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.cpp64
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