diff --git a/ydb/apps/ydb/CHANGELOG.md b/ydb/apps/ydb/CHANGELOG.md index 8a29d5e54c63..ce9e5c396d2c 100644 --- a/ydb/apps/ydb/CHANGELOG.md +++ b/ydb/apps/ydb/CHANGELOG.md @@ -1,4 +1,6 @@ +* Support coordination nodes in `ydb scheme rmdir --recursive`. * Fixed return code of command `ydb workload * run --check-canonical` for the case when benchmark query results differ from canonical ones. + ## 2.20.0 ## * Added support for dual configuration mode in the `ydb admin cluster config fetch` command, allowing it to handle separate cluster and storage config sections. diff --git a/ydb/public/lib/ydb_cli/commands/ydb_service_scheme.cpp b/ydb/public/lib/ydb_cli/commands/ydb_service_scheme.cpp index 13963e5f1ea0..8c34c319457c 100644 --- a/ydb/public/lib/ydb_cli/commands/ydb_service_scheme.cpp +++ b/ydb/public/lib/ydb_cli/commands/ydb_service_scheme.cpp @@ -90,8 +90,9 @@ int TCommandRemoveDirectory::Run(TConfig& config) { NTable::TTableClient tableClient(driver); NTopic::TTopicClient topicClient(driver); NQuery::TQueryClient queryClient(driver); + NCoordination::TClient coordinationClient(driver); const auto prompt = Prompt.GetOrElse(ERecursiveRemovePrompt::Once); - NStatusHelpers::ThrowOnErrorOrPrintIssues(RemoveDirectoryRecursive(schemeClient, tableClient, &topicClient, &queryClient, Path, prompt, settings)); + NStatusHelpers::ThrowOnErrorOrPrintIssues(RemoveDirectoryRecursive(schemeClient, tableClient, &topicClient, &queryClient, &coordinationClient, Path, prompt, settings)); } else { if (Prompt) { if (!NConsoleClient::Prompt(*Prompt, Path, NScheme::ESchemeEntryType::Directory)) { diff --git a/ydb/public/lib/ydb_cli/commands/ydb_workload.cpp b/ydb/public/lib/ydb_cli/commands/ydb_workload.cpp index bc2f16e3d632..20b65ca8b3f2 100644 --- a/ydb/public/lib/ydb_cli/commands/ydb_workload.cpp +++ b/ydb/public/lib/ydb_cli/commands/ydb_workload.cpp @@ -397,7 +397,7 @@ void TWorkloadCommandBase::CleanTables(NYdbWorkload::IWorkloadQueryGenerator& wo if (DryRun) { Cout << "Remove " << fullPath << Endl; } else { - NStatusHelpers::ThrowOnErrorOrPrintIssues(RemovePathRecursive(*SchemeClient, *TableClient, TopicClient.Get(), QueryClient.Get(), fullPath, ERecursiveRemovePrompt::Never, settings)); + NStatusHelpers::ThrowOnErrorOrPrintIssues(RemovePathRecursive(*SchemeClient, *TableClient, TopicClient.Get(), QueryClient.Get(), nullptr, fullPath, ERecursiveRemovePrompt::Never, settings)); } Cout << "Remove path " << path << "...Ok" << Endl; } diff --git a/ydb/public/lib/ydb_cli/common/recursive_remove.cpp b/ydb/public/lib/ydb_cli/common/recursive_remove.cpp index 38a49c68ba14..1950ad902f0a 100644 --- a/ydb/public/lib/ydb_cli/common/recursive_remove.cpp +++ b/ydb/public/lib/ydb_cli/common/recursive_remove.cpp @@ -70,6 +70,12 @@ TStatus RemoveTopic(TTopicClient& client, const TString& path, const TDropTopicS }); } +TStatus RemoveCoordinationNode(NCoordination::TClient& client, const TString& path, const NCoordination::TDropNodeSettings& settings) { + return RetryFunction([&]() -> TStatus { + return client.DropNode(path, settings).ExtractValueSync(); + }); +} + NYdb::NIssue::TIssues MakeIssues(const TString& error) { NYdb::NIssue::TIssues issues; issues.AddIssue(NYdb::NIssue::TIssue(error)); @@ -121,8 +127,8 @@ TStatus Remove(TRemoveFunc func, TSchemeClient& schemeClient } TStatus Remove( - TSchemeClient& schemeClient, TTableClient* tableClient, TTopicClient* topicClient, NQuery::TQueryClient* queryClient, const ESchemeEntryType type, - const TString& path, ERecursiveRemovePrompt prompt, const TRemoveDirectorySettings& settings) + TSchemeClient& schemeClient, TTableClient* tableClient, TTopicClient* topicClient, NQuery::TQueryClient* queryClient, NCoordination::TClient* coordinationClient, + const ESchemeEntryType type, const TString& path, ERecursiveRemovePrompt prompt, const TRemoveDirectorySettings& settings) { switch (type) { case ESchemeEntryType::Directory: @@ -143,6 +149,8 @@ TStatus Remove( return Remove(&RemoveExternalTable, schemeClient, tableClient, type, path, prompt, settings); case ESchemeEntryType::View: return Remove(&RemoveView, schemeClient, queryClient, type, path, prompt, settings); + case ESchemeEntryType::CoordinationNode: + return Remove(&RemoveCoordinationNode, schemeClient, coordinationClient, type, path, prompt, settings); default: return TStatus(EStatus::UNSUPPORTED, MakeIssues(TStringBuilder() @@ -155,6 +163,7 @@ TStatus RemoveDirectoryRecursive( TTableClient* tableClient, TTopicClient* topicClient, NQuery::TQueryClient* queryClient, + NCoordination::TClient* coordinationClient, const TString& path, ERecursiveRemovePrompt prompt, const TRemoveDirectorySettings& settings, @@ -179,7 +188,7 @@ TStatus RemoveDirectoryRecursive( // 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) { - if (auto result = Remove(schemeClient, tableClient, topicClient, queryClient, it->Type, TString{it->Name}, prompt, settings); !result.IsSuccess()) { + if (auto result = Remove(schemeClient, tableClient, topicClient, queryClient, coordinationClient, it->Type, TString{it->Name}, prompt, settings); !result.IsSuccess()) { return result; } if (createProgressBar) { @@ -198,7 +207,7 @@ TStatus RemoveDirectoryRecursive( bool removeSelf, bool createProgressBar) { - return RemoveDirectoryRecursive(schemeClient, &tableClient, nullptr, nullptr, path, ERecursiveRemovePrompt::Never, settings, removeSelf, createProgressBar); + return RemoveDirectoryRecursive(schemeClient, &tableClient, nullptr, nullptr, nullptr, path, ERecursiveRemovePrompt::Never, settings, removeSelf, createProgressBar); } TStatus RemoveDirectoryRecursive( @@ -206,16 +215,17 @@ TStatus RemoveDirectoryRecursive( TTableClient& tableClient, TTopicClient* topicClient, NQuery::TQueryClient* queryClient, + NCoordination::TClient* coordinationClient, const TString& path, ERecursiveRemovePrompt prompt, const TRemoveDirectorySettings& settings, bool removeSelf, bool createProgressBar) { - return RemoveDirectoryRecursive(schemeClient, &tableClient, topicClient, queryClient, path, prompt, settings, removeSelf, createProgressBar); + return RemoveDirectoryRecursive(schemeClient, &tableClient, topicClient, queryClient, coordinationClient, path, prompt, settings, removeSelf, createProgressBar); } -NYdb::TStatus RemovePathRecursive(NScheme::TSchemeClient& schemeClient, NTable::TTableClient& tableClient, NTopic::TTopicClient* topicClient, NQuery::TQueryClient* queryClient, const TString& path, ERecursiveRemovePrompt prompt, const TRemovePathRecursiveSettings& settings /*= {}*/, bool createProgressBar /*= true*/) { +NYdb::TStatus RemovePathRecursive(NScheme::TSchemeClient& schemeClient, NTable::TTableClient& tableClient, NTopic::TTopicClient* topicClient, NQuery::TQueryClient* queryClient, NCoordination::TClient* coordinationClient, const TString& path, ERecursiveRemovePrompt prompt, const TRemovePathRecursiveSettings& settings /*= {}*/, bool createProgressBar /*= true*/) { auto entity = schemeClient.DescribePath(path).ExtractValueSync(); if (!entity.IsSuccess()) { if (settings.NotExistsIsOk_ && entity.GetStatus() == EStatus::SCHEME_ERROR && entity.GetIssues().ToString().find("Path not found") != TString::npos) { @@ -226,9 +236,9 @@ NYdb::TStatus RemovePathRecursive(NScheme::TSchemeClient& schemeClient, NTable:: switch (entity.GetEntry().Type) { case ESchemeEntryType::Directory: case ESchemeEntryType::ColumnStore: - return RemoveDirectoryRecursive(schemeClient, tableClient, topicClient, queryClient, path, prompt, settings, true, createProgressBar); + return RemoveDirectoryRecursive(schemeClient, tableClient, topicClient, queryClient, coordinationClient, path, prompt, settings, true, createProgressBar); default: - return Remove(schemeClient, &tableClient, topicClient, queryClient, entity.GetEntry().Type, path, prompt, settings); + return Remove(schemeClient, &tableClient, topicClient, queryClient, coordinationClient, entity.GetEntry().Type, path, prompt, settings); } } } diff --git a/ydb/public/lib/ydb_cli/common/recursive_remove.h b/ydb/public/lib/ydb_cli/common/recursive_remove.h index 08526275306c..ed990662e360 100644 --- a/ydb/public/lib/ydb_cli/common/recursive_remove.h +++ b/ydb/public/lib/ydb_cli/common/recursive_remove.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -32,6 +33,7 @@ TStatus RemoveDirectoryRecursive( NTable::TTableClient& tableClient, NTopic::TTopicClient* topicClient, NQuery::TQueryClient* queryClient, + NCoordination::TClient* coordinationClient, const TString& path, ERecursiveRemovePrompt prompt, const NScheme::TRemoveDirectorySettings& settings = {}, @@ -43,6 +45,7 @@ TStatus RemovePathRecursive( NTable::TTableClient& tableClient, NTopic::TTopicClient* topicClient, NQuery::TQueryClient* queryClient, + NCoordination::TClient* coordinationClient, const TString& path, ERecursiveRemovePrompt prompt, const TRemovePathRecursiveSettings& settings = {}, diff --git a/ydb/public/lib/ydb_cli/dump/restore_impl.cpp b/ydb/public/lib/ydb_cli/dump/restore_impl.cpp index f1b194edda5c..2d0b20368a66 100644 --- a/ydb/public/lib/ydb_cli/dump/restore_impl.cpp +++ b/ydb/public/lib/ydb_cli/dump/restore_impl.cpp @@ -497,7 +497,7 @@ TRestoreResult TRestoreClient::Restore(const TString& fsPath, const TString& dbP switch (entry.Type) { case ESchemeEntryType::Directory: - result = RemoveDirectoryRecursive(SchemeClient, TableClient, nullptr, &QueryClient, + result = RemoveDirectoryRecursive(SchemeClient, TableClient, &TopicClient, &QueryClient, &CoordinationNodeClient, TString{fullPath}, ERecursiveRemovePrompt::Never, {}, true, false); break; case ESchemeEntryType::Table: diff --git a/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/coordination/coordination.h b/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/coordination/coordination.h index 9aeff0a3e6c8..bb03bc4e4c3e 100644 --- a/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/coordination/coordination.h +++ b/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/coordination/coordination.h @@ -198,7 +198,9 @@ struct TCreateNodeSettings : public TNodeSettings { TCreateNodeSettings(const Ydb::Coordination::Config& config); }; struct TAlterNodeSettings : public TNodeSettings { }; -struct TDropNodeSettings : public TOperationRequestSettings { }; +struct TDropNodeSettings : public TOperationRequestSettings { + using TOperationRequestSettings::TOperationRequestSettings; +}; struct TDescribeNodeSettings : public TOperationRequestSettings { }; ////////////////////////////////////////////////////////////////////////////////