aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVasily Gerasimov <UgnineSirdis@gmail.com>2022-05-16 17:50:30 +0300
committerVasily Gerasimov <UgnineSirdis@gmail.com>2022-05-16 17:50:30 +0300
commita217465e504309f491e4bfc1662393cf7fedd3cb (patch)
tree1c24269f6ee7996ffb694ee178ec8940471d3098
parent935177fefd68379d031dc5b63fd37646cc0f1796 (diff)
downloadydb-a217465e504309f491e4bfc1662393cf7fedd3cb.tar.gz
YQ-1101 Prohibit deletion of query in running state
Add validator to DeleteQuery Test ref:ae3cf85fb4bfa71f7bf2176ce2c8249af0d6d283
-rw-r--r--ydb/core/yq/libs/control_plane_storage/validators.cpp41
-rw-r--r--ydb/core/yq/libs/control_plane_storage/validators.h6
-rw-r--r--ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp7
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);