diff options
author | Vasily Gerasimov <UgnineSirdis@gmail.com> | 2022-05-16 17:50:30 +0300 |
---|---|---|
committer | Vasily Gerasimov <UgnineSirdis@gmail.com> | 2022-05-16 17:50:30 +0300 |
commit | a217465e504309f491e4bfc1662393cf7fedd3cb (patch) | |
tree | 1c24269f6ee7996ffb694ee178ec8940471d3098 | |
parent | 935177fefd68379d031dc5b63fd37646cc0f1796 (diff) | |
download | ydb-a217465e504309f491e4bfc1662393cf7fedd3cb.tar.gz |
YQ-1101 Prohibit deletion of query in running state
Add validator to DeleteQuery
Test
ref:ae3cf85fb4bfa71f7bf2176ce2c8249af0d6d283
3 files changed, 54 insertions, 0 deletions
diff --git a/ydb/core/yq/libs/control_plane_storage/validators.cpp b/ydb/core/yq/libs/control_plane_storage/validators.cpp index 946ecfc3bd..16fcb7f26b 100644 --- a/ydb/core/yq/libs/control_plane_storage/validators.cpp +++ b/ydb/core/yq/libs/control_plane_storage/validators.cpp @@ -360,4 +360,45 @@ TValidationQuery CreateTtlValidator(const TString& tableName, return {query.Sql, query.Params, validator}; } +TValidationQuery CreateQueryComputeStatusValidator(const std::vector<YandexQuery::QueryMeta::ComputeStatus>& computeStatuses, + const TString& scope, + const TString& id, + const TString& error, + const TString& tablePathPrefix) { + TSqlQueryBuilder queryBuilder(tablePathPrefix, "ComputeStatusValidator"); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("query_id", id); + + queryBuilder.AddText( + "SELECT `" QUERY_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" + ); + + auto validator = [error, computeStatuses](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets.front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Query does not exist or permission denied. Please check the id of the query or your access rights"; + } + + YandexQuery::Query query; + if (!query.ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; + } + + const YandexQuery::QueryMeta::ComputeStatus status = query.meta().status(); + if (!IsIn(computeStatuses, status)) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; + } + + return false; + }; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + } // namespace NYq diff --git a/ydb/core/yq/libs/control_plane_storage/validators.h b/ydb/core/yq/libs/control_plane_storage/validators.h index 0b1fc32741..121ebbabef 100644 --- a/ydb/core/yq/libs/control_plane_storage/validators.h +++ b/ydb/core/yq/libs/control_plane_storage/validators.h @@ -94,6 +94,12 @@ TValidationQuery CreateTtlValidator(const TString& tableName, const TString& error, const TString& tablePathPrefix); +TValidationQuery CreateQueryComputeStatusValidator(const std::vector<YandexQuery::QueryMeta::ComputeStatus>& computeStatuses, + const TString& scope, + const TString& id, + const TString& error, + const TString& tablePathPrefix); + template<typename T> TValidationQuery CreateIdempotencyKeyValidator(const TString& scope, const TString& idempotencyKey, diff --git a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp index 516af2c92b..c283e85196 100644 --- a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp +++ b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp @@ -1180,6 +1180,13 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDeleteQuery response, YdbConnection->TablePathPrefix)); + validators.push_back(CreateQueryComputeStatusValidator( + { YandexQuery::QueryMeta::STARTING, YandexQuery::QueryMeta::ABORTED_BY_USER, YandexQuery::QueryMeta::ABORTED_BY_SYSTEM, YandexQuery::QueryMeta::COMPLETED, YandexQuery::QueryMeta::FAILED }, + scope, + queryId, + "Can't delete running query", + YdbConnection->TablePathPrefix)); + const auto query = queryBuilder.Build(); auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; auto result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); |