diff options
author | dcherednik <dcherednik@ydb.tech> | 2023-08-11 12:34:20 +0300 |
---|---|---|
committer | dcherednik <dcherednik@ydb.tech> | 2023-08-11 13:37:06 +0300 |
commit | a908cb17247ecfeb4006579c2eb56e4ae026aeed (patch) | |
tree | 751590bd7db867c1a92878b9af2d973cd7293beb | |
parent | 51508adc0f2dff9220283263568d6fa0f50ebf11 (diff) | |
download | ydb-a908cb17247ecfeb4006579c2eb56e4ae026aeed.tar.gz |
Refactoring. Move common retry operation stuff out of table client.
22 files changed, 248 insertions, 83 deletions
diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/CMakeLists.txt b/ydb/public/sdk/cpp/client/impl/ydb_internal/CMakeLists.txt index 4ec2122f21a..19402a4e88e 100644 --- a/ydb/public/sdk/cpp/client/impl/ydb_internal/CMakeLists.txt +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/CMakeLists.txt @@ -13,6 +13,7 @@ add_subdirectory(kqp_session_common) add_subdirectory(logger) add_subdirectory(make_request) add_subdirectory(plain_status) +add_subdirectory(retry) add_subdirectory(session_pool) add_subdirectory(thread_pool) add_subdirectory(value_helpers) diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.darwin-x86_64.txt b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.darwin-x86_64.txt new file mode 100644 index 00000000000..c8ab5b75a3d --- /dev/null +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.darwin-x86_64.txt @@ -0,0 +1,18 @@ + +# This file was generated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + + +add_library(impl-ydb_internal-retry) +target_link_libraries(impl-ydb_internal-retry PUBLIC + contrib-libs-cxxsupp + yutil + impl-ydb_internal-grpc_connections +) +target_sources(impl-ydb_internal-retry PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.cpp +) diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.linux-aarch64.txt b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.linux-aarch64.txt new file mode 100644 index 00000000000..98f17350885 --- /dev/null +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.linux-aarch64.txt @@ -0,0 +1,19 @@ + +# This file was generated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + + +add_library(impl-ydb_internal-retry) +target_link_libraries(impl-ydb_internal-retry PUBLIC + contrib-libs-linux-headers + contrib-libs-cxxsupp + yutil + impl-ydb_internal-grpc_connections +) +target_sources(impl-ydb_internal-retry PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.cpp +) diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.linux-x86_64.txt b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.linux-x86_64.txt new file mode 100644 index 00000000000..98f17350885 --- /dev/null +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.linux-x86_64.txt @@ -0,0 +1,19 @@ + +# This file was generated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + + +add_library(impl-ydb_internal-retry) +target_link_libraries(impl-ydb_internal-retry PUBLIC + contrib-libs-linux-headers + contrib-libs-cxxsupp + yutil + impl-ydb_internal-grpc_connections +) +target_sources(impl-ydb_internal-retry PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.cpp +) diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.txt b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.txt new file mode 100644 index 00000000000..f8b31df0c11 --- /dev/null +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.txt @@ -0,0 +1,17 @@ + +# This file was generated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + +if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" AND NOT HAVE_CUDA) + include(CMakeLists.linux-aarch64.txt) +elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + include(CMakeLists.darwin-x86_64.txt) +elseif (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" AND NOT HAVE_CUDA) + include(CMakeLists.windows-x86_64.txt) +elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT HAVE_CUDA) + include(CMakeLists.linux-x86_64.txt) +endif() diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.windows-x86_64.txt b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.windows-x86_64.txt new file mode 100644 index 00000000000..c8ab5b75a3d --- /dev/null +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.windows-x86_64.txt @@ -0,0 +1,18 @@ + +# This file was generated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + + +add_library(impl-ydb_internal-retry) +target_link_libraries(impl-ydb_internal-retry PUBLIC + contrib-libs-cxxsupp + yutil + impl-ydb_internal-grpc_connections +) +target_sources(impl-ydb_internal-retry PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.cpp +) diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.cpp b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.cpp new file mode 100644 index 00000000000..801a20fa22d --- /dev/null +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.cpp @@ -0,0 +1,35 @@ +#include "retry.h" +#include <util/random/random.h> +#include <ydb/public/sdk/cpp/client/ydb_retry/retry.h> +#include <ydb/public/sdk/cpp/client/ydb_common_client/impl/iface.h> + +namespace NYdb::NRetry { + +constexpr ui32 MAX_BACKOFF_DURATION_MS = TDuration::Hours(1).MilliSeconds(); + +ui32 CalcBackoffTime(const TBackoffSettings& settings, ui32 retryNumber) { + ui32 backoffSlots = 1 << std::min(retryNumber, settings.Ceiling_); + TDuration maxDuration = settings.SlotDuration_ * backoffSlots; + + double uncertaintyRatio = std::max(std::min(settings.UncertainRatio_, 1.0), 0.0); + double uncertaintyMultiplier = RandomNumber<double>() * uncertaintyRatio - uncertaintyRatio + 1.0; + + double durationMs = round(maxDuration.MilliSeconds() * uncertaintyMultiplier); + + return std::max(std::min(durationMs, (double)MAX_BACKOFF_DURATION_MS), 0.0); +} + +void Backoff(const NRetry::TBackoffSettings& settings, ui32 retryNumber) { + auto durationMs = CalcBackoffTime(settings, retryNumber); + Sleep(TDuration::MilliSeconds(durationMs)); +} + +void AsyncBackoff(std::shared_ptr<IClientImplCommon> client, const TBackoffSettings& settings, + ui32 retryNumber, const std::function<void()>& fn) +{ + auto durationMs = CalcBackoffTime(settings, retryNumber); + client->ScheduleTask(fn, TDuration::MilliSeconds(durationMs)); +} + +} + diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.h b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.h new file mode 100644 index 00000000000..490f7a746cf --- /dev/null +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.h @@ -0,0 +1,19 @@ +#pragma once + +#include <util/system/types.h> +#include <functional> +#include <memory> + +namespace NYdb { +class IClientImplCommon; +} + +namespace NYdb::NRetry { + +struct TBackoffSettings; +ui32 CalcBackoffTime(const TBackoffSettings& settings, ui32 retryNumber); +void Backoff(const NRetry::TBackoffSettings& settings, ui32 retryNumber); +void AsyncBackoff(std::shared_ptr<IClientImplCommon> client, const TBackoffSettings& settings, + ui32 retryNumber, const std::function<void()>& fn); + +} diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/ya.make b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/ya.make new file mode 100644 index 00000000000..6c5bf12bd59 --- /dev/null +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/retry/ya.make @@ -0,0 +1,12 @@ +LIBRARY() + +SRCS( + retry.cpp +) + +PEERDIR( + ydb/public/sdk/cpp/client/impl/ydb_internal/grpc_connections +) + +END() + diff --git a/ydb/public/sdk/cpp/client/resources/ydb_sdk_version.txt b/ydb/public/sdk/cpp/client/resources/ydb_sdk_version.txt index b8d12d73710..d5724cd41b6 100644 --- a/ydb/public/sdk/cpp/client/resources/ydb_sdk_version.txt +++ b/ydb/public/sdk/cpp/client/resources/ydb_sdk_version.txt @@ -1 +1 @@ -2.6.1
\ No newline at end of file +2.6.2
\ No newline at end of file diff --git a/ydb/public/sdk/cpp/client/ydb_common_client/impl/client.h b/ydb/public/sdk/cpp/client/ydb_common_client/impl/client.h index 18d65505bcf..18840590b53 100644 --- a/ydb/public/sdk/cpp/client/ydb_common_client/impl/client.h +++ b/ydb/public/sdk/cpp/client/ydb_common_client/impl/client.h @@ -1,5 +1,7 @@ #pragma once +#include "iface.h" + #define INCLUDE_YDB_INTERNAL_H #include <ydb/public/sdk/cpp/client/impl/ydb_internal/grpc_connections/grpc_connections.h> #undef INCLUDE_YDB_INTERNAL_H @@ -12,7 +14,9 @@ namespace NYdb { template<typename T> -class TClientImplCommon : public std::enable_shared_from_this<T> { +class TClientImplCommon + : public IClientImplCommon + , public std::enable_shared_from_this<T> { public: TClientImplCommon( std::shared_ptr<TGRpcConnectionsImpl>&& connections, @@ -22,7 +26,8 @@ public: const TMaybe<TSslCredentials>& sslCredentials, const TMaybe<std::shared_ptr<ICredentialsProviderFactory>>& credentialsProviderFactory) : Connections_(std::move(connections)) - , DbDriverState_(Connections_->GetDriverState(database, discoveryEndpoint, discoveryMode, sslCredentials, credentialsProviderFactory)) + , DbDriverState_(Connections_->GetDriverState( + database, discoveryEndpoint, discoveryMode, sslCredentials, credentialsProviderFactory)) { Y_VERIFY(DbDriverState_); } @@ -48,6 +53,17 @@ public: return DbDriverState_->DiscoveryCompleted(); } + void ScheduleTask(const std::function<void()>& fn, TDuration timeout) override { + std::weak_ptr<IClientImplCommon> weak = this->shared_from_this(); + auto cbGuard = [weak, fn]() { + auto strongClient = weak.lock(); + if (strongClient) { + fn(); + } + }; + Connections_->ScheduleOneTimeTask(std::move(cbGuard), timeout); + } + protected: template<typename TService, typename TRequest, typename TResponse> using TAsyncRequest = typename NGrpc::TSimpleRequestProcessor< diff --git a/ydb/public/sdk/cpp/client/ydb_common_client/impl/iface.h b/ydb/public/sdk/cpp/client/ydb_common_client/impl/iface.h new file mode 100644 index 00000000000..2f0e3105996 --- /dev/null +++ b/ydb/public/sdk/cpp/client/ydb_common_client/impl/iface.h @@ -0,0 +1,14 @@ +#pragma once + +#include <functional> +#include <util/datetime/base.h> + +namespace NYdb { + +class IClientImplCommon { +public: + virtual ~IClientImplCommon() = default; + virtual void ScheduleTask(const std::function<void()>& fn, TDuration timeout) = 0; +}; + +} diff --git a/ydb/public/sdk/cpp/client/ydb_retry/retry.h b/ydb/public/sdk/cpp/client/ydb_retry/retry.h new file mode 100644 index 00000000000..7a6cdb61e95 --- /dev/null +++ b/ydb/public/sdk/cpp/client/ydb_retry/retry.h @@ -0,0 +1,42 @@ +#pragma once + +#include <ydb/public/sdk/cpp/client/ydb_types/fluent_settings_helpers.h> +#include <util/datetime/base.h> + +namespace NYdb::NRetry { + +struct TBackoffSettings { + using TSelf = TBackoffSettings; + + FLUENT_SETTING_DEFAULT(TDuration, SlotDuration, TDuration::Seconds(1)); + FLUENT_SETTING_DEFAULT(ui32, Ceiling, 6); + FLUENT_SETTING_DEFAULT(double, UncertainRatio, 0.5); +}; + +struct TRetryOperationSettings { + using TSelf = TRetryOperationSettings; + + FLUENT_SETTING_DEFAULT(ui32, MaxRetries, 10); + FLUENT_SETTING_DEFAULT(bool, RetryNotFound, true); + FLUENT_SETTING_DEFAULT(TDuration, GetSessionClientTimeout, TDuration::Seconds(5)); + FLUENT_SETTING_DEFAULT(TBackoffSettings, FastBackoffSettings, DefaultFastBackoffSettings()); + FLUENT_SETTING_DEFAULT(TBackoffSettings, SlowBackoffSettings, DefaultSlowBackoffSettings()); + FLUENT_SETTING_FLAG(Idempotent); + FLUENT_SETTING_FLAG(Verbose); + + static TBackoffSettings DefaultFastBackoffSettings() { + return TBackoffSettings() + .Ceiling(10) + .SlotDuration(TDuration::MilliSeconds(5)) + .UncertainRatio(0.5); + } + + static TBackoffSettings DefaultSlowBackoffSettings() { + return TBackoffSettings() + .Ceiling(6) + .SlotDuration(TDuration::Seconds(1)) + .UncertainRatio(0.5); + } +}; + +}; diff --git a/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.darwin-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.darwin-x86_64.txt index 33b6f4812af..e0ba823cda9 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.darwin-x86_64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.darwin-x86_64.txt @@ -23,6 +23,7 @@ target_link_libraries(cpp-client-ydb_table PUBLIC api-protos impl-ydb_internal-make_request impl-ydb_internal-kqp_session_common + impl-ydb_internal-retry cpp-client-ydb_driver cpp-client-ydb_params cpp-client-ydb_proto diff --git a/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.linux-aarch64.txt b/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.linux-aarch64.txt index 241f404ed39..516b2bbc707 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.linux-aarch64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.linux-aarch64.txt @@ -24,6 +24,7 @@ target_link_libraries(cpp-client-ydb_table PUBLIC api-protos impl-ydb_internal-make_request impl-ydb_internal-kqp_session_common + impl-ydb_internal-retry cpp-client-ydb_driver cpp-client-ydb_params cpp-client-ydb_proto diff --git a/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.linux-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.linux-x86_64.txt index 241f404ed39..516b2bbc707 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.linux-x86_64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.linux-x86_64.txt @@ -24,6 +24,7 @@ target_link_libraries(cpp-client-ydb_table PUBLIC api-protos impl-ydb_internal-make_request impl-ydb_internal-kqp_session_common + impl-ydb_internal-retry cpp-client-ydb_driver cpp-client-ydb_params cpp-client-ydb_proto diff --git a/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.windows-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.windows-x86_64.txt index 33b6f4812af..e0ba823cda9 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.windows-x86_64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.windows-x86_64.txt @@ -23,6 +23,7 @@ target_link_libraries(cpp-client-ydb_table PUBLIC api-protos impl-ydb_internal-make_request impl-ydb_internal-kqp_session_common + impl-ydb_internal-retry cpp-client-ydb_driver cpp-client-ydb_params cpp-client-ydb_proto diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp b/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp index 87fd1462f9a..db9144b00a6 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp +++ b/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp @@ -17,20 +17,6 @@ TDuration GetMaxTimeToTouch(const TSessionPoolSettings& settings) { return Max(settings.CloseIdleThreshold_, settings.KeepAliveIdleThreshold_); } -ui32 CalcBackoffTime(const TBackoffSettings& settings, ui32 retryNumber) { - ui32 backoffSlots = 1 << std::min(retryNumber, settings.Ceiling_); - TDuration maxDuration = settings.SlotDuration_ * backoffSlots; - - double uncertaintyRatio = std::max(std::min(settings.UncertainRatio_, 1.0), 0.0); - double uncertaintyMultiplier = RandomNumber<double>() * uncertaintyRatio - uncertaintyRatio + 1.0; - - double durationMs = round(maxDuration.MilliSeconds() * uncertaintyMultiplier); - - return std::max(std::min(durationMs, (double)MAX_BACKOFF_DURATION_MS), 0.0); -} - - - TTableClient::TImpl::TImpl(std::shared_ptr<TGRpcConnectionsImpl>&& connections, const TClientSettings& settings) : TClientImplCommon(std::move(connections), settings) , Settings_(settings) @@ -92,26 +78,10 @@ NThreading::TFuture<void> TTableClient::TImpl::Stop() { return Drain(); } -void TTableClient::TImpl::ScheduleTask(const std::function<void()>& fn, TDuration timeout) { - std::weak_ptr<TTableClient::TImpl> weak = shared_from_this(); - auto cbGuard = [weak, fn]() { - auto strongClient = weak.lock(); - if (strongClient) { - fn(); - } - }; - Connections_->ScheduleOneTimeTask(std::move(cbGuard), timeout); -} - void TTableClient::TImpl::ScheduleTaskUnsafe(std::function<void()>&& fn, TDuration timeout) { Connections_->ScheduleOneTimeTask(std::move(fn), timeout); } -void TTableClient::TImpl::AsyncBackoff(const TBackoffSettings& settings, ui32 retryNumber, const std::function<void()>& fn) { - auto durationMs = CalcBackoffTime(settings, retryNumber); - ScheduleTask(fn, TDuration::MilliSeconds(durationMs)); -} - void TTableClient::TImpl::StartPeriodicSessionPoolTask() { // Session pool guarantees than client is alive during call callbacks auto deletePredicate = [this](TKqpSessionCommon* s, size_t sessionsCount) { diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.h b/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.h index 692cf85c33f..a3dd1de2f6b 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.h +++ b/ydb/public/sdk/cpp/client/ydb_table/impl/table_client.h @@ -24,14 +24,10 @@ namespace NTable { //How ofter run host scan to perform session balancing constexpr TDuration HOSTSCAN_PERIODIC_ACTION_INTERVAL = TDuration::Seconds(2); -constexpr ui32 MAX_BACKOFF_DURATION_MS = TDuration::Hours(1).MilliSeconds(); constexpr TDuration KEEP_ALIVE_CLIENT_TIMEOUT = TDuration::Seconds(5); TDuration GetMinTimeToTouch(const TSessionPoolSettings& settings); TDuration GetMaxTimeToTouch(const TSessionPoolSettings& settings); -ui32 CalcBackoffTime(const TBackoffSettings& settings, ui32 retryNumber); -TDuration GetMinTimeToTouch(const TSessionPoolSettings& settings); -TDuration GetMaxTimeToTouch(const TSessionPoolSettings& settings); class TTableClient::TImpl: public TClientImplCommon<TTableClient::TImpl>, public ISessionClient { public: @@ -45,9 +41,7 @@ public: void InitStopper(); NThreading::TFuture<void> Drain(); NThreading::TFuture<void> Stop(); - void ScheduleTask(const std::function<void()>& fn, TDuration timeout); void ScheduleTaskUnsafe(std::function<void()>&& fn, TDuration timeout); - void AsyncBackoff(const TBackoffSettings& settings, ui32 retryNumber, const std::function<void()>& fn); void StartPeriodicSessionPoolTask(); static ui64 ScanForeignLocations(std::shared_ptr<TTableClient::TImpl> client); static std::pair<ui64, size_t> ScanLocation(std::shared_ptr<TTableClient::TImpl> client, diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.cpp b/ydb/public/sdk/cpp/client/ydb_table/table.cpp index 035ef07168c..9af6fc69f2d 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.cpp +++ b/ydb/public/sdk/cpp/client/ydb_table/table.cpp @@ -4,6 +4,7 @@ #include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h> #include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h> #include <ydb/public/sdk/cpp/client/impl/ydb_internal/make_request/make.h> +#include <ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.h> #undef INCLUDE_YDB_INTERNAL_H #include <ydb/public/api/grpc/ydb_table_v1.grpc.pb.h> @@ -1352,11 +1353,6 @@ struct TRetryState { THandleStatusFunc HandleStatusFunc; }; -static void Backoff(const TBackoffSettings& settings, ui32 retryNumber) { - auto durationMs = CalcBackoffTime(settings, retryNumber); - Sleep(TDuration::MilliSeconds(durationMs)); -} - class TRetryOperationContext : public TThrRefBase, TNonCopyable { public: using TRetryContextPtr = TIntrusivePtr<TRetryOperationContext>; @@ -1390,12 +1386,12 @@ protected: virtual void Reset() {} static void DoRetry(TRetryContextPtr self, bool fast) { - self->TableClient.Impl_->AsyncBackoff( - fast ? self->Settings.FastBackoffSettings_ : self->Settings.SlowBackoffSettings_, - self->RetryNumber, - [self]() { - RunOp(self); - } + AsyncBackoff(self->TableClient.Impl_, + fast ? self->Settings.FastBackoffSettings_ : self->Settings.SlowBackoffSettings_, + self->RetryNumber, + [self]() { + RunOp(self); + } ); } diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.h b/ydb/public/sdk/cpp/client/ydb_table/table.h index 340c99b9767..535651b6ece 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.h +++ b/ydb/public/sdk/cpp/client/ydb_table/table.h @@ -8,6 +8,7 @@ #include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h> #include <ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h> #include <ydb/public/sdk/cpp/client/ydb_types/operation/operation.h> +#include <ydb/public/sdk/cpp/client/ydb_retry/retry.h> #include <util/generic/hash.h> #include <util/generic/maybe.h> @@ -872,39 +873,8 @@ using TAsyncScanQueryPartIterator = NThreading::TFuture<TScanQueryPartIterator>; struct TCreateSessionSettings : public TOperationRequestSettings<TCreateSessionSettings> {}; -struct TBackoffSettings { - using TSelf = TBackoffSettings; - - FLUENT_SETTING_DEFAULT(TDuration, SlotDuration, TDuration::Seconds(1)); - FLUENT_SETTING_DEFAULT(ui32, Ceiling, 6); - FLUENT_SETTING_DEFAULT(double, UncertainRatio, 0.5); -}; - -struct TRetryOperationSettings { - using TSelf = TRetryOperationSettings; - - FLUENT_SETTING_DEFAULT(ui32, MaxRetries, 10); - FLUENT_SETTING_DEFAULT(bool, RetryNotFound, true); - FLUENT_SETTING_DEFAULT(TDuration, GetSessionClientTimeout, TDuration::Seconds(5)); - FLUENT_SETTING_DEFAULT(TBackoffSettings, FastBackoffSettings, DefaultFastBackoffSettings()); - FLUENT_SETTING_DEFAULT(TBackoffSettings, SlowBackoffSettings, DefaultSlowBackoffSettings()); - FLUENT_SETTING_FLAG(Idempotent); - FLUENT_SETTING_FLAG(Verbose); - - static TBackoffSettings DefaultFastBackoffSettings() { - return TBackoffSettings() - .Ceiling(10) - .SlotDuration(TDuration::MilliSeconds(5)) - .UncertainRatio(0.5); - } - - static TBackoffSettings DefaultSlowBackoffSettings() { - return TBackoffSettings() - .Ceiling(6) - .SlotDuration(TDuration::Seconds(1)) - .UncertainRatio(0.5); - } -}; +using TBackoffSettings = NYdb::NRetry::TBackoffSettings; +using TRetryOperationSettings = NYdb::NRetry::TRetryOperationSettings; struct TSessionPoolSettings { using TSelf = TSessionPoolSettings; diff --git a/ydb/public/sdk/cpp/client/ydb_table/ya.make b/ydb/public/sdk/cpp/client/ydb_table/ya.make index faba611793b..6ab49c81147 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/ya.make +++ b/ydb/public/sdk/cpp/client/ydb_table/ya.make @@ -11,6 +11,7 @@ PEERDIR( ydb/public/api/protos ydb/public/sdk/cpp/client/impl/ydb_internal/make_request ydb/public/sdk/cpp/client/impl/ydb_internal/kqp_session_common + ydb/public/sdk/cpp/client/impl/ydb_internal/retry ydb/public/sdk/cpp/client/ydb_driver ydb/public/sdk/cpp/client/ydb_params ydb/public/sdk/cpp/client/ydb_proto |