From e2188c333e0901c54d705ba05fed44c0ab25b700 Mon Sep 17 00:00:00 2001 From: Pisarenko Grigoriy <79596613+GrigoriyPA@users.noreply.github.com> Date: Fri, 19 Apr 2024 19:01:33 +0300 Subject: [PATCH] Fix memory leak in external data source manager (#3922) --- .../external_data_source/manager.cpp | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) 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 5ff29425b7cd..6e57ad6bf9e7 100644 --- a/ydb/core/kqp/gateway/behaviour/external_data_source/manager.cpp +++ b/ydb/core/kqp/gateway/behaviour/external_data_source/manager.cpp @@ -182,22 +182,25 @@ NThreading::TFuture TExternalD TInternalModificationContext& context) const { using TRequest = TEvTxUserProxy::TEvProposeTransaction; - auto ev = MakeHolder(); - ev->Record.SetDatabaseName(context.GetExternalData().GetDatabase()); - if (context.GetExternalData().GetUserToken()) { - ev->Record.SetUserToken(context.GetExternalData().GetUserToken()->GetSerializedToken()); - } - - auto& schemeTx = *ev->Record.MutableTransaction()->MutableModifyScheme(); + NKikimrSchemeOp::TModifyScheme schemeTx; FillCreateExternalDataSourceCommand(schemeTx, settings, context); auto validationFuture = ValidateCreateExternalDatasource(schemeTx.GetCreateExternalDataSource(), context); - return validationFuture.Apply([ev = ev.Release(), context, schemeTx](const NThreading::TFuture& f) { + return validationFuture.Apply([context, schemeTx](const NThreading::TFuture& f) { if (const auto& value = f.GetValue(); value.IsFail()) { return NThreading::MakeFuture(value); } - return SendSchemeRequest(ev, context.GetExternalData().GetActorSystem(), schemeTx.GetFailedOnAlreadyExists(), schemeTx.GetSuccessOnNotExist()); + + auto ev = MakeHolder(); + ev->Record.SetDatabaseName(context.GetExternalData().GetDatabase()); + if (context.GetExternalData().GetUserToken()) { + ev->Record.SetUserToken(context.GetExternalData().GetUserToken()->GetSerializedToken()); + } + + *ev->Record.MutableTransaction()->MutableModifyScheme() = schemeTx; + + return SendSchemeRequest(ev.Release(), context.GetExternalData().GetActorSystem(), schemeTx.GetFailedOnAlreadyExists(), schemeTx.GetSuccessOnNotExist()); }); } @@ -256,14 +259,8 @@ NThreading::TFuture(); - ev->Record.SetDatabaseName(context.GetDatabase()); - if (context.GetUserToken()) { - ev->Record.SetUserToken(context.GetUserToken()->GetSerializedToken()); - } - auto validationFuture = NThreading::MakeFuture(TExternalDataSourceManager::TYqlConclusionStatus::Success()); - auto& schemeTx = *ev->Record.MutableTransaction()->MutableModifyScheme(); + NKikimrSchemeOp::TModifyScheme schemeTx; switch (schemeOperation.GetOperationCase()) { case NKqpProto::TKqpSchemeOperation::kCreateExternalDataSource: { const auto& createExternalDataSource = schemeOperation.GetCreateExternalDataSource(); @@ -282,11 +279,20 @@ NThreading::TFuture& f) { + return validationFuture.Apply([context, schemeTx](const NThreading::TFuture& f) { if (const auto& value = f.GetValue(); value.IsFail()) { return NThreading::MakeFuture(value); } - return SendSchemeRequest(ev, context.GetActorSystem(), schemeTx.GetFailedOnAlreadyExists(), schemeTx.GetSuccessOnNotExist()); + + auto ev = MakeHolder(); + ev->Record.SetDatabaseName(context.GetDatabase()); + if (context.GetUserToken()) { + ev->Record.SetUserToken(context.GetUserToken()->GetSerializedToken()); + } + + *ev->Record.MutableTransaction()->MutableModifyScheme() = schemeTx; + + return SendSchemeRequest(ev.Release(), context.GetActorSystem(), schemeTx.GetFailedOnAlreadyExists(), schemeTx.GetSuccessOnNotExist()); }); }