aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorilnaz <ilnaz@ydb.tech>2023-03-01 16:07:30 +0300
committerilnaz <ilnaz@ydb.tech>2023-03-01 16:07:30 +0300
commit7eb33768269c07d85e53206e49efbd3ae1699163 (patch)
treec19c76087347b45fa79c61c91a0ac5a89e7a8db4
parent7b8096097dc79f46e096d02b56cddc7b50704bc7 (diff)
downloadydb-7eb33768269c07d85e53206e49efbd3ae1699163.tar.gz
Recursive remove
-rw-r--r--ydb/library/backup/CMakeLists.darwin.txt2
-rw-r--r--ydb/library/backup/CMakeLists.linux-aarch64.txt2
-rw-r--r--ydb/library/backup/CMakeLists.linux.txt2
-rw-r--r--ydb/library/backup/backup.cpp4
-rw-r--r--ydb/public/lib/ydb_cli/common/CMakeLists.darwin.txt5
-rw-r--r--ydb/public/lib/ydb_cli/common/CMakeLists.linux-aarch64.txt5
-rw-r--r--ydb/public/lib/ydb_cli/common/CMakeLists.linux.txt5
-rw-r--r--ydb/public/lib/ydb_cli/common/recursive_list.cpp14
-rw-r--r--ydb/public/lib/ydb_cli/common/recursive_list.h4
-rw-r--r--ydb/public/lib/ydb_cli/common/recursive_remove.cpp118
-rw-r--r--ydb/public/lib/ydb_cli/common/recursive_remove.h24
-rw-r--r--ydb/public/lib/ydb_cli/common/retry_func.cpp10
-rw-r--r--ydb/public/lib/ydb_cli/common/retry_func.h46
-rw-r--r--ydb/public/lib/ydb_cli/dump/restore_impl.cpp7
-rw-r--r--ydb/public/lib/ydb_cli/dump/restore_import_data.cpp7
-rw-r--r--ydb/public/lib/ydb_cli/dump/util/util.cpp113
-rw-r--r--ydb/public/lib/ydb_cli/dump/util/util.h20
17 files changed, 242 insertions, 146 deletions
diff --git a/ydb/library/backup/CMakeLists.darwin.txt b/ydb/library/backup/CMakeLists.darwin.txt
index ae4818eedfb..92a7c7975d9 100644
--- a/ydb/library/backup/CMakeLists.darwin.txt
+++ b/ydb/library/backup/CMakeLists.darwin.txt
@@ -18,7 +18,7 @@ target_link_libraries(kikimr_backup PUBLIC
ydb-library-dynumber
api-grpc
api-protos
- ydb_cli-dump-util
+ common
public-lib-yson_value
cpp-client-ydb_proto
cpp-client-ydb_scheme
diff --git a/ydb/library/backup/CMakeLists.linux-aarch64.txt b/ydb/library/backup/CMakeLists.linux-aarch64.txt
index 4e61736477a..4c16eb983ec 100644
--- a/ydb/library/backup/CMakeLists.linux-aarch64.txt
+++ b/ydb/library/backup/CMakeLists.linux-aarch64.txt
@@ -19,7 +19,7 @@ target_link_libraries(kikimr_backup PUBLIC
ydb-library-dynumber
api-grpc
api-protos
- ydb_cli-dump-util
+ common
public-lib-yson_value
cpp-client-ydb_proto
cpp-client-ydb_scheme
diff --git a/ydb/library/backup/CMakeLists.linux.txt b/ydb/library/backup/CMakeLists.linux.txt
index 4e61736477a..4c16eb983ec 100644
--- a/ydb/library/backup/CMakeLists.linux.txt
+++ b/ydb/library/backup/CMakeLists.linux.txt
@@ -19,7 +19,7 @@ target_link_libraries(kikimr_backup PUBLIC
ydb-library-dynumber
api-grpc
api-protos
- ydb_cli-dump-util
+ common
public-lib-yson_value
cpp-client-ydb_proto
cpp-client-ydb_scheme
diff --git a/ydb/library/backup/backup.cpp b/ydb/library/backup/backup.cpp
index 38b0bbbaa80..be5f298313c 100644
--- a/ydb/library/backup/backup.cpp
+++ b/ydb/library/backup/backup.cpp
@@ -7,7 +7,7 @@
#include <ydb/public/api/protos/ydb_table.pb.h>
#include <ydb/public/lib/yson_value/ydb_yson_value.h>
#include <ydb/public/sdk/cpp/client/ydb_table/table.h>
-#include <ydb/public/lib/ydb_cli/dump/util/util.h>
+#include <ydb/public/lib/ydb_cli/common/recursive_remove.h>
#include <library/cpp/containers/stack_vector/stack_vec.h>
#include <library/cpp/string_utils/quote/quote.h>
@@ -505,7 +505,7 @@ void RemoveClusterDirectory(const TDriver& driver, const TString& path) {
void RemoveClusterDirectoryRecursive(const TDriver& driver, const TString& path) {
NScheme::TSchemeClient schemeClient(driver);
NTable::TTableClient tableClient(driver);
- TStatus status = NYdb::NDump::RemoveDirectoryRecursive(tableClient, schemeClient, path);
+ TStatus status = NConsoleClient::RemoveDirectoryRecursive(schemeClient, tableClient, path);
VerifyStatus(status, TStringBuilder() << "RemoveDirectoryRecursive, path: " << path.Quote());
LOG_DEBUG("Directory is removed recursively, path: " << path.Quote());
}
diff --git a/ydb/public/lib/ydb_cli/common/CMakeLists.darwin.txt b/ydb/public/lib/ydb_cli/common/CMakeLists.darwin.txt
index a02c35983f4..f37397e584c 100644
--- a/ydb/public/lib/ydb_cli/common/CMakeLists.darwin.txt
+++ b/ydb/public/lib/ydb_cli/common/CMakeLists.darwin.txt
@@ -22,6 +22,9 @@ target_link_libraries(common PUBLIC
cpp-client-draft
cpp-client-ydb_result
cpp-client-ydb_scheme
+ cpp-client-ydb_table
+ cpp-client-ydb_topic
+ cpp-client-ydb_types
client-ydb_types-credentials
tools-enum_parser-enum_serialization_runtime
)
@@ -41,6 +44,8 @@ target_sources(common PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/profile_manager.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/query_stats.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_list.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_remove.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/retry_func.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/root.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/scheme_printers.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/tabbed_table.cpp
diff --git a/ydb/public/lib/ydb_cli/common/CMakeLists.linux-aarch64.txt b/ydb/public/lib/ydb_cli/common/CMakeLists.linux-aarch64.txt
index de4553e6944..fe7df37e650 100644
--- a/ydb/public/lib/ydb_cli/common/CMakeLists.linux-aarch64.txt
+++ b/ydb/public/lib/ydb_cli/common/CMakeLists.linux-aarch64.txt
@@ -23,6 +23,9 @@ target_link_libraries(common PUBLIC
cpp-client-draft
cpp-client-ydb_result
cpp-client-ydb_scheme
+ cpp-client-ydb_table
+ cpp-client-ydb_topic
+ cpp-client-ydb_types
client-ydb_types-credentials
tools-enum_parser-enum_serialization_runtime
)
@@ -42,6 +45,8 @@ target_sources(common PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/profile_manager.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/query_stats.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_list.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_remove.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/retry_func.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/root.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/scheme_printers.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/tabbed_table.cpp
diff --git a/ydb/public/lib/ydb_cli/common/CMakeLists.linux.txt b/ydb/public/lib/ydb_cli/common/CMakeLists.linux.txt
index de4553e6944..fe7df37e650 100644
--- a/ydb/public/lib/ydb_cli/common/CMakeLists.linux.txt
+++ b/ydb/public/lib/ydb_cli/common/CMakeLists.linux.txt
@@ -23,6 +23,9 @@ target_link_libraries(common PUBLIC
cpp-client-draft
cpp-client-ydb_result
cpp-client-ydb_scheme
+ cpp-client-ydb_table
+ cpp-client-ydb_topic
+ cpp-client-ydb_types
client-ydb_types-credentials
tools-enum_parser-enum_serialization_runtime
)
@@ -42,6 +45,8 @@ target_sources(common PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/profile_manager.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/query_stats.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_list.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_remove.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/retry_func.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/root.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/scheme_printers.cpp
${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/tabbed_table.cpp
diff --git a/ydb/public/lib/ydb_cli/common/recursive_list.cpp b/ydb/public/lib/ydb_cli/common/recursive_list.cpp
index 3decf4fb56c..f3bd133e16e 100644
--- a/ydb/public/lib/ydb_cli/common/recursive_list.cpp
+++ b/ydb/public/lib/ydb_cli/common/recursive_list.cpp
@@ -2,8 +2,7 @@
#include <util/string/join.h>
-namespace NYdb {
-namespace NConsoleClient {
+namespace NYdb::NConsoleClient {
using namespace NScheme;
@@ -16,9 +15,9 @@ namespace {
}
TStatus RecursiveList(TVector<TSchemeEntry>& dst, TSchemeClient& client,
- const TString& path, const TRecursiveListSettings& settings, bool addSelf = false) {
-
- auto list = client.ListDirectory(path, settings.ListDirectorySettings_).GetValueSync();
+ const TString& path, const TRecursiveListSettings& settings, bool addSelf = false)
+ {
+ auto list = client.ListDirectory(path, settings.ListDirectorySettings_).ExtractValueSync();
if (!list.IsSuccess()) {
return list;
}
@@ -57,12 +56,11 @@ namespace {
} // anonymous
TRecursiveListResult RecursiveList(TSchemeClient& client, const TString& path,
- const TRecursiveListSettings& settings, bool addSelf) {
-
+ const TRecursiveListSettings& settings, bool addSelf)
+{
TVector<TSchemeEntry> entries;
auto status = RecursiveList(entries, client, path, settings, addSelf);
return {entries, status};
}
}
-}
diff --git a/ydb/public/lib/ydb_cli/common/recursive_list.h b/ydb/public/lib/ydb_cli/common/recursive_list.h
index 3448c00f9b7..7168a962f7f 100644
--- a/ydb/public/lib/ydb_cli/common/recursive_list.h
+++ b/ydb/public/lib/ydb_cli/common/recursive_list.h
@@ -4,8 +4,7 @@
#include <util/generic/vector.h>
-namespace NYdb {
-namespace NConsoleClient {
+namespace NYdb::NConsoleClient {
struct TRecursiveListSettings {
using TSelf = TRecursiveListSettings;
@@ -30,4 +29,3 @@ TRecursiveListResult RecursiveList(NScheme::TSchemeClient& client, const TString
const TRecursiveListSettings& settings = {}, bool addSelf = true);
}
-}
diff --git a/ydb/public/lib/ydb_cli/common/recursive_remove.cpp b/ydb/public/lib/ydb_cli/common/recursive_remove.cpp
new file mode 100644
index 00000000000..1fbde05e4e8
--- /dev/null
+++ b/ydb/public/lib/ydb_cli/common/recursive_remove.cpp
@@ -0,0 +1,118 @@
+#include "recursive_remove.h"
+
+#include <ydb/public/lib/ydb_cli/common/recursive_list.h>
+#include <ydb/public/lib/ydb_cli/common/retry_func.h>
+
+#include <util/string/builder.h>
+#include <util/system/type_name.h>
+
+namespace NYdb::NConsoleClient {
+
+using namespace NScheme;
+using namespace NTable;
+using namespace NTopic;
+
+TStatus RemoveDirectory(TSchemeClient& client, const TString& path, const TRemoveDirectorySettings& settings) {
+ return RetryFunction([&]() -> TStatus {
+ return client.RemoveDirectory(path, settings).ExtractValueSync();
+ });
+}
+
+TStatus RemoveTable(TTableClient& client, const TString& path, const TDropTableSettings& settings) {
+ return client.RetryOperationSync([path, settings](TSession session) {
+ return session.DropTable(path, settings).ExtractValueSync();
+ });
+}
+
+TStatus RemoveTopic(TTopicClient& client, const TString& path, const TDropTopicSettings& settings) {
+ return RetryFunction([&]() -> TStatus {
+ return client.DropTopic(path, settings).ExtractValueSync();
+ });
+}
+
+NYql::TIssues MakeIssues(const TString& error) {
+ NYql::TIssues issues;
+ issues.AddIssue(NYql::TIssue(error));
+ return issues;
+}
+
+template <typename TClient, typename TSettings>
+using TRemoveFunc = TStatus(*)(TClient&, const TString&, const TSettings&);
+
+template <typename TClient, typename TSettings>
+TStatus Remove(TRemoveFunc<TClient, TSettings> func, TClient* client, const TString& path, const TRemoveDirectorySettings& settings) {
+ if (!client) {
+ return TStatus(EStatus::GENERIC_ERROR, MakeIssues(TStringBuilder()
+ << TypeName<TClient>() << " not specified"));
+ }
+
+ return func(*client, path, TSettings(settings));
+}
+
+TStatus RemoveDirectoryRecursive(
+ TSchemeClient& schemeClient,
+ TTableClient* tableClient,
+ TTopicClient* topicClient,
+ const TString& path,
+ const TRemoveDirectorySettings& settings,
+ bool removeSelf)
+{
+ auto recursiveListResult = RecursiveList(schemeClient, path, {}, removeSelf);
+ if (!recursiveListResult.Status.IsSuccess()) {
+ return recursiveListResult.Status;
+ }
+
+ // output order is: Root, Recursive(children)...
+ // we need to reverse it to delete recursively
+ for (auto it = recursiveListResult.Entries.rbegin(); it != recursiveListResult.Entries.rend(); ++it) {
+ const auto& entry = *it;
+ switch (entry.Type) {
+ case ESchemeEntryType::Directory:
+ if (auto result = Remove(&RemoveDirectory, &schemeClient, entry.Name, settings); !result.IsSuccess()) {
+ return result;
+ }
+ break;
+
+ case ESchemeEntryType::Table:
+ if (auto result = Remove(&RemoveTable, tableClient, entry.Name, settings); !result.IsSuccess()) {
+ return result;
+ }
+ break;
+
+ case ESchemeEntryType::Topic:
+ if (auto result = Remove(&RemoveTopic, topicClient, entry.Name, settings); !result.IsSuccess()) {
+ return result;
+ }
+ break;
+
+ default:
+ return TStatus(EStatus::UNSUPPORTED, MakeIssues(TStringBuilder()
+ << "Unsupported entry type: " << entry.Type));
+ }
+ }
+
+ return TStatus(EStatus::SUCCESS, {});
+}
+
+TStatus RemoveDirectoryRecursive(
+ TSchemeClient& schemeClient,
+ TTableClient& tableClient,
+ const TString& path,
+ const TRemoveDirectorySettings& settings,
+ bool removeSelf)
+{
+ return RemoveDirectoryRecursive(schemeClient, &tableClient, nullptr, path, settings, removeSelf);
+}
+
+TStatus RemoveDirectoryRecursive(
+ TSchemeClient& schemeClient,
+ TTableClient& tableClient,
+ TTopicClient& topicClient,
+ const TString& path,
+ const TRemoveDirectorySettings& settings,
+ bool removeSelf)
+{
+ return RemoveDirectoryRecursive(schemeClient, &tableClient, &topicClient, path, settings, removeSelf);
+}
+
+}
diff --git a/ydb/public/lib/ydb_cli/common/recursive_remove.h b/ydb/public/lib/ydb_cli/common/recursive_remove.h
new file mode 100644
index 00000000000..12108b3fd0d
--- /dev/null
+++ b/ydb/public/lib/ydb_cli/common/recursive_remove.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h>
+#include <ydb/public/sdk/cpp/client/ydb_table/table.h>
+#include <ydb/public/sdk/cpp/client/ydb_topic/topic.h>
+
+namespace NYdb::NConsoleClient {
+
+TStatus RemoveDirectoryRecursive(
+ NScheme::TSchemeClient& schemeClient,
+ NTable::TTableClient& tableClient,
+ const TString& path,
+ const NScheme::TRemoveDirectorySettings& settings = {},
+ bool removeSelf = true);
+
+TStatus RemoveDirectoryRecursive(
+ NScheme::TSchemeClient& schemeClient,
+ NTable::TTableClient& tableClient,
+ NTopic::TTopicClient& topicClient,
+ const TString& path,
+ const NScheme::TRemoveDirectorySettings& settings = {},
+ bool removeSelf = true);
+
+}
diff --git a/ydb/public/lib/ydb_cli/common/retry_func.cpp b/ydb/public/lib/ydb_cli/common/retry_func.cpp
new file mode 100644
index 00000000000..d9538263f4a
--- /dev/null
+++ b/ydb/public/lib/ydb_cli/common/retry_func.cpp
@@ -0,0 +1,10 @@
+#include "retry_func.h"
+
+namespace NYdb::NConsoleClient {
+
+void ExponentialBackoff(TDuration& sleep, TDuration max) {
+ Sleep(sleep);
+ sleep = Min(sleep * 2, max);
+}
+
+}
diff --git a/ydb/public/lib/ydb_cli/common/retry_func.h b/ydb/public/lib/ydb_cli/common/retry_func.h
new file mode 100644
index 00000000000..85a2fd7c8cf
--- /dev/null
+++ b/ydb/public/lib/ydb_cli/common/retry_func.h
@@ -0,0 +1,46 @@
+#pragma once
+
+#include <ydb/public/sdk/cpp/client/ydb_types/status_codes.h>
+
+#include <util/datetime/base.h>
+
+namespace NYdb::NConsoleClient {
+
+void ExponentialBackoff(TDuration& sleep, TDuration max = TDuration::Minutes(5));
+
+// function must return TStatus or derived struct
+// function must be re-invokable
+template <typename TFunction>
+decltype(auto) RetryFunction(TFunction func, ui32 maxRetries = 10, TDuration retrySleep = TDuration::MilliSeconds(500)) {
+ for (ui32 retryNumber = 0; retryNumber <= maxRetries; ++retryNumber) {
+ auto result = func();
+
+ if (result.IsSuccess()) {
+ return result;
+ }
+
+ if (retryNumber == maxRetries) {
+ return result;
+ }
+
+ switch (result.GetStatus()) {
+ case EStatus::ABORTED:
+ break;
+
+ case EStatus::UNAVAILABLE:
+ case EStatus::OVERLOADED:
+ case EStatus::TRANSPORT_UNAVAILABLE:
+ case EStatus::CLIENT_RESOURCE_EXHAUSTED:
+ ExponentialBackoff(retrySleep);
+ break;
+
+ default:
+ return result;
+ }
+ }
+
+ // unreachable
+ return func();
+}
+
+}
diff --git a/ydb/public/lib/ydb_cli/dump/restore_impl.cpp b/ydb/public/lib/ydb_cli/dump/restore_impl.cpp
index 39ba3a6c699..6ee86826fc8 100644
--- a/ydb/public/lib/ydb_cli/dump/restore_impl.cpp
+++ b/ydb/public/lib/ydb_cli/dump/restore_impl.cpp
@@ -4,7 +4,8 @@
#include <ydb/public/api/protos/ydb_table.pb.h>
#include <ydb/public/sdk/cpp/client/ydb_proto/accessor.h>
-#include <ydb/public/lib/ydb_cli/common/recursive_list.h>
+#include <ydb/public/lib/ydb_cli/common/recursive_remove.h>
+#include <ydb/public/lib/ydb_cli/common/retry_func.h>
#include <ydb/public/lib/ydb_cli/dump/util/util.h>
#include <util/generic/hash.h>
@@ -65,7 +66,7 @@ bool HasRunningIndexBuilds(TOperationClient& client, const TString& dbPath) {
case EStatus::CLIENT_RESOURCE_EXHAUSTED:
case EStatus::UNAVAILABLE:
case EStatus::TRANSPORT_UNAVAILABLE:
- ExponentialBackoff(retrySleep);
+ NConsoleClient::ExponentialBackoff(retrySleep);
break;
default:
Y_ENSURE(false, "Unexpected status while trying to list operations: " << operations.GetStatus());
@@ -160,7 +161,7 @@ TRestoreResult TRestoreClient::Restore(const TString& fsPath, const TString& dbP
switch (entry.Type) {
case ESchemeEntryType::Directory: {
- auto result = RemoveDirectoryRecursive(TableClient, SchemeClient, fullPath, {}, true);
+ auto result = NConsoleClient::RemoveDirectoryRecursive(SchemeClient, TableClient, fullPath);
if (!result.IsSuccess()) {
return restoreResult;
}
diff --git a/ydb/public/lib/ydb_cli/dump/restore_import_data.cpp b/ydb/public/lib/ydb_cli/dump/restore_import_data.cpp
index 817aa76eea3..b6a9f412af1 100644
--- a/ydb/public/lib/ydb_cli/dump/restore_import_data.cpp
+++ b/ydb/public/lib/ydb_cli/dump/restore_import_data.cpp
@@ -1,5 +1,6 @@
#include "restore_import_data.h"
+#include <ydb/public/lib/ydb_cli/common/retry_func.h>
#include <ydb/public/lib/ydb_cli/dump/util/util.h>
#include <library/cpp/string_utils/quote/quote.h>
#include <library/cpp/bucket_quoter/bucket_quoter.h>
@@ -801,15 +802,15 @@ class TDataWriter: public NPrivate::IDataWriter {
case EStatus::OVERLOADED:
case EStatus::CLIENT_RESOURCE_EXHAUSTED:
- ExponentialBackoff(retrySleep);
+ NConsoleClient::ExponentialBackoff(retrySleep);
break;
case EStatus::UNAVAILABLE:
- ExponentialBackoff(retrySleep);
+ NConsoleClient::ExponentialBackoff(retrySleep);
break;
case EStatus::TRANSPORT_UNAVAILABLE:
- ExponentialBackoff(retrySleep);
+ NConsoleClient::ExponentialBackoff(retrySleep);
break;
default:
diff --git a/ydb/public/lib/ydb_cli/dump/util/util.cpp b/ydb/public/lib/ydb_cli/dump/util/util.cpp
index 37c8d4b646b..3b234dff5b1 100644
--- a/ydb/public/lib/ydb_cli/dump/util/util.cpp
+++ b/ydb/public/lib/ydb_cli/dump/util/util.cpp
@@ -1,62 +1,16 @@
#include "util.h"
-#include <ydb/public/lib/ydb_cli/common/recursive_list.h>
+#include <ydb/public/lib/ydb_cli/common/retry_func.h>
-#include <util/folder/path.h>
-
-namespace NYdb {
-namespace NDump {
+namespace NYdb::NDump {
using namespace NScheme;
using namespace NTable;
-namespace {
-
-// function must return TStatus or derived struct
-// function must be re-invokable
-template <typename TFunction>
-decltype(auto) RetryFunction(
- const TFunction& func,
- const ui32 maxRetries = 10,
- TDuration retrySleep = TDuration::MilliSeconds(500)) {
-
- for (ui32 retryNumber = 0; retryNumber <= maxRetries; ++retryNumber) {
- auto result = func();
-
- if (result.IsSuccess()) {
- return result;
- }
-
- if (retryNumber == maxRetries) {
- return result;
- }
-
- switch (result.GetStatus()) {
- case EStatus::ABORTED:
- break;
-
- case EStatus::UNAVAILABLE:
- case EStatus::OVERLOADED:
- case EStatus::TRANSPORT_UNAVAILABLE:
- case EStatus::CLIENT_RESOURCE_EXHAUSTED: {
- ExponentialBackoff(retrySleep);
- break;
- }
- default:
- return result;
- }
-
- }
- // unreachable
- return func();
-}
-
-} // anonymous
-
TStatus DescribeTable(TTableClient& tableClient, const TString& path, TMaybe<TTableDescription>& out) {
auto func = [&path, &out](TSession session) {
auto settings = TDescribeTableSettings().WithKeyShardBoundary(true);
- auto result = session.DescribeTable(path, settings).GetValueSync();
+ auto result = session.DescribeTable(path, settings).ExtractValueSync();
if (result.IsSuccess()) {
out = result.GetTableDescription();
@@ -68,69 +22,16 @@ TStatus DescribeTable(TTableClient& tableClient, const TString& path, TMaybe<TTa
return tableClient.RetryOperationSync(func, TRetryOperationSettings().Idempotent(true));
}
-void ExponentialBackoff(TDuration& sleep, TDuration max) {
- Sleep(sleep);
- sleep = Min(sleep * 2, max);
-}
-
TDescribePathResult DescribePath(TSchemeClient& schemeClient, const TString& path, const TDescribePathSettings& settings) {
- return RetryFunction([&]() -> TDescribePathResult {
- return schemeClient.DescribePath(path, settings).GetValueSync();
+ return NConsoleClient::RetryFunction([&]() -> TDescribePathResult {
+ return schemeClient.DescribePath(path, settings).ExtractValueSync();
});
}
TStatus MakeDirectory(TSchemeClient& schemeClient, const TString& path, const TMakeDirectorySettings& settings) {
- return RetryFunction([&]() -> TStatus {
- return schemeClient.MakeDirectory(path, settings).GetValueSync();
- });
-}
-
-TStatus RemoveDirectory(TSchemeClient& schemeClient, const TString& path, const TRemoveDirectorySettings& settings) {
- return RetryFunction([&]() -> TStatus {
- return schemeClient.RemoveDirectory(path, settings).GetValueSync();
+ return NConsoleClient::RetryFunction([&]() -> TStatus {
+ return schemeClient.MakeDirectory(path, settings).ExtractValueSync();
});
}
-TStatus RemoveDirectoryRecursive(
- TTableClient& tableClient,
- TSchemeClient& schemeClient,
- const TString& path,
- const TRemoveDirectorySettings& settings,
- bool removeSelf) {
-
- auto recursiveListResult = NConsoleClient::RecursiveList(schemeClient, path, {}, removeSelf);
- if (!recursiveListResult.Status.IsSuccess()) {
- return recursiveListResult.Status;
- }
-
- // output order is: Root, Recursive(children)...
- // we need to reverse it to delete recursively
- for (auto it = recursiveListResult.Entries.rbegin(); it != recursiveListResult.Entries.rend(); ++it) {
- const auto& entry = *it;
- switch (entry.Type) {
- case ESchemeEntryType::Directory: {
- auto result = RemoveDirectory(schemeClient, entry.Name, settings);
- if (!result.IsSuccess()) {
- return result;
- }
- break;
- }
- case ESchemeEntryType::Table: {
- auto result = tableClient.RetryOperationSync([path = entry.Name](TSession session) {
- return session.DropTable(path).GetValueSync();
- });
- if (!result.IsSuccess()) {
- return result;
- }
- break;
- }
- default:
- return TStatus(EStatus::BAD_REQUEST, {});
- }
- }
-
- return TStatus(EStatus::SUCCESS, {});
}
-
-} // NDump
-} // NYdb
diff --git a/ydb/public/lib/ydb_cli/dump/util/util.h b/ydb/public/lib/ydb_cli/dump/util/util.h
index ae3635431f1..df9c1511549 100644
--- a/ydb/public/lib/ydb_cli/dump/util/util.h
+++ b/ydb/public/lib/ydb_cli/dump/util/util.h
@@ -7,8 +7,7 @@
#include <util/generic/maybe.h>
#include <util/string/builder.h>
-namespace NYdb {
-namespace NDump {
+namespace NYdb::NDump {
inline void AddPath(NYql::TIssues& issues, const TString& path) {
issues.AddIssue(NYql::TIssue(TStringBuilder() << "Path: " << path)
@@ -42,8 +41,6 @@ inline TResult Result(const TString& path, TStatus&& status) {
TStatus DescribeTable(NTable::TTableClient& tableClient, const TString& path, TMaybe<NTable::TTableDescription>& out);
-void ExponentialBackoff(TDuration& sleep, TDuration max = TDuration::Minutes(5));
-
NScheme::TDescribePathResult DescribePath(
NScheme::TSchemeClient& schemeClient,
const TString& path,
@@ -54,17 +51,4 @@ TStatus MakeDirectory(
const TString& path,
const NScheme::TMakeDirectorySettings& settings = {});
-TStatus RemoveDirectory(
- NScheme::TSchemeClient& schemeClient,
- const TString& path,
- const NScheme::TRemoveDirectorySettings& settings = {});
-
-TStatus RemoveDirectoryRecursive(
- NTable::TTableClient& tableClient,
- NScheme::TSchemeClient& schemeClient,
- const TString& path,
- const NScheme::TRemoveDirectorySettings& settings = {},
- bool removeSelf = true);
-
-} // NDump
-} // NYdb
+}