diff options
author | ilnaz <ilnaz@ydb.tech> | 2023-03-01 16:07:30 +0300 |
---|---|---|
committer | ilnaz <ilnaz@ydb.tech> | 2023-03-01 16:07:30 +0300 |
commit | 7eb33768269c07d85e53206e49efbd3ae1699163 (patch) | |
tree | c19c76087347b45fa79c61c91a0ac5a89e7a8db4 | |
parent | 7b8096097dc79f46e096d02b56cddc7b50704bc7 (diff) | |
download | ydb-7eb33768269c07d85e53206e49efbd3ae1699163.tar.gz |
Recursive remove
-rw-r--r-- | ydb/library/backup/CMakeLists.darwin.txt | 2 | ||||
-rw-r--r-- | ydb/library/backup/CMakeLists.linux-aarch64.txt | 2 | ||||
-rw-r--r-- | ydb/library/backup/CMakeLists.linux.txt | 2 | ||||
-rw-r--r-- | ydb/library/backup/backup.cpp | 4 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/common/CMakeLists.darwin.txt | 5 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/common/CMakeLists.linux-aarch64.txt | 5 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/common/CMakeLists.linux.txt | 5 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/common/recursive_list.cpp | 14 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/common/recursive_list.h | 4 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/common/recursive_remove.cpp | 118 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/common/recursive_remove.h | 24 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/common/retry_func.cpp | 10 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/common/retry_func.h | 46 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/dump/restore_impl.cpp | 7 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/dump/restore_import_data.cpp | 7 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/dump/util/util.cpp | 113 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/dump/util/util.h | 20 |
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 +} |