aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordcherednik <dcherednik@ydb.tech>2023-08-11 12:34:20 +0300
committerdcherednik <dcherednik@ydb.tech>2023-08-11 13:37:06 +0300
commita908cb17247ecfeb4006579c2eb56e4ae026aeed (patch)
tree751590bd7db867c1a92878b9af2d973cd7293beb
parent51508adc0f2dff9220283263568d6fa0f50ebf11 (diff)
downloadydb-a908cb17247ecfeb4006579c2eb56e4ae026aeed.tar.gz
Refactoring. Move common retry operation stuff out of table client.
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/CMakeLists.txt1
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.darwin-x86_64.txt18
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.linux-aarch64.txt19
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.linux-x86_64.txt19
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.txt17
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/retry/CMakeLists.windows-x86_64.txt18
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.cpp35
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/retry/retry.h19
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/retry/ya.make12
-rw-r--r--ydb/public/sdk/cpp/client/resources/ydb_sdk_version.txt2
-rw-r--r--ydb/public/sdk/cpp/client/ydb_common_client/impl/client.h20
-rw-r--r--ydb/public/sdk/cpp/client/ydb_common_client/impl/iface.h14
-rw-r--r--ydb/public/sdk/cpp/client/ydb_retry/retry.h42
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/impl/table_client.cpp30
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/impl/table_client.h6
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/table.cpp18
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/table.h36
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/ya.make1
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