summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVasily Gerasimov <[email protected]>2024-01-04 18:07:53 +0200
committerGitHub <[email protected]>2024-01-04 18:07:53 +0200
commit72fc8a4cf59229cd0cfc6ed808cf8b2c048b05a7 (patch)
treeb7f5e0cccdd869f0623de06b6f84e216ab1275b7
parent1da328951d49e9dbcbb1d682d97a54650074d739 (diff)
Support DDL operations (including IF EXISTS/IF NOT EXISTS) for objects with type secret (#838)
-rw-r--r--ydb/core/kqp/compile_service/kqp_compile_actor.cpp2
-rw-r--r--ydb/core/kqp/executer_actor/kqp_scheme_executer.cpp2
-rw-r--r--ydb/core/kqp/executer_actor/ut/kqp_executer_ut.cpp2
-rw-r--r--ydb/core/kqp/gateway/behaviour/external_data_source/manager.cpp2
-rw-r--r--ydb/core/kqp/gateway/behaviour/external_data_source/manager.h2
-rw-r--r--ydb/core/kqp/gateway/behaviour/tablestore/manager.cpp2
-rw-r--r--ydb/core/kqp/gateway/behaviour/tablestore/manager.h2
-rw-r--r--ydb/core/kqp/gateway/behaviour/view/manager.cpp5
-rw-r--r--ydb/core/kqp/gateway/behaviour/view/manager.h1
-rw-r--r--ydb/core/kqp/host/kqp_gateway_proxy.cpp3
-rw-r--r--ydb/core/kqp/host/kqp_host.cpp8
-rw-r--r--ydb/core/kqp/host/kqp_host.h3
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_provider.h10
-rw-r--r--ydb/core/kqp/session_actor/kqp_worker_actor.cpp2
-rw-r--r--ydb/core/kqp/ut/federated_query/generic/kqp_generic_provider_join_ut.cpp7
-rw-r--r--ydb/core/kqp/ut/federated_query/s3/kqp_federated_scheme_ut.cpp2
-rw-r--r--ydb/core/kqp/ut/indexes/kqp_indexes_ut.cpp2
-rw-r--r--ydb/core/kqp/ut/service/kqp_qs_queries_ut.cpp92
-rw-r--r--ydb/core/protos/kqp_physical.proto15
-rw-r--r--ydb/core/tx/tiering/rule/manager.cpp2
-rw-r--r--ydb/core/tx/tiering/rule/manager.h2
-rw-r--r--ydb/core/tx/tiering/tier/manager.cpp2
-rw-r--r--ydb/core/tx/tiering/tier/manager.h2
-rw-r--r--ydb/library/conclusion/result.h9
-rw-r--r--ydb/library/conclusion/status.h19
-rw-r--r--ydb/library/conclusion/ya.make1
-rw-r--r--ydb/services/ext_index/metadata/manager.cpp2
-rw-r--r--ydb/services/ext_index/metadata/manager.h2
-rw-r--r--ydb/services/ext_index/service/activation.cpp10
-rw-r--r--ydb/services/ext_index/service/activation.h10
-rw-r--r--ydb/services/ext_index/service/deleting.cpp4
-rw-r--r--ydb/services/ext_index/service/deleting.h8
-rw-r--r--ydb/services/ext_index/service/executor.cpp4
-rw-r--r--ydb/services/metadata/initializer/accessor_init.cpp2
-rw-r--r--ydb/services/metadata/initializer/accessor_init.h2
-rw-r--r--ydb/services/metadata/initializer/common.h6
-rw-r--r--ydb/services/metadata/initializer/manager.cpp2
-rw-r--r--ydb/services/metadata/initializer/manager.h2
-rw-r--r--ydb/services/metadata/manager/abstract.h2
-rw-r--r--ydb/services/metadata/manager/alter.h33
-rw-r--r--ydb/services/metadata/manager/generic_manager.h116
-rw-r--r--ydb/services/metadata/manager/modification.h22
-rw-r--r--ydb/services/metadata/request/common.h12
-rw-r--r--ydb/services/metadata/request/request_actor.h10
-rw-r--r--ydb/services/metadata/request/request_actor_cb.h24
-rw-r--r--ydb/services/metadata/secret/manager.cpp14
-rw-r--r--ydb/services/metadata/secret/manager.h10
47 files changed, 375 insertions, 123 deletions
diff --git a/ydb/core/kqp/compile_service/kqp_compile_actor.cpp b/ydb/core/kqp/compile_service/kqp_compile_actor.cpp
index 5741fe4cfc8..8f31da06827 100644
--- a/ydb/core/kqp/compile_service/kqp_compile_actor.cpp
+++ b/ydb/core/kqp/compile_service/kqp_compile_actor.cpp
@@ -184,7 +184,7 @@ private:
Config->FeatureFlags = AppData(ctx)->FeatureFlags;
KqpHost = CreateKqpHost(Gateway, QueryId.Cluster, QueryId.Database, Config, ModuleResolverState->ModuleResolver,
- FederatedQuerySetup, AppData(ctx)->FunctionRegistry, false, false, std::move(TempTablesState));
+ FederatedQuerySetup, UserToken, AppData(ctx)->FunctionRegistry, false, false, std::move(TempTablesState));
IKqpHost::TPrepareSettings prepareSettings;
prepareSettings.DocumentApiRestricted = QueryId.Settings.DocumentApiRestricted;
diff --git a/ydb/core/kqp/executer_actor/kqp_scheme_executer.cpp b/ydb/core/kqp/executer_actor/kqp_scheme_executer.cpp
index 97ea45997c5..450229c2f7b 100644
--- a/ydb/core/kqp/executer_actor/kqp_scheme_executer.cpp
+++ b/ydb/core/kqp/executer_actor/kqp_scheme_executer.cpp
@@ -259,7 +259,7 @@ public:
context.SetUserToken(*UserToken);
}
- auto resultFuture = cBehaviour->GetOperationsManager()->ExecutePrepared(schemeOp, cBehaviour, context);
+ auto resultFuture = cBehaviour->GetOperationsManager()->ExecutePrepared(schemeOp, SelfId().NodeId(), cBehaviour, context);
using TResultFuture = NThreading::TFuture<NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus>;
resultFuture.Subscribe([actorSystem, selfId](const TResultFuture& f) {
diff --git a/ydb/core/kqp/executer_actor/ut/kqp_executer_ut.cpp b/ydb/core/kqp/executer_actor/ut/kqp_executer_ut.cpp
index 062add1ddb2..f395537d694 100644
--- a/ydb/core/kqp/executer_actor/ut/kqp_executer_ut.cpp
+++ b/ydb/core/kqp/executer_actor/ut/kqp_executer_ut.cpp
@@ -28,7 +28,7 @@ NKqpProto::TKqpPhyTx BuildTxPlan(const TString& sql, TIntrusivePtr<IKqpGateway>
IModuleResolver::TPtr moduleResolver;
UNIT_ASSERT(GetYqlDefaultModuleResolver(moduleCtx, moduleResolver));
- auto qp = CreateKqpHost(gateway, cluster, "/Root", config, moduleResolver, NYql::IHTTPGateway::Make(), nullptr, false, false, nullptr, actorSystem);
+ auto qp = CreateKqpHost(gateway, cluster, "/Root", config, moduleResolver, NYql::IHTTPGateway::Make(), nullptr, nullptr, false, false, nullptr, actorSystem);
auto result = qp->SyncPrepareDataQuery(sql, IKqpHost::TPrepareSettings());
result.Issues().PrintTo(Cerr);
UNIT_ASSERT(result.Success());
diff --git a/ydb/core/kqp/gateway/behaviour/external_data_source/manager.cpp b/ydb/core/kqp/gateway/behaviour/external_data_source/manager.cpp
index 10797a6b64d..f13d1155d78 100644
--- a/ydb/core/kqp/gateway/behaviour/external_data_source/manager.cpp
+++ b/ydb/core/kqp/gateway/behaviour/external_data_source/manager.cpp
@@ -229,7 +229,7 @@ void TExternalDataSourceManager::PrepareDropExternalDataSource(NKqpProto::TKqpSc
}
NThreading::TFuture<NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus> TExternalDataSourceManager::ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
- const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& context) const {
+ const ui32 /*nodeId*/, const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& context) const {
using TRequest = TEvTxUserProxy::TEvProposeTransaction;
auto ev = MakeHolder<TRequest>();
diff --git a/ydb/core/kqp/gateway/behaviour/external_data_source/manager.h b/ydb/core/kqp/gateway/behaviour/external_data_source/manager.h
index fcf7e758286..83bc138b538 100644
--- a/ydb/core/kqp/gateway/behaviour/external_data_source/manager.h
+++ b/ydb/core/kqp/gateway/behaviour/external_data_source/manager.h
@@ -27,7 +27,7 @@ protected:
const NMetadata::IClassBehaviour::TPtr& manager, IOperationsManager::TInternalModificationContext& context) const override;
NThreading::TFuture<IOperationsManager::TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
- const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
+ const ui32 nodeId, const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
public:
using NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus;
diff --git a/ydb/core/kqp/gateway/behaviour/tablestore/manager.cpp b/ydb/core/kqp/gateway/behaviour/tablestore/manager.cpp
index 66d4fc26c97..844ef19344d 100644
--- a/ydb/core/kqp/gateway/behaviour/tablestore/manager.cpp
+++ b/ydb/core/kqp/gateway/behaviour/tablestore/manager.cpp
@@ -77,7 +77,7 @@ NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus TTableStoreM
}
NThreading::TFuture<NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus> TTableStoreManager::ExecutePrepared(const NKqpProto::TKqpSchemeOperation& /*schemeOperation*/,
- const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
+ const ui32 /*nodeId*/, const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
return NThreading::MakeFuture(NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus::Fail(
"Execution of prepare operations for TABLE objects is not supported"));
}
diff --git a/ydb/core/kqp/gateway/behaviour/tablestore/manager.h b/ydb/core/kqp/gateway/behaviour/tablestore/manager.h
index 58fd0e57f88..06c555cfaeb 100644
--- a/ydb/core/kqp/gateway/behaviour/tablestore/manager.h
+++ b/ydb/core/kqp/gateway/behaviour/tablestore/manager.h
@@ -17,7 +17,7 @@ protected:
const NMetadata::IClassBehaviour::TPtr& manager, IOperationsManager::TInternalModificationContext& context) const override;
NThreading::TFuture<IOperationsManager::TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
- const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
+ const ui32 nodeId, const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
public:
TTableStoreManager(bool isStandalone)
: IsStandalone(isStandalone)
diff --git a/ydb/core/kqp/gateway/behaviour/view/manager.cpp b/ydb/core/kqp/gateway/behaviour/view/manager.cpp
index 0f2bdbd5d5e..bd3cee0133d 100644
--- a/ydb/core/kqp/gateway/behaviour/view/manager.cpp
+++ b/ydb/core/kqp/gateway/behaviour/view/manager.cpp
@@ -152,7 +152,7 @@ TViewManager::TYqlConclusionStatus TViewManager::DoPrepare(NKqpProto::TKqpScheme
const NMetadata::IClassBehaviour::TPtr& manager,
TInternalModificationContext& context) const {
Y_UNUSED(manager);
-
+
try {
CheckFeatureFlag(context);
switch (context.GetActivityType()) {
@@ -176,9 +176,10 @@ TViewManager::TYqlConclusionStatus TViewManager::DoPrepare(NKqpProto::TKqpScheme
}
NThreading::TFuture<TYqlConclusionStatus> TViewManager::ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
+ const ui32 nodeId,
const NMetadata::IClassBehaviour::TPtr& manager,
const TExternalModificationContext& context) const {
- Y_UNUSED(manager);
+ Y_UNUSED(manager, nodeId);
auto proposal = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
proposal->Record.SetDatabaseName(context.GetDatabase());
diff --git a/ydb/core/kqp/gateway/behaviour/view/manager.h b/ydb/core/kqp/gateway/behaviour/view/manager.h
index 50c8bea954e..a2329109f05 100644
--- a/ydb/core/kqp/gateway/behaviour/view/manager.h
+++ b/ydb/core/kqp/gateway/behaviour/view/manager.h
@@ -17,6 +17,7 @@ class TViewManager: public NMetadata::NModifications::IOperationsManager {
TInternalModificationContext& context) const override;
NThreading::TFuture<TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
+ const ui32 nodeId,
const NMetadata::IClassBehaviour::TPtr& manager,
const TExternalModificationContext& context) const override;
diff --git a/ydb/core/kqp/host/kqp_gateway_proxy.cpp b/ydb/core/kqp/host/kqp_gateway_proxy.cpp
index 743c518c2c7..f3b2201ffac 100644
--- a/ydb/core/kqp/host/kqp_gateway_proxy.cpp
+++ b/ydb/core/kqp/host/kqp_gateway_proxy.cpp
@@ -1022,6 +1022,9 @@ public:
NMetadata::NModifications::IOperationsManager::TExternalModificationContext context;
context.SetDatabase(SessionCtx->GetDatabase());
context.SetActorSystem(ActorSystem);
+ if (SessionCtx->GetUserToken()) {
+ context.SetUserToken(*SessionCtx->GetUserToken());
+ }
auto& phyTx = phyTxRemover.Capture(SessionCtx->Query().PreparingQuery->MutablePhysicalQuery());
phyTx.SetType(NKqpProto::TKqpPhyTx::TYPE_SCHEME);
diff --git a/ydb/core/kqp/host/kqp_host.cpp b/ydb/core/kqp/host/kqp_host.cpp
index 70bca19d12f..750fe8120db 100644
--- a/ydb/core/kqp/host/kqp_host.cpp
+++ b/ydb/core/kqp/host/kqp_host.cpp
@@ -921,7 +921,7 @@ class TKqpHost : public IKqpHost {
public:
TKqpHost(TIntrusivePtr<IKqpGateway> gateway, const TString& cluster, const TString& database,
TKikimrConfiguration::TPtr config, IModuleResolver::TPtr moduleResolver,
- std::optional<TKqpFederatedQuerySetup> federatedQuerySetup,
+ std::optional<TKqpFederatedQuerySetup> federatedQuerySetup, const TIntrusiveConstPtr<NACLib::TUserToken>& userToken,
const NKikimr::NMiniKQL::IFunctionRegistry* funcRegistry, bool keepConfigChanges,
bool isInternalCall, TKqpTempTablesState::TConstPtr tempTablesState = nullptr,
NActors::TActorSystem* actorSystem = nullptr)
@@ -932,7 +932,7 @@ public:
, KeepConfigChanges(keepConfigChanges)
, IsInternalCall(isInternalCall)
, FederatedQuerySetup(federatedQuerySetup)
- , SessionCtx(new TKikimrSessionContext(funcRegistry, config, TAppData::TimeProvider, TAppData::RandomProvider))
+ , SessionCtx(new TKikimrSessionContext(funcRegistry, config, TAppData::TimeProvider, TAppData::RandomProvider, userToken))
, TypesCtx(MakeIntrusive<TTypeAnnotationContext>())
, PlanBuilder(CreatePlanBuilder(*TypesCtx))
, FakeWorld(ExprCtx->NewWorld(TPosition()))
@@ -1672,11 +1672,11 @@ Ydb::Table::QueryStatsCollection::Mode GetStatsMode(NYql::EKikimrStatsMode stats
TIntrusivePtr<IKqpHost> CreateKqpHost(TIntrusivePtr<IKqpGateway> gateway,
const TString& cluster, const TString& database, TKikimrConfiguration::TPtr config, IModuleResolver::TPtr moduleResolver,
- std::optional<TKqpFederatedQuerySetup> federatedQuerySetup,
+ std::optional<TKqpFederatedQuerySetup> federatedQuerySetup, const TIntrusiveConstPtr<NACLib::TUserToken>& userToken,
const NKikimr::NMiniKQL::IFunctionRegistry* funcRegistry, bool keepConfigChanges, bool isInternalCall,
TKqpTempTablesState::TConstPtr tempTablesState, NActors::TActorSystem* actorSystem)
{
- return MakeIntrusive<TKqpHost>(gateway, cluster, database, config, moduleResolver, federatedQuerySetup, funcRegistry,
+ return MakeIntrusive<TKqpHost>(gateway, cluster, database, config, moduleResolver, federatedQuerySetup, userToken, funcRegistry,
keepConfigChanges, isInternalCall, std::move(tempTablesState), actorSystem);
}
diff --git a/ydb/core/kqp/host/kqp_host.h b/ydb/core/kqp/host/kqp_host.h
index 445d77e8875..3b8022221df 100644
--- a/ydb/core/kqp/host/kqp_host.h
+++ b/ydb/core/kqp/host/kqp_host.h
@@ -4,6 +4,7 @@
#include <ydb/core/kqp/gateway/kqp_gateway.h>
#include <ydb/core/kqp/provider/yql_kikimr_provider.h>
#include <ydb/core/kqp/host/kqp_translate.h>
+#include <ydb/library/aclib/aclib.h>
#include <ydb/library/yql/providers/common/http_gateway/yql_http_gateway.h>
#include <ydb/library/yql/providers/common/token_accessor/client/factory.h>
@@ -108,7 +109,7 @@ public:
TIntrusivePtr<IKqpHost> CreateKqpHost(TIntrusivePtr<IKqpGateway> gateway,
const TString& cluster, const TString& database, NYql::TKikimrConfiguration::TPtr config, NYql::IModuleResolver::TPtr moduleResolver,
- std::optional<TKqpFederatedQuerySetup> federatedQuerySetup, const NKikimr::NMiniKQL::IFunctionRegistry* funcRegistry = nullptr,
+ std::optional<TKqpFederatedQuerySetup> federatedQuerySetup, const TIntrusiveConstPtr<NACLib::TUserToken>& userToken, const NKikimr::NMiniKQL::IFunctionRegistry* funcRegistry = nullptr,
bool keepConfigChanges = false, bool isInternalCall = false, TKqpTempTablesState::TConstPtr tempTablesState = nullptr,
NActors::TActorSystem* actorSystem = nullptr /*take from TLS by default*/);
diff --git a/ydb/core/kqp/provider/yql_kikimr_provider.h b/ydb/core/kqp/provider/yql_kikimr_provider.h
index f662ce6becf..2dd58916d10 100644
--- a/ydb/core/kqp/provider/yql_kikimr_provider.h
+++ b/ydb/core/kqp/provider/yql_kikimr_provider.h
@@ -445,11 +445,14 @@ public:
TKikimrConfiguration::TPtr config,
TIntrusivePtr<ITimeProvider> timeProvider,
TIntrusivePtr<IRandomProvider> randomProvider,
+ const TIntrusiveConstPtr<NACLib::TUserToken>& userToken,
TIntrusivePtr<TKikimrTransactionContextBase> txCtx = nullptr)
: Configuration(config)
, TablesData(MakeIntrusive<TKikimrTablesData>())
, QueryCtx(MakeIntrusive<TKikimrQueryContext>(functionRegistry, timeProvider, randomProvider))
- , TxCtx(txCtx) {}
+ , TxCtx(txCtx)
+ , UserToken(userToken)
+ {}
TKikimrSessionContext(const TKikimrSessionContext&) = delete;
TKikimrSessionContext& operator=(const TKikimrSessionContext&) = delete;
@@ -518,6 +521,10 @@ public:
TempTablesState = tempTablesState;
}
+ const TIntrusiveConstPtr<NACLib::TUserToken>& GetUserToken() const {
+ return UserToken;
+ }
+
private:
TString UserName;
TString Cluster;
@@ -527,6 +534,7 @@ private:
TIntrusivePtr<TKikimrQueryContext> QueryCtx;
TIntrusivePtr<TKikimrTransactionContextBase> TxCtx;
NKikimr::NKqp::TKqpTempTablesState::TConstPtr TempTablesState;
+ TIntrusiveConstPtr<NACLib::TUserToken> UserToken;
};
TIntrusivePtr<IDataProvider> CreateKikimrDataSource(
diff --git a/ydb/core/kqp/session_actor/kqp_worker_actor.cpp b/ydb/core/kqp/session_actor/kqp_worker_actor.cpp
index 0bffab8dba1..682ee146e8a 100644
--- a/ydb/core/kqp/session_actor/kqp_worker_actor.cpp
+++ b/ydb/core/kqp/session_actor/kqp_worker_actor.cpp
@@ -187,7 +187,7 @@ public:
Config->FeatureFlags = AppData(ctx)->FeatureFlags;
KqpHost = CreateKqpHost(Gateway, Settings.Cluster, Settings.Database, Config, ModuleResolverState->ModuleResolver,
- FederatedQuerySetup, AppData(ctx)->FunctionRegistry, !Settings.LongSession, false);
+ FederatedQuerySetup, QueryState->RequestEv->GetUserToken(), AppData(ctx)->FunctionRegistry, !Settings.LongSession, false);
auto& queryRequest = QueryState->RequestEv;
QueryState->ProxyRequestId = proxyRequestId;
diff --git a/ydb/core/kqp/ut/federated_query/generic/kqp_generic_provider_join_ut.cpp b/ydb/core/kqp/ut/federated_query/generic/kqp_generic_provider_join_ut.cpp
index 63c62309b1c..4c88715f2af 100644
--- a/ydb/core/kqp/ut/federated_query/generic/kqp_generic_provider_join_ut.cpp
+++ b/ydb/core/kqp/ut/federated_query/generic/kqp_generic_provider_join_ut.cpp
@@ -63,9 +63,7 @@ Y_UNIT_TEST_SUITE(FederatedQueryJoin) {
}
std::shared_ptr<NKikimr::NKqp::TKikimrRunner> kikimr = MakeKikimrRunnerWithConnector();
-
- auto tableCLient = kikimr->GetTableClient();
- auto session = tableCLient.CreateSession().GetValueSync().GetSession();
+ auto queryClient = kikimr->GetQueryClient();
// external tables to pg/ch
{
@@ -104,7 +102,7 @@ Y_UNIT_TEST_SUITE(FederatedQueryJoin) {
"ch_database"_a = GetChDatabase(),
"ch_user"_a = GetChUser(),
"ch_password"_a = GetChPassword());
- auto result = session.ExecuteSchemeQuery(sql).GetValueSync();
+ auto result = queryClient.ExecuteQuery(sql, NYdb::NQuery::TTxControl::NoTx()).GetValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
}
@@ -116,7 +114,6 @@ Y_UNIT_TEST_SUITE(FederatedQueryJoin) {
WHERE ch.key > 998
)sql";
- auto queryClient = kikimr->GetQueryClient();
auto result = queryClient.ExecuteQuery(sql, NYdb::NQuery::TTxControl::BeginTx().CommitTx()).GetValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
diff --git a/ydb/core/kqp/ut/federated_query/s3/kqp_federated_scheme_ut.cpp b/ydb/core/kqp/ut/federated_query/s3/kqp_federated_scheme_ut.cpp
index 6cc0f2a894b..45506581cff 100644
--- a/ydb/core/kqp/ut/federated_query/s3/kqp_federated_scheme_ut.cpp
+++ b/ydb/core/kqp/ut/federated_query/s3/kqp_federated_scheme_ut.cpp
@@ -17,7 +17,7 @@ using namespace NTestUtils;
using namespace fmt::literals;
Y_UNIT_TEST_SUITE(KqpFederatedSchemeTest) {
- Y_UNIT_TEST(CreateExternalTable) {
+ Y_UNIT_TEST(ExternalTableDdl) {
enum EEx {
Empty,
IfExists,
diff --git a/ydb/core/kqp/ut/indexes/kqp_indexes_ut.cpp b/ydb/core/kqp/ut/indexes/kqp_indexes_ut.cpp
index 6574e7a8a09..74214695a12 100644
--- a/ydb/core/kqp/ut/indexes/kqp_indexes_ut.cpp
+++ b/ydb/core/kqp/ut/indexes/kqp_indexes_ut.cpp
@@ -55,7 +55,7 @@ TIntrusivePtr<IKqpHost> CreateKikimrQueryProcessor(TIntrusivePtr<IKqpGateway> ga
auto federatedQuerySetup = std::make_optional<TKqpFederatedQuerySetup>({NYql::IHTTPGateway::Make(), nullptr, nullptr, nullptr, {}, {}});
return NKqp::CreateKqpHost(gateway, cluster, "/Root", kikimrConfig, moduleResolver,
- federatedQuerySetup, funcRegistry, funcRegistry, keepConfigChanges, nullptr, actorSystem);
+ federatedQuerySetup, nullptr, funcRegistry, funcRegistry, keepConfigChanges, nullptr, actorSystem);
}
NYql::NNodes::TExprBase GetExpr(const TString& ast, NYql::TExprContext& ctx, NYql::IModuleResolver* moduleResolver) {
diff --git a/ydb/core/kqp/ut/service/kqp_qs_queries_ut.cpp b/ydb/core/kqp/ut/service/kqp_qs_queries_ut.cpp
index 9caf25a81d4..233e7932c54 100644
--- a/ydb/core/kqp/ut/service/kqp_qs_queries_ut.cpp
+++ b/ydb/core/kqp/ut/service/kqp_qs_queries_ut.cpp
@@ -1160,6 +1160,98 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
});
}
+ Y_UNIT_TEST(DdlSecret) {
+ NKikimrConfig::TAppConfig appConfig;
+ appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);
+ auto setting = NKikimrKqp::TKqpSetting();
+ auto serverSettings = TKikimrSettings()
+ .SetAppConfig(appConfig)
+ .SetKqpSettings({setting});
+
+ TKikimrRunner kikimr(serverSettings);
+ auto db = kikimr.GetQueryClient();
+
+ enum EEx {
+ Empty,
+ IfExists,
+ IfNotExists,
+ };
+
+ auto executeSql = [&](const TString& sql, bool expectSuccess) {
+ Cerr << "Execute SQL:\n" << sql << Endl;
+
+ auto result = db.ExecuteQuery(sql, TTxControl::NoTx()).ExtractValueSync();
+ if (expectSuccess) {
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
+ } else {
+ UNIT_ASSERT_VALUES_UNEQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
+ }
+ UNIT_ASSERT(result.GetResultSets().empty());
+ };
+
+ auto checkCreate = [&](bool expectSuccess, EEx exMode, int nameSuffix) {
+ UNIT_ASSERT_UNEQUAL(exMode, EEx::IfExists);
+ const TString ifNotExistsStatement = exMode == EEx::IfNotExists ? "IF NOT EXISTS" : "";
+ const TString sql = fmt::format(R"sql(
+ CREATE OBJECT {if_not_exists} my_secret_{name_suffix} (TYPE SECRET) WITH (value="qwerty");
+ )sql",
+ "if_not_exists"_a = ifNotExistsStatement,
+ "name_suffix"_a = nameSuffix
+ );
+
+ executeSql(sql, expectSuccess);
+ };
+
+ auto checkAlter = [&](bool expectSuccess, int nameSuffix) {
+ const TString sql = fmt::format(R"sql(
+ ALTER OBJECT my_secret_{name_suffix} (TYPE SECRET) SET value = "abcde";
+ )sql",
+ "name_suffix"_a = nameSuffix
+ );
+
+ executeSql(sql, expectSuccess);
+ };
+
+ auto checkUpsert = [&](bool expectSuccess, int nameSuffix) {
+ const TString sql = fmt::format(R"sql(
+ UPSERT OBJECT my_secret_{name_suffix} (TYPE SECRET) WITH value = "edcba";
+ )sql",
+ "name_suffix"_a = nameSuffix
+ );
+
+ executeSql(sql, expectSuccess);
+ };
+
+ auto checkDrop = [&](bool expectSuccess, EEx exMode, int nameSuffix) {
+ UNIT_ASSERT_UNEQUAL(exMode, EEx::IfNotExists);
+ const TString ifExistsStatement = exMode == EEx::IfExists ? "IF EXISTS" : "";
+ const TString sql = fmt::format(R"sql(
+ DROP OBJECT {if_exists} my_secret_{name_suffix} (TYPE SECRET);
+ )sql",
+ "if_exists"_a = ifExistsStatement,
+ "name_suffix"_a = nameSuffix
+ );
+
+ executeSql(sql, expectSuccess);
+ };
+
+ checkCreate(true, EEx::Empty, 0);
+ checkCreate(false, EEx::Empty, 0);
+ checkAlter(true, 0);
+ checkAlter(false, 2); // not exists
+ checkDrop(true, EEx::Empty, 0);
+ checkDrop(true, EEx::Empty, 0); // we don't check object existence
+
+ checkCreate(true, EEx::IfNotExists, 1);
+ checkCreate(true, EEx::IfNotExists, 1);
+ checkDrop(true, EEx::IfExists, 1);
+ checkDrop(true, EEx::IfExists, 1);
+
+ checkUpsert(true, 2);
+ checkCreate(false, EEx::Empty, 2); // already exists
+ checkUpsert(true, 2);
+ }
+
Y_UNIT_TEST(DdlCache) {
NKikimrConfig::TAppConfig appConfig;
appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);
diff --git a/ydb/core/protos/kqp_physical.proto b/ydb/core/protos/kqp_physical.proto
index 74e28c92bcf..be5d9d64842 100644
--- a/ydb/core/protos/kqp_physical.proto
+++ b/ydb/core/protos/kqp_physical.proto
@@ -374,6 +374,17 @@ message TKqpPhyResult {
optional uint32 QueryResultIndex = 5;
}
+message TKqpPhyMetadataOperation {
+ message TColumnValue {
+ string Column = 1;
+ Ydb.Value Value = 2;
+ }
+ repeated TColumnValue ColumnValues = 1;
+
+ optional bool SuccessOnNotExist = 2;
+ optional bool SuccessOnAlreadyExists = 3;
+}
+
message TKqpSchemeOperation {
enum EFlags {
FLAG_UNSPECIFIED = 0;
@@ -409,6 +420,10 @@ message TKqpSchemeOperation {
NKikimrSchemeOp.TModifyScheme CreateView = 20;
NKikimrSchemeOp.TModifyScheme AlterView = 21;
NKikimrSchemeOp.TModifyScheme DropView = 22;
+ TKqpPhyMetadataOperation CreateObject = 23;
+ TKqpPhyMetadataOperation UpsertObject = 24;
+ TKqpPhyMetadataOperation AlterObject = 25;
+ TKqpPhyMetadataOperation DropObject = 26;
}
}
diff --git a/ydb/core/tx/tiering/rule/manager.cpp b/ydb/core/tx/tiering/rule/manager.cpp
index 0b3c24d9e74..0e543098a7e 100644
--- a/ydb/core/tx/tiering/rule/manager.cpp
+++ b/ydb/core/tx/tiering/rule/manager.cpp
@@ -37,7 +37,7 @@ NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus TTieringRule
}
NThreading::TFuture<NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus> TTieringRulesManager::ExecutePrepared(const NKqpProto::TKqpSchemeOperation& /*schemeOperation*/,
- const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
+ const ui32 /*nodeId*/, const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
return NThreading::MakeFuture(NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus::Fail(
"Execution of prepare operations for TIERING_RULE objects is not supported"));
}
diff --git a/ydb/core/tx/tiering/rule/manager.h b/ydb/core/tx/tiering/rule/manager.h
index 45e7f767ef3..45057cfa04f 100644
--- a/ydb/core/tx/tiering/rule/manager.h
+++ b/ydb/core/tx/tiering/rule/manager.h
@@ -18,7 +18,7 @@ protected:
const NMetadata::IClassBehaviour::TPtr& manager, IOperationsManager::TInternalModificationContext& context) const override;
virtual NThreading::TFuture<IOperationsManager::TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
- const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
+ const ui32 nodeId, const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
};
}
diff --git a/ydb/core/tx/tiering/tier/manager.cpp b/ydb/core/tx/tiering/tier/manager.cpp
index b8ae6f8b990..7c657b3df15 100644
--- a/ydb/core/tx/tiering/tier/manager.cpp
+++ b/ydb/core/tx/tiering/tier/manager.cpp
@@ -74,7 +74,7 @@ NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus TTiersManage
}
NThreading::TFuture<NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus> TTiersManager::ExecutePrepared(const NKqpProto::TKqpSchemeOperation& /*schemeOperation*/,
- const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
+ const ui32 /*nodeId*/, const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
return NThreading::MakeFuture(NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus::Fail(
"Execution of prepare operations for TIER objects is not supported"));
}
diff --git a/ydb/core/tx/tiering/tier/manager.h b/ydb/core/tx/tiering/tier/manager.h
index 3d279986e1f..547e06ef001 100644
--- a/ydb/core/tx/tiering/tier/manager.h
+++ b/ydb/core/tx/tiering/tier/manager.h
@@ -18,7 +18,7 @@ protected:
const NMetadata::IClassBehaviour::TPtr& manager, IOperationsManager::TInternalModificationContext& context) const override;
virtual NThreading::TFuture<IOperationsManager::TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
- const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
+ const ui32 nodeId, const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
public:
};
diff --git a/ydb/library/conclusion/result.h b/ydb/library/conclusion/result.h
index 36a19176f5a..17d72180b3b 100644
--- a/ydb/library/conclusion/result.h
+++ b/ydb/library/conclusion/result.h
@@ -76,6 +76,15 @@ public:
return status->GetErrorMessage();
}
}
+
+ Ydb::StatusIds::StatusCode GetStatus() const {
+ auto* status = std::get_if<TConclusionStatus>(&Result);
+ if (!status) {
+ return Ydb::StatusIds::SUCCESS;
+ } else {
+ return status->GetStatus();
+ }
+ }
};
}
diff --git a/ydb/library/conclusion/status.h b/ydb/library/conclusion/status.h
index 0dd3d66fb25..86e018cd340 100644
--- a/ydb/library/conclusion/status.h
+++ b/ydb/library/conclusion/status.h
@@ -1,4 +1,6 @@
#pragma once
+#include <ydb/public/api/protos/ydb_status_codes.pb.h>
+
#include <util/generic/string.h>
#include <optional>
@@ -7,14 +9,19 @@ namespace NKikimr {
class TConclusionStatus {
private:
std::optional<TString> ErrorMessage;
+ Ydb::StatusIds::StatusCode Status = Ydb::StatusIds::SUCCESS;
TConclusionStatus() = default;
- TConclusionStatus(const TString& errorMessage)
- : ErrorMessage(errorMessage) {
+ TConclusionStatus(const TString& errorMessage, Ydb::StatusIds::StatusCode status = Ydb::StatusIds::INTERNAL_ERROR)
+ : ErrorMessage(errorMessage)
+ , Status(status)
+ {
Y_ABORT_UNLESS(!!ErrorMessage);
}
- TConclusionStatus(const char* errorMessage)
- : ErrorMessage(errorMessage) {
+ TConclusionStatus(const char* errorMessage, Ydb::StatusIds::StatusCode status = Ydb::StatusIds::INTERNAL_ERROR)
+ : ErrorMessage(errorMessage)
+ , Status(status)
+ {
Y_ABORT_UNLESS(!!ErrorMessage);
}
public:
@@ -23,6 +30,10 @@ public:
return ErrorMessage ? *ErrorMessage : Default<TString>();
}
+ Ydb::StatusIds::StatusCode GetStatus() const {
+ return Status;
+ }
+
static TConclusionStatus Fail(const char* errorMessage) {
return TConclusionStatus(errorMessage);
}
diff --git a/ydb/library/conclusion/ya.make b/ydb/library/conclusion/ya.make
index 3fcb4c0e9b2..dd50013dc5a 100644
--- a/ydb/library/conclusion/ya.make
+++ b/ydb/library/conclusion/ya.make
@@ -6,6 +6,7 @@ SRCS(
)
PEERDIR(
+ ydb/public/api/protos
)
END()
diff --git a/ydb/services/ext_index/metadata/manager.cpp b/ydb/services/ext_index/metadata/manager.cpp
index d1f1fc94743..adebe4f71c1 100644
--- a/ydb/services/ext_index/metadata/manager.cpp
+++ b/ydb/services/ext_index/metadata/manager.cpp
@@ -97,7 +97,7 @@ NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus TManager::Do
}
NThreading::TFuture<NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus> TManager::ExecutePrepared(const NKqpProto::TKqpSchemeOperation& /*schemeOperation*/,
- const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
+ const ui32 /*nodeId*/, const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
return NThreading::MakeFuture(NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus::Fail(
"Execution of prepare operations for CS_EXT_INDEX objects is not supported"));
}
diff --git a/ydb/services/ext_index/metadata/manager.h b/ydb/services/ext_index/metadata/manager.h
index 48c6070819b..70bf6357555 100644
--- a/ydb/services/ext_index/metadata/manager.h
+++ b/ydb/services/ext_index/metadata/manager.h
@@ -19,7 +19,7 @@ protected:
const NMetadata::IClassBehaviour::TPtr& manager, IOperationsManager::TInternalModificationContext& context) const override;
virtual NThreading::TFuture<IOperationsManager::TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
- const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
+ const ui32 nodeId, const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
public:
};
diff --git a/ydb/services/ext_index/service/activation.cpp b/ydb/services/ext_index/service/activation.cpp
index 797cc0a7de7..e52bcb6bd94 100644
--- a/ydb/services/ext_index/service/activation.cpp
+++ b/ydb/services/ext_index/service/activation.cpp
@@ -33,13 +33,13 @@ NKikimr::NMetadata::NRequest::TDialogYQLRequest::TRequest TActivation::BuildUpda
void TActivation::OnDescriptionSuccess(NMetadata::NProvider::TTableInfo&& result, const TString& /*requestId*/) {
if (!result->ColumnTableInfo) {
- ExternalController->OnActivationFailed("incorrect column table info", RequestId);
+ ExternalController->OnActivationFailed(Ydb::StatusIds::INTERNAL_ERROR, "incorrect column table info", RequestId);
SelfContainer = nullptr;
return;
}
Ydb::Table::CreateTableRequest request;
if (!Object.TryProvideTtl(result->ColumnTableInfo->Description, &request)) {
- ExternalController->OnActivationFailed("cannot convert ttl method from column tables", RequestId);
+ ExternalController->OnActivationFailed(Ydb::StatusIds::INTERNAL_ERROR, "cannot convert ttl method from column tables", RequestId);
SelfContainer = nullptr;
return;
}
@@ -61,7 +61,7 @@ void TActivation::OnDescriptionSuccess(NMetadata::NProvider::TTableInfo&& result
column.set_name("pk_" + i.Name);
auto primitiveType = NMetadata::NInternal::TYDBType::ConvertYQLToYDB(i.PType.GetTypeId());
if (!primitiveType) {
- ExternalController->OnActivationFailed("cannot convert type yql -> ydb", RequestId);
+ ExternalController->OnActivationFailed(Ydb::StatusIds::INTERNAL_ERROR, "cannot convert type yql -> ydb", RequestId);
SelfContainer = nullptr;
return;
}
@@ -83,8 +83,8 @@ void TActivation::OnModificationFinished(const TString& modificationId) {
}
}
-void TActivation::OnModificationFailed(const TString& errorMessage, const TString& /*modificationId*/) {
- ExternalController->OnActivationFailed(errorMessage, RequestId);
+void TActivation::OnModificationFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage, const TString& /*modificationId*/) {
+ ExternalController->OnActivationFailed(status, errorMessage, RequestId);
SelfContainer = nullptr;
}
diff --git a/ydb/services/ext_index/service/activation.h b/ydb/services/ext_index/service/activation.h
index a7dcaf74ff8..9df8b67c4ab 100644
--- a/ydb/services/ext_index/service/activation.h
+++ b/ydb/services/ext_index/service/activation.h
@@ -12,7 +12,7 @@ class IActivationExternalController {
public:
using TPtr = std::shared_ptr<IActivationExternalController>;
virtual ~IActivationExternalController() = default;
- virtual void OnActivationFailed(const TString& errorMessage, const TString& requestId) = 0;
+ virtual void OnActivationFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage, const TString& requestId) = 0;
virtual void OnActivationSuccess(const TString& requestId) = 0;
};
@@ -31,22 +31,22 @@ private:
protected:
virtual void OnDescriptionFailed(const TString& errorMessage, const TString& requestId) override {
- ExternalController->OnActivationFailed(errorMessage, requestId);
+ ExternalController->OnActivationFailed(Ydb::StatusIds::INTERNAL_ERROR, errorMessage, requestId);
SelfContainer = nullptr;
}
virtual void OnDescriptionSuccess(NMetadata::NProvider::TTableInfo&& result, const TString& requestId) override;
virtual void OnModificationFinished(const TString& modificationId) override;
- virtual void OnModificationFailed(const TString& errorMessage, const TString& modificationId) override;
+ virtual void OnModificationFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage, const TString& modificationId) override;
virtual void OnRequestResult(NMetadata::NRequest::TDialogYQLRequest::TResponse&& /*result*/) override {
ExternalController->OnActivationSuccess(RequestId);
SelfContainer = nullptr;
}
- virtual void OnRequestFailed(const TString& errorMessage) override {
- ExternalController->OnActivationFailed(errorMessage, RequestId);
+ virtual void OnRequestFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage) override {
+ ExternalController->OnActivationFailed(status, errorMessage, RequestId);
SelfContainer = nullptr;
}
public:
diff --git a/ydb/services/ext_index/service/deleting.cpp b/ydb/services/ext_index/service/deleting.cpp
index ee744530e0f..ebafd645f63 100644
--- a/ydb/services/ext_index/service/deleting.cpp
+++ b/ydb/services/ext_index/service/deleting.cpp
@@ -46,8 +46,8 @@ void TDeleting::OnModificationFinished(const TString& /*modificationId*/) {
NMetadata::NRequest::TYQLRequestExecutor::Execute(BuildDeleteRequest(), NACLib::TSystemUsers::Metadata(), SelfContainer);
}
-void TDeleting::OnModificationFailed(const TString& errorMessage, const TString& /*modificationId*/) {
- ExternalController->OnDeletingFailed(errorMessage, RequestId);
+void TDeleting::OnModificationFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage, const TString& /*modificationId*/) {
+ ExternalController->OnDeletingFailed(status, errorMessage, RequestId);
SelfContainer = nullptr;
}
diff --git a/ydb/services/ext_index/service/deleting.h b/ydb/services/ext_index/service/deleting.h
index 61ac740c5aa..5518c48a1ea 100644
--- a/ydb/services/ext_index/service/deleting.h
+++ b/ydb/services/ext_index/service/deleting.h
@@ -13,7 +13,7 @@ class IDeletingExternalController {
public:
using TPtr = std::shared_ptr<IDeletingExternalController>;
virtual ~IDeletingExternalController() = default;
- virtual void OnDeletingFailed(const TString& errorMessage, const TString& requestId) = 0;
+ virtual void OnDeletingFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage, const TString& requestId) = 0;
virtual void OnDeletingSuccess(const TString& requestId) = 0;
};
@@ -33,10 +33,10 @@ private:
protected:
virtual void OnModificationFinished(const TString& modificationId) override;
- virtual void OnModificationFailed(const TString& errorMessage, const TString& modificationId) override;
+ virtual void OnModificationFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage, const TString& modificationId) override;
- virtual void OnRequestFailed(const TString& errorMessage) override {
- ExternalController->OnDeletingFailed(errorMessage, RequestId);
+ virtual void OnRequestFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage) override {
+ ExternalController->OnDeletingFailed(status, errorMessage, RequestId);
SelfContainer = nullptr;
}
diff --git a/ydb/services/ext_index/service/executor.cpp b/ydb/services/ext_index/service/executor.cpp
index 47db37ba14e..d5af1a98ac2 100644
--- a/ydb/services/ext_index/service/executor.cpp
+++ b/ydb/services/ext_index/service/executor.cpp
@@ -27,13 +27,13 @@ void TExecutor::Handle(TEvAddData::TPtr& ev) {
class TIndexesController: public IActivationExternalController, public IDeletingExternalController {
public:
- virtual void OnActivationFailed(const TString& errorMessage, const TString& requestId) override {
+ virtual void OnActivationFailed(Ydb::StatusIds::StatusCode /*status*/, const TString& errorMessage, const TString& requestId) override {
ALS_ERROR(NKikimrServices::EXT_INDEX) << "cannot activate index for " << requestId << ": " << errorMessage;
}
virtual void OnActivationSuccess(const TString& requestId) override {
ALS_NOTICE(NKikimrServices::EXT_INDEX) << "index activated " << requestId;
}
- virtual void OnDeletingFailed(const TString& errorMessage, const TString& requestId) override {
+ virtual void OnDeletingFailed(Ydb::StatusIds::StatusCode /*status*/, const TString& errorMessage, const TString& requestId) override {
ALS_ERROR(NKikimrServices::EXT_INDEX) << "cannot remove index for " << requestId << ": " << errorMessage;
}
virtual void OnDeletingSuccess(const TString& requestId) override {
diff --git a/ydb/services/metadata/initializer/accessor_init.cpp b/ydb/services/metadata/initializer/accessor_init.cpp
index 03a76588e9f..01a09dd68f9 100644
--- a/ydb/services/metadata/initializer/accessor_init.cpp
+++ b/ydb/services/metadata/initializer/accessor_init.cpp
@@ -79,7 +79,7 @@ void TDSAccessorInitialized::OnAlteringProblem(const TString& errorMessage) {
}, TDuration::Seconds(1));
}
-void TDSAccessorInitialized::OnModificationFailed(const TString& errorMessage, const TString& modificationId) {
+void TDSAccessorInitialized::OnModificationFailed(Ydb::StatusIds::StatusCode /*status*/, const TString& errorMessage, const TString& modificationId) {
AFL_ERROR(NKikimrServices::METADATA_INITIALIZER)("event", "OnModificationFailed")("error", errorMessage)("modificationId", modificationId);
NActors::ScheduleInvokeActivity([self = this->SelfPtr]() {
Y_ABORT_UNLESS(self->Modifiers.size());
diff --git a/ydb/services/metadata/initializer/accessor_init.h b/ydb/services/metadata/initializer/accessor_init.h
index a83f866c654..7bff4adba61 100644
--- a/ydb/services/metadata/initializer/accessor_init.h
+++ b/ydb/services/metadata/initializer/accessor_init.h
@@ -33,7 +33,7 @@ private:
virtual void OnAlteringFinished() override;
virtual void OnModificationFinished(const TString& modificationId) override;
- virtual void OnModificationFailed(const TString& errorMessage, const TString& modificationId) override;
+ virtual void OnModificationFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage, const TString& modificationId) override;
TDSAccessorInitialized(const NRequest::TConfig& config,
const TString& componentId,
diff --git a/ydb/services/metadata/initializer/common.h b/ydb/services/metadata/initializer/common.h
index 6ddb0b1ac4a..9a72628dccc 100644
--- a/ydb/services/metadata/initializer/common.h
+++ b/ydb/services/metadata/initializer/common.h
@@ -11,7 +11,7 @@ public:
using TPtr = std::shared_ptr<IModifierExternalController>;
virtual ~IModifierExternalController() = default;
virtual void OnModificationFinished(const TString& modificationId) = 0;
- virtual void OnModificationFailed(const TString& errorMessage, const TString& modificationId) = 0;
+ virtual void OnModificationFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage, const TString& modificationId) = 0;
};
class ITableModifier {
@@ -55,8 +55,8 @@ protected:
virtual void OnRequestResult(typename TDialogPolicy::TResponse&& /*result*/) override {
ExternalController->OnModificationFinished(ModificationId);
}
- virtual void OnRequestFailed(const TString& errorMessage) override {
- ExternalController->OnModificationFailed(errorMessage, ModificationId);
+ virtual void OnRequestFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage) override {
+ ExternalController->OnModificationFailed(status, errorMessage, ModificationId);
}
};
diff --git a/ydb/services/metadata/initializer/manager.cpp b/ydb/services/metadata/initializer/manager.cpp
index 715580877fd..3d6a1c54da0 100644
--- a/ydb/services/metadata/initializer/manager.cpp
+++ b/ydb/services/metadata/initializer/manager.cpp
@@ -24,7 +24,7 @@ NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus TManager::Do
}
NThreading::TFuture<NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus> TManager::ExecutePrepared(const NKqpProto::TKqpSchemeOperation& /*schemeOperation*/,
- const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
+ const ui32 /*nodeId*/, const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
return NThreading::MakeFuture(NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus::Fail(
"Execution of prepare operations for INITIALIZATION objects is not supported"));
}
diff --git a/ydb/services/metadata/initializer/manager.h b/ydb/services/metadata/initializer/manager.h
index 394e5490968..3c4b04f783f 100644
--- a/ydb/services/metadata/initializer/manager.h
+++ b/ydb/services/metadata/initializer/manager.h
@@ -24,7 +24,7 @@ protected:
const NMetadata::IClassBehaviour::TPtr& manager, IOperationsManager::TInternalModificationContext& context) const override;
virtual NThreading::TFuture<IOperationsManager::TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
- const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
+ const ui32 nodeId, const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
public:
};
diff --git a/ydb/services/metadata/manager/abstract.h b/ydb/services/metadata/manager/abstract.h
index 0db55d5b7b9..132afb8a8a1 100644
--- a/ydb/services/metadata/manager/abstract.h
+++ b/ydb/services/metadata/manager/abstract.h
@@ -117,7 +117,7 @@ public:
const TExternalModificationContext& context) const;
virtual NThreading::TFuture<TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
- const IClassBehaviour::TPtr& manager, const TExternalModificationContext& context) const = 0;
+ const ui32 nodeId, const IClassBehaviour::TPtr& manager, const TExternalModificationContext& context) const = 0;
const TTableSchema& GetSchema() const {
Y_ABORT_UNLESS(!!ActualSchema);
diff --git a/ydb/services/metadata/manager/alter.h b/ydb/services/metadata/manager/alter.h
index 5283835959c..481675db202 100644
--- a/ydb/services/metadata/manager/alter.h
+++ b/ydb/services/metadata/manager/alter.h
@@ -50,11 +50,12 @@ template <class TObject>
class TCreateObjectActor: public TModificationActor<TObject> {
private:
using TBase = TModificationActor<TObject>;
+ bool ExistingOk = false;
protected:
virtual bool ProcessPreparedObjects(NInternal::TTableRecords&& records) const override {
TBase::Register(new TInsertObjectsActor<TObject>(std::move(records), TBase::UserToken,
TBase::InternalController, TBase::SessionId, TBase::TransactionId,
- TBase::Context.GetExternalData().GetUserToken()));
+ TBase::Context.GetExternalData().GetUserToken(), ExistingOk));
return true;
}
@@ -63,6 +64,10 @@ protected:
}
public:
using TBase::TBase;
+
+ void SetExistingOk(bool existingOk) {
+ ExistingOk = existingOk;
+ }
};
template <class TObject>
@@ -126,13 +131,24 @@ template <class TObject>
class TCreateObjectCommand: public IObjectModificationCommand {
private:
using TBase = IObjectModificationCommand;
+ bool ExistingOk = false;
protected:
virtual void DoExecute() const override {
typename IObjectOperationsManager<TObject>::TPtr manager = TBase::GetOperationsManagerFor<TObject>();
- TActivationContext::AsActorContext().Register(new TCreateObjectActor<TObject>(GetRecords(), GetController(), manager, GetContext()));
+ auto* actor = new TCreateObjectActor<TObject>(GetRecords(), GetController(), manager, GetContext());
+ actor->SetExistingOk(ExistingOk);
+ TActivationContext::AsActorContext().Register(actor);
}
public:
- using TBase::TBase;
+ TCreateObjectCommand(const NInternal::TTableRecord& record,
+ IClassBehaviour::TPtr behaviour,
+ NModifications::IAlterController::TPtr controller,
+ const IOperationsManager::TInternalModificationContext& context,
+ bool existingOk)
+ : TBase(record, behaviour, controller, context)
+ , ExistingOk(existingOk)
+ {
+ }
};
template <class TObject>
@@ -152,13 +168,22 @@ template <class TObject>
class TDeleteObjectCommand: public IObjectModificationCommand {
private:
using TBase = IObjectModificationCommand;
+ bool MissingOk = false;
protected:
virtual void DoExecute() const override {
typename IObjectOperationsManager<TObject>::TPtr manager = TBase::GetOperationsManagerFor<TObject>();
TActivationContext::AsActorContext().Register(new TDeleteObjectActor<TObject>(GetRecords(), GetController(), manager, GetContext()));
}
public:
- using TBase::TBase;
+ TDeleteObjectCommand(const NInternal::TTableRecord& record,
+ IClassBehaviour::TPtr behaviour,
+ NModifications::IAlterController::TPtr controller,
+ const IOperationsManager::TInternalModificationContext& context,
+ bool missingOk)
+ : TBase(record, behaviour, controller, context)
+ , MissingOk(missingOk)
+ {
+ }
};
}
diff --git a/ydb/services/metadata/manager/generic_manager.h b/ydb/services/metadata/manager/generic_manager.h
index 51062e89ea7..570317ca796 100644
--- a/ydb/services/metadata/manager/generic_manager.h
+++ b/ydb/services/metadata/manager/generic_manager.h
@@ -8,7 +8,7 @@ class TOperationsController: public IAlterController {
private:
YDB_READONLY_DEF(NThreading::TPromise<IOperationsManager::TYqlConclusionStatus>, Promise);
public:
- TOperationsController(NThreading::TPromise<IOperationsManager::TYqlConclusionStatus>&& p)
+ TOperationsController(NThreading::TPromise<IOperationsManager::TYqlConclusionStatus> p)
: Promise(std::move(p))
{
@@ -30,6 +30,8 @@ private:
using IOperationsManager::TYqlConclusionStatus;
public:
using TInternalModificationContext = typename TBase::TInternalModificationContext;
+ using TExternalModificationContext = typename TBase::TExternalModificationContext;
+ using EActivityType = typename IOperationsManager::EActivityType;
protected:
virtual NThreading::TFuture<TYqlConclusionStatus> DoModify(
const NYql::TObjectSettingsImpl& settings, const ui32 nodeId,
@@ -42,35 +44,123 @@ protected:
return NThreading::MakeFuture<TYqlConclusionStatus>(TYqlConclusionStatus::Fail("modification is unavailable for " + manager->GetTypeId()));
}
auto promise = NThreading::NewPromise<TYqlConclusionStatus>();
- auto result = promise.GetFuture();
{
TOperationParsingResult patch(TBase::BuildPatchFromSettings(settings, context));
if (!patch.IsSuccess()) {
return NThreading::MakeFuture<TYqlConclusionStatus>(TYqlConclusionStatus::Fail(patch.GetErrorMessage()));
}
- auto controller = std::make_shared<TOperationsController>(std::move(promise));
+ auto controller = std::make_shared<TOperationsController>(promise);
IObjectModificationCommand::TPtr modifyObjectCommand;
switch (context.GetActivityType()) {
- case IOperationsManager::EActivityType::Upsert:
- modifyObjectCommand = std::make_shared<TUpsertObjectCommand<T>>(patch.GetResult(), manager, controller, context);
+ case EActivityType::Upsert:
+ modifyObjectCommand = std::make_shared<TUpsertObjectCommand<T>>(patch.GetResult(), manager, std::move(controller), context);
break;
- case IOperationsManager::EActivityType::Create:
- modifyObjectCommand = std::make_shared<TCreateObjectCommand<T>>(patch.GetResult(), manager, controller, context);
+ case EActivityType::Create:
+ modifyObjectCommand = std::make_shared<TCreateObjectCommand<T>>(patch.GetResult(), manager, std::move(controller), context, settings.GetExistingOk());
break;
- case IOperationsManager::EActivityType::Alter:
- modifyObjectCommand = std::make_shared<TUpdateObjectCommand<T>>(patch.GetResult(), manager, controller, context);
+ case EActivityType::Alter:
+ modifyObjectCommand = std::make_shared<TUpdateObjectCommand<T>>(patch.GetResult(), manager, std::move(controller), context);
break;
- case IOperationsManager::EActivityType::Drop:
- modifyObjectCommand = std::make_shared<TDeleteObjectCommand<T>>(patch.GetResult(), manager, controller, context);
+ case EActivityType::Drop:
+ modifyObjectCommand = std::make_shared<TDeleteObjectCommand<T>>(patch.GetResult(), manager, std::move(controller), context, settings.GetMissingOk());
break;
- case IOperationsManager::EActivityType::Undefined:
+ case EActivityType::Undefined:
return NThreading::MakeFuture<TYqlConclusionStatus>(TYqlConclusionStatus::Fail("undefined action type"));
}
TActivationContext::Send(new IEventHandle(NProvider::MakeServiceId(nodeId), {}, new NProvider::TEvObjectsOperation(modifyObjectCommand)));
}
+ return promise;
+ }
+
+ virtual TYqlConclusionStatus DoPrepare(NKqpProto::TKqpSchemeOperation& schemeOperation, const NYql::TObjectSettingsImpl& settings,
+ const IClassBehaviour::TPtr& manager, TInternalModificationContext& context) const override {
+ if (!manager) {
+ return TYqlConclusionStatus::Fail("modification object behaviour not initialized");
+ }
+ if (!manager->GetOperationsManager()) {
+ return TYqlConclusionStatus::Fail("modification is unavailable for " + manager->GetTypeId());
+ }
+
+ TOperationParsingResult patch(TBase::BuildPatchFromSettings(settings, context));
+ if (!patch.IsSuccess()) {
+ return TYqlConclusionStatus::Fail(patch.GetErrorMessage());
+ }
+
+ NKqpProto::TKqpPhyMetadataOperation* operationProto = nullptr;
+ switch (context.GetActivityType()) {
+ case EActivityType::Upsert:
+ operationProto = schemeOperation.MutableUpsertObject();
+ break;
+ case EActivityType::Create:
+ operationProto = schemeOperation.MutableCreateObject();
+ operationProto->SetSuccessOnAlreadyExists(settings.GetExistingOk());
+ break;
+ case EActivityType::Alter:
+ operationProto = schemeOperation.MutableAlterObject();
+ break;
+ case EActivityType::Drop:
+ operationProto = schemeOperation.MutableDropObject();
+ operationProto->SetSuccessOnNotExist(settings.GetMissingOk());
+ break;
+ case EActivityType::Undefined:
+ return TYqlConclusionStatus::Fail("undefined action type");
+ }
+ Y_ENSURE(operationProto);
+
+ for (const auto& [col, value] : patch.GetResult().GetValues()) {
+ auto* proto = operationProto->AddColumnValues();
+ proto->SetColumn(col);
+ proto->MutableValue()->CopyFrom(value);
+ }
+
+ return TYqlConclusionStatus::Success();
+ }
+
+ virtual NThreading::TFuture<TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
+ const ui32 nodeId, const IClassBehaviour::TPtr& manager, const TExternalModificationContext& context) const override {
+ if (!manager) {
+ return NThreading::MakeFuture<TYqlConclusionStatus>(TYqlConclusionStatus::Fail("modification object behaviour not initialized"));
+ }
+ if (!manager->GetOperationsManager()) {
+ return NThreading::MakeFuture<TYqlConclusionStatus>(TYqlConclusionStatus::Fail("modification is unavailable for " + manager->GetTypeId()));
+ }
+
+ auto promise = NThreading::NewPromise<TYqlConclusionStatus>();
+ auto controller = std::make_shared<TOperationsController>(promise);
+ IObjectModificationCommand::TPtr modifyObjectCommand;
+ TInternalModificationContext internalContext(context);
+ switch (schemeOperation.GetOperationCase()) {
+ case NKqpProto::TKqpSchemeOperation::kUpsertObject:
+ internalContext.SetActivityType(EActivityType::Upsert);
+ modifyObjectCommand = std::make_shared<TUpsertObjectCommand<T>>(BuildPatchFromProto(schemeOperation.GetUpsertObject()), manager, std::move(controller), internalContext);
+ break;
+ case NKqpProto::TKqpSchemeOperation::kCreateObject:
+ internalContext.SetActivityType(EActivityType::Create);
+ modifyObjectCommand = std::make_shared<TCreateObjectCommand<T>>(BuildPatchFromProto(schemeOperation.GetCreateObject()), manager, std::move(controller), internalContext, schemeOperation.GetCreateObject().GetSuccessOnAlreadyExists());
+ break;
+ case NKqpProto::TKqpSchemeOperation::kAlterObject:
+ internalContext.SetActivityType(EActivityType::Alter);
+ modifyObjectCommand = std::make_shared<TUpdateObjectCommand<T>>(BuildPatchFromProto(schemeOperation.GetAlterObject()), manager, std::move(controller), internalContext);
+ break;
+ case NKqpProto::TKqpSchemeOperation::kDropObject:
+ internalContext.SetActivityType(EActivityType::Drop);
+ modifyObjectCommand = std::make_shared<TDeleteObjectCommand<T>>(BuildPatchFromProto(schemeOperation.GetDropObject()), manager, std::move(controller), internalContext, schemeOperation.GetDropObject().GetSuccessOnNotExist());
+ break;
+ default:
+ return NThreading::MakeFuture<TYqlConclusionStatus>(TYqlConclusionStatus::Fail("undefined operation type"));
+ }
+ TActivationContext::Send(new IEventHandle(NProvider::MakeServiceId(nodeId), {}, new NProvider::TEvObjectsOperation(modifyObjectCommand)));
+
+ return promise;
+ }
+private:
+ static NInternal::TTableRecord BuildPatchFromProto(const NKqpProto::TKqpPhyMetadataOperation& op) {
+ NInternal::TTableRecord result;
+ for (const auto& val : op.GetColumnValues()) {
+ result.SetColumn(val.GetColumn(), val.GetValue());
+ }
return result;
}
-public:
};
}
diff --git a/ydb/services/metadata/manager/modification.h b/ydb/services/metadata/manager/modification.h
index cf7a01618e3..382fd23f6f2 100644
--- a/ydb/services/metadata/manager/modification.h
+++ b/ydb/services/metadata/manager/modification.h
@@ -19,8 +19,8 @@ private:
const TString TransactionId;
const NACLib::TUserToken SystemUserToken;
const std::optional<NACLib::TUserToken> UserToken;
- std::deque<NRequest::TDialogYQLRequest::TRequest> Requests;
protected:
+ std::deque<NRequest::TDialogYQLRequest::TRequest> Requests;
NInternal::TTableRecords Objects;
virtual Ydb::Table::ExecuteDataQueryRequest BuildModifyQuery() const = 0;
virtual TString GetModifyType() const = 0;
@@ -58,7 +58,7 @@ protected:
}
}
- void Handle(NRequest::TEvRequestFailed::TPtr& ev) {
+ virtual void Handle(NRequest::TEvRequestFailed::TPtr& ev) {
auto g = TBase::PassAwayGuard();
Controller->OnModificationProblem("cannot execute yql request for " + GetModifyType() +
" objects: " + ev->Get()->GetErrorMessage());
@@ -152,6 +152,7 @@ template <class TObject>
class TInsertObjectsActor: public TModifyObjectsActor<TObject> {
private:
using TBase = TModifyObjectsActor<TObject>;
+ bool ExistingOk = false;
protected:
virtual Ydb::Table::ExecuteDataQueryRequest BuildModifyQuery() const override {
return TBase::Objects.BuildInsertQuery(TObject::GetBehaviour()->GetStorageTablePath());
@@ -159,8 +160,23 @@ protected:
virtual TString GetModifyType() const override {
return "insert";
}
+
+ void Handle(NRequest::TEvRequestFailed::TPtr& ev) override {
+ if (ev->Get()->GetStatus() == Ydb::StatusIds::PRECONDITION_FAILED && ExistingOk) {
+ NRequest::TDialogYQLRequest::TResponse resp;
+ this->Send(this->SelfId(), new NRequest::TEvRequestResult<NRequest::TDialogYQLRequest>(std::move(resp)));
+ this->Requests.clear(); // Remove history request
+ return;
+ }
+ TBase::Handle(ev);
+ }
public:
- using TBase::TBase;
+ TInsertObjectsActor(NInternal::TTableRecords&& objects, const NACLib::TUserToken& systemUserToken, IModificationObjectsController::TPtr controller, const TString& sessionId,
+ const TString& transactionId, const std::optional<NACLib::TUserToken>& userToken, bool existingOk)
+ : TBase(std::move(objects), systemUserToken, std::move(controller), sessionId, transactionId, userToken)
+ , ExistingOk(existingOk)
+ {
+ }
};
}
diff --git a/ydb/services/metadata/request/common.h b/ydb/services/metadata/request/common.h
index 05564a99930..cacfa187e41 100644
--- a/ydb/services/metadata/request/common.h
+++ b/ydb/services/metadata/request/common.h
@@ -36,7 +36,7 @@ enum EEvents {
EvModifyPermissionsRequest,
EvModifyPermissionsInternalResponse,
EvModifyPermissionsResponse,
-
+
EvRequestFinished,
EvRequestFailed,
EvRequestStart,
@@ -72,7 +72,7 @@ public:
using TPtr = std::shared_ptr<IExternalController>;
virtual ~IExternalController() = default;
virtual void OnRequestResult(typename TDialogPolicy::TResponse&& result) = 0;
- virtual void OnRequestFailed(const TString& errorMessage) = 0;
+ virtual void OnRequestFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage) = 0;
};
using TDialogCreatePath = TDialogPolicyImpl<Ydb::Scheme::MakeDirectoryRequest, Ydb::Scheme::MakeDirectoryResponse,
@@ -152,11 +152,13 @@ public:
class TEvRequestFailed: public NActors::TEventLocal<TEvRequestFailed, EEvents::EvRequestFailed> {
private:
+ YDB_READONLY_DEF(Ydb::StatusIds::StatusCode, Status);
YDB_READONLY_DEF(TString, ErrorMessage)
public:
- TEvRequestFailed(const TString& errorMessage)
- : ErrorMessage(errorMessage) {
-
+ TEvRequestFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage)
+ : Status(status)
+ , ErrorMessage(errorMessage)
+ {
}
};
diff --git a/ydb/services/metadata/request/request_actor.h b/ydb/services/metadata/request/request_actor.h
index c502178ebbb..80a1c261206 100644
--- a/ydb/services/metadata/request/request_actor.h
+++ b/ydb/services/metadata/request/request_actor.h
@@ -36,7 +36,7 @@ protected:
}
};
- virtual void OnInternalResultError(const TString& errorMessage) = 0;
+ virtual void OnInternalResultError(Ydb::StatusIds::StatusCode status, const TString& errorMessage) = 0;
virtual void OnInternalResultSuccess(TResponse&& response) = 0;
public:
void Bootstrap(const TActorContext& /*ctx*/) {
@@ -55,7 +55,7 @@ public:
void Handle(typename TEvRequestInternalResult::TPtr& ev) {
if (!ev->Get()->GetFuture().HasValue() || ev->Get()->GetFuture().HasException()) {
ALS_ERROR(NKikimrServices::METADATA_PROVIDER) << "cannot receive result on initialization";
- OnInternalResultError("cannot receive result from future");
+ OnInternalResultError(Ydb::StatusIds::INTERNAL_ERROR, "cannot receive result from future");
return;
}
auto f = ev->Get()->GetFuture();
@@ -64,7 +64,7 @@ public:
AFL_ERROR(NKikimrServices::METADATA_PROVIDER)("event", "unexpected reply")("error_message", response.DebugString())("request", ProtoRequest.DebugString());
NYql::TIssues issue;
NYql::IssuesFromMessage(response.operation().issues(), issue);
- OnInternalResultError(issue.ToString());
+ OnInternalResultError(response.operation().status(), issue.ToString());
return;
}
OnInternalResultSuccess(std::move(response));
@@ -101,8 +101,8 @@ private:
const TConfig Config;
ui32 Retry = 0;
protected:
- virtual void OnInternalResultError(const TString& errorMessage) override {
- TBase::template Sender<TEvRequestFailed>(errorMessage).SendTo(CallbackActorId);
+ virtual void OnInternalResultError(Ydb::StatusIds::StatusCode status, const TString& errorMessage) override {
+ TBase::template Sender<TEvRequestFailed>(status, errorMessage).SendTo(CallbackActorId);
TBase::PassAway();
}
virtual void OnInternalResultSuccess(TResponse&& response) override {
diff --git a/ydb/services/metadata/request/request_actor_cb.h b/ydb/services/metadata/request/request_actor_cb.h
index 40b8d1ce75b..07bea21c999 100644
--- a/ydb/services/metadata/request/request_actor_cb.h
+++ b/ydb/services/metadata/request/request_actor_cb.h
@@ -26,15 +26,15 @@ private:
static void OnInternalResult(const NThreading::TFuture<TResponse>& f, typename IExternalController<TDialogPolicy>::TPtr externalController) {
if (!f.HasValue() || f.HasException()) {
ALS_ERROR(NKikimrServices::METADATA_PROVIDER) << "cannot receive result on initialization";
- externalController->OnRequestFailed("cannot receive result from future");
+ externalController->OnRequestFailed(Ydb::StatusIds::INTERNAL_ERROR, "cannot receive result from future");
return;
}
TResponse response = f.GetValue();
if (!TOperatorChecker<TResponse>::IsSuccess(response)) {
AFL_ERROR(NKikimrServices::METADATA_PROVIDER)("event", "unexpected reply")("response", response.DebugString());
- NYql::TIssues issue;
- NYql::IssuesFromMessage(response.operation().issues(), issue);
- externalController->OnRequestFailed(issue.ToString());
+ NYql::TIssues issues;
+ NYql::IssuesFromMessage(response.operation().issues(), issues);
+ externalController->OnRequestFailed(response.operation().status(), issues.ToString());
return;
}
externalController->OnRequestResult(std::move(response));
@@ -74,14 +74,14 @@ public:
virtual void OnRequestResult(typename TCurrentDialogPolicy::TResponse&& result) override {
TConclusion<typename TNextController::TDialogPolicy::TRequest> nextRequest = BuildNextRequest(std::move(result));
if (!nextRequest) {
- OnRequestFailed(nextRequest.GetErrorMessage());
+ OnRequestFailed(nextRequest.GetStatus(), nextRequest.GetErrorMessage());
} else {
TYDBOneRequestSender<typename TNextController::TDialogPolicy> req(*nextRequest, UserToken, NextController);
req.Start();
}
}
- virtual void OnRequestFailed(const TString& errorMessage) override final {
- NextController->OnRequestFailed(errorMessage);
+ virtual void OnRequestFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage) override final {
+ NextController->OnRequestFailed(status, errorMessage);
}
IChainController(const NACLib::TUserToken& userToken, std::shared_ptr<TNextController> nextController)
: NextController(nextController)
@@ -149,8 +149,8 @@ public:
ActorId.Send(ActorId, new TEvRequestResult<TDialogPolicy>(std::move(result)));
ActorId.Send(ActorId, new TEvRequestFinished);
}
- virtual void OnRequestFailed(const TString& errorMessage) override {
- ActorId.Send(ActorId, new TEvRequestFailed(errorMessage));
+ virtual void OnRequestFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage) override {
+ ActorId.Send(ActorId, new TEvRequestFailed(status, errorMessage));
}
};
@@ -165,7 +165,7 @@ public:
virtual void OnRequestResult(typename TDialogPolicy::TResponse&&) override {
}
- virtual void OnRequestFailed(const TString& errorMessage) override {
+ virtual void OnRequestFailed(Ydb::StatusIds::StatusCode /*status*/, const TString& errorMessage) override {
ALS_ERROR(NKikimrServices::METADATA_PROVIDER) << "cannot close session with id: " << SessionContext->GetSessionId() << ", reason: " << errorMessage;
}
};
@@ -201,8 +201,8 @@ public:
CloseSession();
}
- virtual void OnRequestFailed(const TString& errorMessage) override {
- ExternalController->OnRequestFailed(errorMessage);
+ virtual void OnRequestFailed(Ydb::StatusIds::StatusCode status, const TString& errorMessage) override {
+ ExternalController->OnRequestFailed(status, errorMessage);
CloseSession();
}
};
diff --git a/ydb/services/metadata/secret/manager.cpp b/ydb/services/metadata/secret/manager.cpp
index 64e643b3dac..01ea816b08e 100644
--- a/ydb/services/metadata/secret/manager.cpp
+++ b/ydb/services/metadata/secret/manager.cpp
@@ -53,7 +53,7 @@ NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus TAccessManag
}
NThreading::TFuture<NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus> TAccessManager::ExecutePrepared(const NKqpProto::TKqpSchemeOperation& /*schemeOperation*/,
- const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
+ const ui32 /*nodeId*/, const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
return NThreading::MakeFuture(NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus::Fail(
"Execution of prepare operations for SECRET_ACCESS objects is not supported"));
}
@@ -112,16 +112,4 @@ void TSecretManager::DoPrepareObjectsBeforeModification(std::vector<TSecret>&& p
TActivationContext::Register(new TSecretPreparationActor(std::move(patchedObjects), controller, context));
}
-NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus TSecretManager::DoPrepare(NKqpProto::TKqpSchemeOperation& /*schemeOperation*/, const NYql::TObjectSettingsImpl& /*settings*/,
- const NMetadata::IClassBehaviour::TPtr& /*manager*/, NMetadata::NModifications::IOperationsManager::TInternalModificationContext& /*context*/) const {
- return NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus::Fail(
- "Prepare operations for SECRET objects are not supported");
-}
-
-NThreading::TFuture<NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus> TSecretManager::ExecutePrepared(const NKqpProto::TKqpSchemeOperation& /*schemeOperation*/,
- const NMetadata::IClassBehaviour::TPtr& /*manager*/, const IOperationsManager::TExternalModificationContext& /*context*/) const {
- return NThreading::MakeFuture(NMetadata::NModifications::IOperationsManager::TYqlConclusionStatus::Fail(
- "Execution of prepare operations for SECRET objects is not supported"));
-}
-
}
diff --git a/ydb/services/metadata/secret/manager.h b/ydb/services/metadata/secret/manager.h
index 5e0e4934b92..d83911f67b1 100644
--- a/ydb/services/metadata/secret/manager.h
+++ b/ydb/services/metadata/secret/manager.h
@@ -14,14 +14,6 @@ protected:
virtual NModifications::TOperationParsingResult DoBuildPatchFromSettings(
const NYql::TObjectSettingsImpl& settings, TInternalModificationContext& context) const override;
-
- virtual IOperationsManager::TYqlConclusionStatus DoPrepare(NKqpProto::TKqpSchemeOperation& schemeOperation, const NYql::TObjectSettingsImpl& settings,
- const NMetadata::IClassBehaviour::TPtr& manager, IOperationsManager::TInternalModificationContext& context) const override;
-
- virtual NThreading::TFuture<IOperationsManager::TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
- const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
-
-public:
};
class TAccessManager: public NModifications::TGenericOperationsManager<TAccess> {
@@ -37,7 +29,7 @@ protected:
const NMetadata::IClassBehaviour::TPtr& manager, IOperationsManager::TInternalModificationContext& context) const override;
virtual NThreading::TFuture<IOperationsManager::TYqlConclusionStatus> ExecutePrepared(const NKqpProto::TKqpSchemeOperation& schemeOperation,
- const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
+ const ui32 nodeId, const NMetadata::IClassBehaviour::TPtr& manager, const IOperationsManager::TExternalModificationContext& context) const override;
};
}