diff options
author | grigoriypisar <grigoriypisar@yandex-team.com> | 2023-06-22 13:07:54 +0300 |
---|---|---|
committer | grigoriypisar <grigoriypisar@yandex-team.com> | 2023-06-22 13:07:54 +0300 |
commit | 666c38adf68920e47b012694189ff22730fc6644 (patch) | |
tree | 666a51daeb9e1523c9c7a73056e1995561416ac4 | |
parent | 70b57dc952c025d8ab1d55eeedfecf69d96e4be3 (diff) | |
download | ydb-666c38adf68920e47b012694189ff22730fc6644.tar.gz |
lease deadline updating
Removed Cerr, fixed deadline time.
Added lease updating.
18 files changed, 759 insertions, 10 deletions
diff --git a/ydb/core/kqp/common/events/script_executions.h b/ydb/core/kqp/common/events/script_executions.h index 56ba62daf6..f2bcba5ee6 100644 --- a/ydb/core/kqp/common/events/script_executions.h +++ b/ydb/core/kqp/common/events/script_executions.h @@ -66,6 +66,17 @@ struct TEvListScriptExecutionOperationsResponse : public NActors::TEventLocal<TE std::vector<Ydb::Operations::Operation> Operations; }; +struct TEvScriptLeaseUpdateResponse : public NActors::TEventLocal<TEvScriptLeaseUpdateResponse, TKqpScriptExecutionEvents::EvScriptLeaseUpdateResponse> { + TEvScriptLeaseUpdateResponse(Ydb::StatusIds::StatusCode status, NYql::TIssues issues) + : Status(status) + , Issues(std::move(issues)) + { + } + + Ydb::StatusIds::StatusCode Status; + NYql::TIssues Issues; +}; + struct TEvCancelScriptExecutionOperation : public NActors::TEventLocal<TEvCancelScriptExecutionOperation, TKqpScriptExecutionEvents::EvCancelScriptExecutionOperation> { explicit TEvCancelScriptExecutionOperation(const TString& database, const NOperationId::TOperationId& id) : Database(database) diff --git a/ydb/core/kqp/common/simple/kqp_event_ids.h b/ydb/core/kqp/common/simple/kqp_event_ids.h index 0720e21c03..35648143ad 100644 --- a/ydb/core/kqp/common/simple/kqp_event_ids.h +++ b/ydb/core/kqp/common/simple/kqp_event_ids.h @@ -134,6 +134,7 @@ struct TKqpScriptExecutionEvents { EvGetScriptExecutionOperationResponse, EvListScriptExecutionOperations, EvListScriptExecutionOperationsResponse, + EvScriptLeaseUpdateResponse, EvCancelScriptExecutionOperation, EvCancelScriptExecutionOperationResponse, EvScriptExecutionFinished, diff --git a/ydb/core/kqp/proxy_service/kqp_script_executions.cpp b/ydb/core/kqp/proxy_service/kqp_script_executions.cpp index 879f25b0d5..a2405dff56 100644 --- a/ydb/core/kqp/proxy_service/kqp_script_executions.cpp +++ b/ydb/core/kqp/proxy_service/kqp_script_executions.cpp @@ -390,11 +390,11 @@ private: class TCreateScriptOperationQuery : public TQueryBase { public: - TCreateScriptOperationQuery(const TString& executionId, const NActors::TActorId& runScriptActorId, const NKikimrKqp::TEvQueryRequest& req, TDuration leaseDuration = TDuration::Zero()) + TCreateScriptOperationQuery(const TString& executionId, const NActors::TActorId& runScriptActorId, const NKikimrKqp::TEvQueryRequest& req, TDuration leaseDuration) : ExecutionId(executionId) , RunScriptActorId(runScriptActorId) , Request(req) - , LeaseDuration(leaseDuration ? leaseDuration : LEASE_DURATION) + , LeaseDuration(leaseDuration) { } @@ -494,8 +494,9 @@ private: }; struct TCreateScriptExecutionActor : public TActorBootstrapped<TCreateScriptExecutionActor> { - TCreateScriptExecutionActor(TEvKqp::TEvScriptRequest::TPtr&& ev) + TCreateScriptExecutionActor(TEvKqp::TEvScriptRequest::TPtr&& ev, TDuration leaseDuration = TDuration::Zero()) : Event(std::move(ev)) + , LeaseDuration(leaseDuration ? leaseDuration : LEASE_DURATION) { } @@ -505,8 +506,8 @@ struct TCreateScriptExecutionActor : public TActorBootstrapped<TCreateScriptExec ExecutionId = CreateGuidAsString(); // Start request - RunScriptActorId = Register(CreateRunScriptActor(ExecutionId, Event->Get()->Record, Event->Get()->Record.GetRequest().GetDatabase(), 1)); - Register(new TCreateScriptOperationQuery(ExecutionId, RunScriptActorId, Event->Get()->Record)); + RunScriptActorId = Register(CreateRunScriptActor(ExecutionId, Event->Get()->Record, Event->Get()->Record.GetRequest().GetDatabase(), 1, LeaseDuration)); + Register(new TCreateScriptOperationQuery(ExecutionId, RunScriptActorId, Event->Get()->Record, LeaseDuration)); } void Handle(TEvPrivate::TEvCreateScriptOperationResponse::TPtr& ev) { @@ -527,6 +528,105 @@ private: TEvKqp::TEvScriptRequest::TPtr Event; TString ExecutionId; NActors::TActorId RunScriptActorId; + TDuration LeaseDuration; +}; + +class TScriptLeaseUpdater : public TQueryBase { +public: + TScriptLeaseUpdater(const TString& database, const TString& executionId, const TInstant& leaseDeadline) + : Database(database) + , ExecutionId(executionId) + , LeaseDeadline(leaseDeadline) + {} + + void OnRunQuery() override { + TString sql = R"( + DECLARE $database AS Text; + DECLARE $execution_id AS Text; + DECLARE $lease_deadline AS Datetime; + + UPDATE `.metadata/script_execution_leases` + SET lease_deadline=$lease_deadline + WHERE database = $database AND execution_id = $execution_id; + )"; + + NYdb::TParamsBuilder params; + params + .AddParam("$database") + .Utf8(Database) + .Build() + .AddParam("$execution_id") + .Utf8(ExecutionId) + .Build() + .AddParam("$lease_deadline") + .Datetime(LeaseDeadline) + .Build(); + + RunDataQuery(sql, ¶ms); + } + + void OnQueryResult() override { + Finish(); + } + + void OnFinish(Ydb::StatusIds::StatusCode status, NYql::TIssues&& issues) override { + Send(Owner, new TEvScriptLeaseUpdateResponse(status, std::move(issues))); + } + +private: + const TString Database; + const TString ExecutionId; + const TInstant LeaseDeadline; +}; + +class TScriptLeaseUpdateActor : public TActorBootstrapped<TScriptLeaseUpdateActor> { + static constexpr ui32 MAX_NUMBER_OF_ATTEMPTS = 5; + +public: + TScriptLeaseUpdateActor(const TActorId& runScriptActorId, const TString& database, const TString& executionId, const TInstant& leaseDeadline) + : RunScriptActorId(runScriptActorId) + , Database(database) + , ExecutionId(executionId) + , LeaseDeadline(leaseDeadline) + {} + + void CreateScriptLeaseUpdater() { + Register(new TScriptLeaseUpdater(Database, ExecutionId, LeaseDeadline)); + } + + void Bootstrap() { + CreateScriptLeaseUpdater(); + Become(&TScriptLeaseUpdateActor::StateFunc); + } + + STRICT_STFUNC(StateFunc, + hFunc(TEvScriptLeaseUpdateResponse, Handle); + ) + + void Handle(TEvScriptLeaseUpdateResponse::TPtr& ev) { + NumberOfAttempts += 1; + Response = std::move(ev); + + if (Response->Get()->Status == Ydb::StatusIds::SUCCESS || NumberOfAttempts == MAX_NUMBER_OF_ATTEMPTS) { + Reply(); + return; + } + + CreateScriptLeaseUpdater(); + } + + void Reply() { + Send(RunScriptActorId, Response->Release().Release()); + PassAway(); + } + +private: + TActorId RunScriptActorId; + TString Database; + TString ExecutionId; + TInstant LeaseDeadline; + TEvScriptLeaseUpdateResponse::TPtr Response; + ui32 NumberOfAttempts = 0; }; class TScriptExecutionFinisherBase : public TQueryBase { @@ -1351,6 +1451,9 @@ NActors::IActor* CreateGetRunScriptActorActor(TEvKqp::TEvGetRunScriptActorReques return new TGetRunScriptActorActor(std::move(ev)); } +NActors::IActor* CreateScriptLeaseUpdateActor(const TActorId& runScriptActorId, const TString& database, const TString& executionId, const TInstant& leaseDeadline) { + return new TScriptLeaseUpdateActor(runScriptActorId, database, executionId, leaseDeadline); +} namespace NPrivate { @@ -1363,4 +1466,5 @@ NActors::IActor* CreateCheckLeaseStatusActor(const TString& database, const TStr } } // namespace NPrivate + } // namespace NKikimr::NKqp diff --git a/ydb/core/kqp/proxy_service/kqp_script_executions.h b/ydb/core/kqp/proxy_service/kqp_script_executions.h index 94cf8bd93a..ed42dc2390 100644 --- a/ydb/core/kqp/proxy_service/kqp_script_executions.h +++ b/ydb/core/kqp/proxy_service/kqp_script_executions.h @@ -35,4 +35,7 @@ NActors::IActor* CreateScriptExecutionFinisher( NYql::TIssues issues ); +// Updates lease deadline in database. +NActors::IActor* CreateScriptLeaseUpdateActor(const TActorId& runScriptActorId, const TString& database, const TString& executionId, const TInstant& leaseDeadline); + } // namespace NKikimr::NKqp diff --git a/ydb/core/kqp/run_script_actor/CMakeLists.darwin-x86_64.txt b/ydb/core/kqp/run_script_actor/CMakeLists.darwin-x86_64.txt index a612f9027d..10fc76583e 100644 --- a/ydb/core/kqp/run_script_actor/CMakeLists.darwin-x86_64.txt +++ b/ydb/core/kqp/run_script_actor/CMakeLists.darwin-x86_64.txt @@ -6,6 +6,7 @@ # original buildsystem will not be accepted. +add_subdirectory(ut) add_library(core-kqp-run_script_actor) target_compile_options(core-kqp-run_script_actor PRIVATE diff --git a/ydb/core/kqp/run_script_actor/CMakeLists.linux-aarch64.txt b/ydb/core/kqp/run_script_actor/CMakeLists.linux-aarch64.txt index fea0e3d0a0..211a247244 100644 --- a/ydb/core/kqp/run_script_actor/CMakeLists.linux-aarch64.txt +++ b/ydb/core/kqp/run_script_actor/CMakeLists.linux-aarch64.txt @@ -6,6 +6,7 @@ # original buildsystem will not be accepted. +add_subdirectory(ut) add_library(core-kqp-run_script_actor) target_compile_options(core-kqp-run_script_actor PRIVATE diff --git a/ydb/core/kqp/run_script_actor/CMakeLists.linux-x86_64.txt b/ydb/core/kqp/run_script_actor/CMakeLists.linux-x86_64.txt index fea0e3d0a0..211a247244 100644 --- a/ydb/core/kqp/run_script_actor/CMakeLists.linux-x86_64.txt +++ b/ydb/core/kqp/run_script_actor/CMakeLists.linux-x86_64.txt @@ -6,6 +6,7 @@ # original buildsystem will not be accepted. +add_subdirectory(ut) add_library(core-kqp-run_script_actor) target_compile_options(core-kqp-run_script_actor PRIVATE diff --git a/ydb/core/kqp/run_script_actor/CMakeLists.windows-x86_64.txt b/ydb/core/kqp/run_script_actor/CMakeLists.windows-x86_64.txt index a612f9027d..10fc76583e 100644 --- a/ydb/core/kqp/run_script_actor/CMakeLists.windows-x86_64.txt +++ b/ydb/core/kqp/run_script_actor/CMakeLists.windows-x86_64.txt @@ -6,6 +6,7 @@ # original buildsystem will not be accepted. +add_subdirectory(ut) add_library(core-kqp-run_script_actor) target_compile_options(core-kqp-run_script_actor PRIVATE diff --git a/ydb/core/kqp/run_script_actor/kqp_run_script_actor.cpp b/ydb/core/kqp/run_script_actor/kqp_run_script_actor.cpp index bf3a9148cf..40652c88a6 100644 --- a/ydb/core/kqp/run_script_actor/kqp_run_script_actor.cpp +++ b/ydb/core/kqp/run_script_actor/kqp_run_script_actor.cpp @@ -29,6 +29,7 @@ namespace { constexpr ui64 RESULT_SIZE_LIMIT = 10_MB; constexpr int RESULT_ROWS_LIMIT = 1000; +constexpr ui32 LEASE_UPDATE_FREQUENCY = 2; class TRunScriptActor : public NActors::TActorBootstrapped<TRunScriptActor> { enum class ERunState { @@ -40,16 +41,18 @@ class TRunScriptActor : public NActors::TActorBootstrapped<TRunScriptActor> { Finished, }; public: - TRunScriptActor(const TString& executionId, const NKikimrKqp::TEvQueryRequest& request, const TString& database, ui64 leaseGeneration) + TRunScriptActor(const TString& executionId, const NKikimrKqp::TEvQueryRequest& request, const TString& database, ui64 leaseGeneration, TDuration leaseDuration) : ExecutionId(executionId) , Request(request) , Database(database) , LeaseGeneration(leaseGeneration) + , LeaseDuration(leaseDuration) {} static constexpr char ActorName[] = "KQP_RUN_SCRIPT_ACTOR"; void Bootstrap() { + Schedule(LeaseDuration / LEASE_UPDATE_FREQUENCY, new NActors::TEvents::TEvWakeup(1)); Become(&TRunScriptActor::StateFunc); } @@ -65,6 +68,7 @@ private: hFunc(TEvKqp::TEvCancelQueryResponse, Handle); hFunc(TEvKqp::TEvCancelScriptExecutionRequest, Handle); hFunc(TEvScriptExecutionFinished, Handle); + hFunc(TEvScriptLeaseUpdateResponse, Handle); ) void SendToKqpProxy(THolder<NActors::IEventBase> ev) { @@ -121,13 +125,31 @@ private: } // TODO: remove this after there will be a normal way to store results and generate execution id - void Handle(NActors::TEvents::TEvWakeup::TPtr&) { + void Handle(NActors::TEvents::TEvWakeup::TPtr& ev) { + if (ev->Get()->Tag == 1) { + if (!IsLeaseUpdateRunning) { + RegisterWithSameMailbox(CreateScriptLeaseUpdateActor(SelfId(), Database, ExecutionId, TInstant::Now() + LeaseDuration)); + IsLeaseUpdateRunning = true; + } + + Schedule(LeaseDuration / LEASE_UPDATE_FREQUENCY, new NActors::TEvents::TEvWakeup(1)); + return; + } + if (RunState == ERunState::Created) { RunState = ERunState::Running; CreateSession(); } } + void Handle(TEvScriptLeaseUpdateResponse::TPtr& ev) { + if (ev->Get()->Status != Ydb::StatusIds::SUCCESS) { + Finish(ev->Get()->Status); + } else { + IsLeaseUpdateRunning = false; + } + } + // Event in case of error in registering script in database // Just pass away, because we have not started execution. void Handle(NActors::TEvents::TEvPoison::TPtr&) { @@ -330,7 +352,9 @@ private: const NKikimrKqp::TEvQueryRequest Request; const TString Database; const ui64 LeaseGeneration; + const TDuration LeaseDuration; TString SessionId; + bool IsLeaseUpdateRunning = false; ERunState RunState = ERunState::Created; std::forward_list<TEvKqp::TEvCancelScriptExecutionRequest::TPtr> CancelRequests; @@ -342,8 +366,8 @@ private: } // namespace -NActors::IActor* CreateRunScriptActor(const TString& executionId, const NKikimrKqp::TEvQueryRequest& request, const TString& database, ui64 leaseGeneration) { - return new TRunScriptActor(executionId, request, database, leaseGeneration); +NActors::IActor* CreateRunScriptActor(const TString& executionId, const NKikimrKqp::TEvQueryRequest& request, const TString& database, ui64 leaseGeneration, TDuration leaseDuration) { + return new TRunScriptActor(executionId, request, database, leaseGeneration, leaseDuration); } } // namespace NKikimr::NKqp diff --git a/ydb/core/kqp/run_script_actor/kqp_run_script_actor.h b/ydb/core/kqp/run_script_actor/kqp_run_script_actor.h index 96b24f4aeb..f87ba6ffd3 100644 --- a/ydb/core/kqp/run_script_actor/kqp_run_script_actor.h +++ b/ydb/core/kqp/run_script_actor/kqp_run_script_actor.h @@ -9,6 +9,6 @@ namespace NKikimr::NKqp { struct TEvKqpRunScriptActor { }; -NActors::IActor* CreateRunScriptActor(const TString& executionId, const NKikimrKqp::TEvQueryRequest& request, const TString& database, ui64 leaseGeneration); +NActors::IActor* CreateRunScriptActor(const TString& executionId, const NKikimrKqp::TEvQueryRequest& request, const TString& database, ui64 leaseGeneration, TDuration leaseDuration); } // namespace NKikimr::NKqp diff --git a/ydb/core/kqp/run_script_actor/kqp_run_script_actor_ut.cpp b/ydb/core/kqp/run_script_actor/kqp_run_script_actor_ut.cpp new file mode 100644 index 0000000000..c1348543f3 --- /dev/null +++ b/ydb/core/kqp/run_script_actor/kqp_run_script_actor_ut.cpp @@ -0,0 +1,253 @@ +#include "kqp_run_script_actor.h" + +#include <ydb/core/kqp/proxy_service/kqp_script_executions.h> +#include <ydb/core/kqp/proxy_service/kqp_script_executions_impl.h> + +#include <ydb/core/testlib/test_client.h> +#include <ydb/core/testlib/basics/appdata.h> +#include <ydb/services/ydb/ydb_common_ut.h> +#include <ydb/public/sdk/cpp/client/ydb_driver/driver.h> +#include <ydb/public/sdk/cpp/client/ydb_table/table.h> + +#include <library/cpp/actors/interconnect/interconnect_impl.h> + +namespace NKikimr::NKqp { + +using namespace Tests; +using namespace NSchemeShard; + +namespace { + +constexpr TDuration TestLeaseDuration = TDuration::Seconds(1); +const TString TestDatabase = "test_db"; + +struct TScriptExecutionsYdbSetup { + TScriptExecutionsYdbSetup() { + Init(); + } + + void Init() { + MsgBusPort = PortManager.GetPort(2134); + GrpcPort = PortManager.GetPort(2135); + ServerSettings = MakeHolder<Tests::TServerSettings>(MsgBusPort); + ServerSettings->SetEnableScriptExecutionOperations(true); + ServerSettings->SetGrpcPort(GrpcPort); + Server = MakeHolder<Tests::TServer>(*ServerSettings); + Client = MakeHolder<Tests::TClient>(*ServerSettings); + + // Logging + GetRuntime()->SetLogPriority(NKikimrServices::KQP_PROXY, NActors::NLog::PRI_DEBUG); + Server->EnableGRpc(GrpcPort); + Client->InitRootScheme(); + + WaitInitScriptExecutionsTables(); + + // Init sdk + NYdb::TDriverConfig driverCfg; + driverCfg + .SetEndpoint(TStringBuilder() << "localhost:" << GrpcPort) + .SetDatabase(Tests::TestDomainName); + YdbDriver = MakeHolder<NYdb::TDriver>(driverCfg); + TableClient = MakeHolder<NYdb::NTable::TTableClient>(*YdbDriver); + auto createSessionResult = TableClient->CreateSession().ExtractValueSync(); + UNIT_ASSERT_C(createSessionResult.IsSuccess(), createSessionResult.GetIssues().ToString()); + TableClientSession = MakeHolder<NYdb::NTable::TSession>(createSessionResult.GetSession()); + } + + TTestActorRuntime* GetRuntime() { + return Server->GetRuntime(); + } + + void WaitInitScriptExecutionsTables() { + while (!RunSelect42Script()) { + Sleep(TDuration::MilliSeconds(10)); + } + } + + bool RunSelect42Script(ui32 node = 0) { + TActorId edgeActor = GetRuntime()->AllocateEdgeActor(node); + + TActorId kqpProxy = MakeKqpProxyID(GetRuntime()->GetNodeId(node)); + + auto ev = MakeHolder<TEvKqp::TEvScriptRequest>(); + auto& req = *ev->Record.MutableRequest(); + req.SetQuery("SELECT 42"); + req.SetType(NKikimrKqp::QUERY_TYPE_SQL_GENERIC_SCRIPT); + req.SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE); + req.SetDatabase(ServerSettings->DomainName); + + GetRuntime()->Send(new IEventHandle(kqpProxy, edgeActor, ev.Release()), node); + + auto reply = GetRuntime()->GrabEdgeEvent<TEvKqp::TEvScriptResponse>(edgeActor); + Ydb::StatusIds::StatusCode status = reply->Get()->Status; + return status == Ydb::StatusIds::SUCCESS; + } + + // Creates query in db. Returns execution id + TString CreateQueryInDb(const TString& query = "SELECT 42", TDuration leaseDuration = TestLeaseDuration) { + TString executionId = CreateGuidAsString(); + NKikimrKqp::TEvQueryRequest req; + req.MutableRequest()->SetDatabase(TestDatabase); + req.MutableRequest()->SetQuery(query); + req.MutableRequest()->SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE); + const ui32 node = 0; + TActorId edgeActor = GetRuntime()->AllocateEdgeActor(node); + GetRuntime()->Register(NPrivate::CreateCreateScriptOperationQueryActor(executionId, NActors::TActorId(), req, leaseDuration), 0, 0, TMailboxType::Simple, 0, edgeActor); + + auto reply = GetRuntime()->GrabEdgeEvent<NPrivate::TEvPrivate::TEvCreateScriptOperationResponse>(edgeActor); + UNIT_ASSERT(reply->Get()->Status == Ydb::StatusIds::SUCCESS); + UNIT_ASSERT_VALUES_EQUAL(executionId, reply->Get()->ExecutionId); + return reply->Get()->ExecutionId; + } + + NPrivate::TEvPrivate::TEvLeaseCheckResult::TPtr CheckLeaseStatus(const TString& executionId) { + const ui32 node = 0; + TActorId edgeActor = GetRuntime()->AllocateEdgeActor(node); + GetRuntime()->Register(NPrivate::CreateCheckLeaseStatusActor(TestDatabase, executionId), 0, 0, TMailboxType::Simple, 0, edgeActor); + + auto reply = GetRuntime()->GrabEdgeEvent<NPrivate::TEvPrivate::TEvLeaseCheckResult>(edgeActor); + UNIT_ASSERT(reply->Get()->Status == Ydb::StatusIds::SUCCESS); + return reply; + } + +public: + TPortManager PortManager; + ui16 MsgBusPort = 0; + ui16 GrpcPort = 0; + THolder<Tests::TServerSettings> ServerSettings; + THolder<Tests::TServer> Server; + THolder<Tests::TClient> Client; + THolder<NYdb::TDriver> YdbDriver; + THolder<NYdb::NTable::TTableClient> TableClient; + THolder<NYdb::NTable::TSession> TableClientSession; +}; + +} + +Y_UNIT_TEST_SUITE(RunScriptActorTest) { + Y_UNIT_TEST(CheckLeaseUpdater) { + TScriptExecutionsYdbSetup ydb; + + const TString executionId = ydb.CreateQueryInDb(); + UNIT_ASSERT(executionId); + + const TInstant startLeaseTime = TInstant::Now(); + + auto checkLeaseExistance = [&](bool expectedExistance, TMaybe<i32> expectedStatus) { + TStringBuilder sql; + sql << + R"( + SELECT COUNT(*) + FROM `.metadata/script_execution_leases` + WHERE database = $database AND execution_id = $execution_id; + + SELECT operation_status + FROM `.metadata/script_executions` + WHERE database = $database AND execution_id = $execution_id; + )"; + + NYdb::TParamsBuilder params; + params + .AddParam("$database") + .Utf8(TestDatabase) + .Build() + .AddParam("$execution_id") + .Utf8(executionId) + .Build(); + + auto result = ydb.TableClientSession->ExecuteDataQuery(sql, NYdb::NTable::TTxControl::BeginTx().CommitTx(), params.Build()).ExtractValueSync(); + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + + NYdb::TResultSetParser rs1 = result.GetResultSetParser(0); + UNIT_ASSERT(rs1.TryNextRow()); + + auto count = rs1.ColumnParser(0).GetUint64(); + UNIT_ASSERT_VALUES_EQUAL(count, expectedExistance ? 1 : 0); + + NYdb::TResultSetParser rs2 = result.GetResultSetParser(1); + UNIT_ASSERT(rs2.TryNextRow()); + + UNIT_ASSERT_VALUES_EQUAL(rs2.ColumnParser("operation_status").GetOptionalInt32(), expectedStatus); + }; + + checkLeaseExistance(true, Nothing()); + auto checkResult1 = ydb.CheckLeaseStatus(executionId); + + const TDuration checkTime = TInstant::Now() - startLeaseTime; + if (checkTime < TestLeaseDuration) { + UNIT_ASSERT_VALUES_EQUAL(checkResult1->Get()->OperationStatus, Nothing()); + checkLeaseExistance(true, Nothing()); + SleepUntil(startLeaseTime + TestLeaseDuration); + } + + TDuration maximalWaitTime = TDuration::Seconds(10); + ydb.GetRuntime()->Register(CreateScriptLeaseUpdateActor(ydb.GetRuntime()->AllocateEdgeActor(), TestDatabase, executionId, TInstant::Now() + 2 * maximalWaitTime)); + auto updateResponse = ydb.GetRuntime()->GrabEdgeEvent<TEvScriptLeaseUpdateResponse>(maximalWaitTime); + + if (updateResponse != nullptr) { + UNIT_ASSERT_C(updateResponse->Status == Ydb::StatusIds::SUCCESS, updateResponse->Issues.ToString()); + + auto checkResult2 = ydb.CheckLeaseStatus(executionId); + UNIT_ASSERT_VALUES_EQUAL(checkResult2->Get()->OperationStatus, Nothing()); + checkLeaseExistance(true, Nothing()); + } + } + + Y_UNIT_TEST(CheckRunScriptActorLeaseUpdater) { + TScriptExecutionsYdbSetup ydb; + + const TString executionId = ydb.CreateQueryInDb(); + UNIT_ASSERT(executionId); + + auto checkLeaseExistance = [&](bool expectedExistance, TMaybe<i32> expectedStatus) { + TStringBuilder sql; + sql << + R"( + SELECT COUNT(*) + FROM `.metadata/script_execution_leases` + WHERE database = $database AND execution_id = $execution_id; + + SELECT operation_status + FROM `.metadata/script_executions` + WHERE database = $database AND execution_id = $execution_id; + )"; + + NYdb::TParamsBuilder params; + params + .AddParam("$database") + .Utf8(TestDatabase) + .Build() + .AddParam("$execution_id") + .Utf8(executionId) + .Build(); + + auto result = ydb.TableClientSession->ExecuteDataQuery(sql, NYdb::NTable::TTxControl::BeginTx().CommitTx(), params.Build()).ExtractValueSync(); + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + + NYdb::TResultSetParser rs1 = result.GetResultSetParser(0); + UNIT_ASSERT(rs1.TryNextRow()); + + auto count = rs1.ColumnParser(0).GetUint64(); + UNIT_ASSERT_VALUES_EQUAL(count, expectedExistance ? 1 : 0); + + NYdb::TResultSetParser rs2 = result.GetResultSetParser(1); + UNIT_ASSERT(rs2.TryNextRow()); + + UNIT_ASSERT_VALUES_EQUAL(rs2.ColumnParser("operation_status").GetOptionalInt32(), expectedStatus); + }; + + checkLeaseExistance(true, Nothing()); + ydb.GetRuntime()->Register(CreateRunScriptActor(executionId, NKikimrKqp::TEvQueryRequest(), TestDatabase, 1, TestLeaseDuration)); + + const ui32 numberOfTests = 3; + for (ui32 i = 0; i < numberOfTests; ++i) { + Sleep(TestLeaseDuration); + + auto checkResult = ydb.CheckLeaseStatus(executionId); + UNIT_ASSERT_VALUES_EQUAL(checkResult->Get()->OperationStatus, Nothing()); + checkLeaseExistance(true, Nothing()); + } + } +} + +} diff --git a/ydb/core/kqp/run_script_actor/ut/CMakeLists.darwin-x86_64.txt b/ydb/core/kqp/run_script_actor/ut/CMakeLists.darwin-x86_64.txt new file mode 100644 index 0000000000..fb0cde92da --- /dev/null +++ b/ydb/core/kqp/run_script_actor/ut/CMakeLists.darwin-x86_64.txt @@ -0,0 +1,76 @@ + +# This file was generated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + + +add_executable(ydb-core-kqp-run_script_actor-ut) +target_compile_options(ydb-core-kqp-run_script_actor-ut PRIVATE + -DUSE_CURRENT_UDF_ABI_VERSION +) +target_include_directories(ydb-core-kqp-run_script_actor-ut PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/core/kqp/run_script_actor +) +target_link_libraries(ydb-core-kqp-run_script_actor-ut PUBLIC + contrib-libs-cxxsupp + yutil + library-cpp-cpuid_check + cpp-testing-unittest_main + core-kqp-run_script_actor + cpp-threading-local_executor + ydb-core-kqp + kqp-ut-common + yql-sql-pg + cpp-client-ydb_operation + client-ydb_types-operation +) +target_link_options(ydb-core-kqp-run_script_actor-ut PRIVATE + -Wl,-platform_version,macos,11.0,11.0 + -fPIC + -fPIC + -framework + CoreFoundation +) +target_sources(ydb-core-kqp-run_script_actor-ut PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/core/kqp/run_script_actor/kqp_run_script_actor_ut.cpp +) +set_property( + TARGET + ydb-core-kqp-run_script_actor-ut + PROPERTY + SPLIT_FACTOR + 50 +) +add_yunittest( + NAME + ydb-core-kqp-run_script_actor-ut + TEST_TARGET + ydb-core-kqp-run_script_actor-ut + TEST_ARG + --print-before-suite + --print-before-test + --fork-tests + --print-times + --show-fails +) +set_yunittest_property( + TEST + ydb-core-kqp-run_script_actor-ut + PROPERTY + LABELS + MEDIUM +) +set_yunittest_property( + TEST + ydb-core-kqp-run_script_actor-ut + PROPERTY + PROCESSORS + 1 +) +target_allocator(ydb-core-kqp-run_script_actor-ut + system_allocator +) +vcs_info(ydb-core-kqp-run_script_actor-ut) diff --git a/ydb/core/kqp/run_script_actor/ut/CMakeLists.linux-aarch64.txt b/ydb/core/kqp/run_script_actor/ut/CMakeLists.linux-aarch64.txt new file mode 100644 index 0000000000..c1ba15b91d --- /dev/null +++ b/ydb/core/kqp/run_script_actor/ut/CMakeLists.linux-aarch64.txt @@ -0,0 +1,79 @@ + +# This file was generated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + + +add_executable(ydb-core-kqp-run_script_actor-ut) +target_compile_options(ydb-core-kqp-run_script_actor-ut PRIVATE + -DUSE_CURRENT_UDF_ABI_VERSION +) +target_include_directories(ydb-core-kqp-run_script_actor-ut PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/core/kqp/run_script_actor +) +target_link_libraries(ydb-core-kqp-run_script_actor-ut PUBLIC + contrib-libs-linux-headers + contrib-libs-cxxsupp + yutil + cpp-testing-unittest_main + core-kqp-run_script_actor + cpp-threading-local_executor + ydb-core-kqp + kqp-ut-common + yql-sql-pg + cpp-client-ydb_operation + client-ydb_types-operation +) +target_link_options(ydb-core-kqp-run_script_actor-ut PRIVATE + -ldl + -lrt + -Wl,--no-as-needed + -fPIC + -fPIC + -lpthread + -lrt + -ldl +) +target_sources(ydb-core-kqp-run_script_actor-ut PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/core/kqp/run_script_actor/kqp_run_script_actor_ut.cpp +) +set_property( + TARGET + ydb-core-kqp-run_script_actor-ut + PROPERTY + SPLIT_FACTOR + 50 +) +add_yunittest( + NAME + ydb-core-kqp-run_script_actor-ut + TEST_TARGET + ydb-core-kqp-run_script_actor-ut + TEST_ARG + --print-before-suite + --print-before-test + --fork-tests + --print-times + --show-fails +) +set_yunittest_property( + TEST + ydb-core-kqp-run_script_actor-ut + PROPERTY + LABELS + MEDIUM +) +set_yunittest_property( + TEST + ydb-core-kqp-run_script_actor-ut + PROPERTY + PROCESSORS + 1 +) +target_allocator(ydb-core-kqp-run_script_actor-ut + cpp-malloc-jemalloc +) +vcs_info(ydb-core-kqp-run_script_actor-ut) diff --git a/ydb/core/kqp/run_script_actor/ut/CMakeLists.linux-x86_64.txt b/ydb/core/kqp/run_script_actor/ut/CMakeLists.linux-x86_64.txt new file mode 100644 index 0000000000..90991ca609 --- /dev/null +++ b/ydb/core/kqp/run_script_actor/ut/CMakeLists.linux-x86_64.txt @@ -0,0 +1,81 @@ + +# This file was generated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + + +add_executable(ydb-core-kqp-run_script_actor-ut) +target_compile_options(ydb-core-kqp-run_script_actor-ut PRIVATE + -DUSE_CURRENT_UDF_ABI_VERSION +) +target_include_directories(ydb-core-kqp-run_script_actor-ut PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/core/kqp/run_script_actor +) +target_link_libraries(ydb-core-kqp-run_script_actor-ut PUBLIC + contrib-libs-linux-headers + contrib-libs-cxxsupp + yutil + library-cpp-cpuid_check + cpp-testing-unittest_main + core-kqp-run_script_actor + cpp-threading-local_executor + ydb-core-kqp + kqp-ut-common + yql-sql-pg + cpp-client-ydb_operation + client-ydb_types-operation +) +target_link_options(ydb-core-kqp-run_script_actor-ut PRIVATE + -ldl + -lrt + -Wl,--no-as-needed + -fPIC + -fPIC + -lpthread + -lrt + -ldl +) +target_sources(ydb-core-kqp-run_script_actor-ut PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/core/kqp/run_script_actor/kqp_run_script_actor_ut.cpp +) +set_property( + TARGET + ydb-core-kqp-run_script_actor-ut + PROPERTY + SPLIT_FACTOR + 50 +) +add_yunittest( + NAME + ydb-core-kqp-run_script_actor-ut + TEST_TARGET + ydb-core-kqp-run_script_actor-ut + TEST_ARG + --print-before-suite + --print-before-test + --fork-tests + --print-times + --show-fails +) +set_yunittest_property( + TEST + ydb-core-kqp-run_script_actor-ut + PROPERTY + LABELS + MEDIUM +) +set_yunittest_property( + TEST + ydb-core-kqp-run_script_actor-ut + PROPERTY + PROCESSORS + 1 +) +target_allocator(ydb-core-kqp-run_script_actor-ut + cpp-malloc-tcmalloc + libs-tcmalloc-no_percpu_cache +) +vcs_info(ydb-core-kqp-run_script_actor-ut) diff --git a/ydb/core/kqp/run_script_actor/ut/CMakeLists.txt b/ydb/core/kqp/run_script_actor/ut/CMakeLists.txt new file mode 100644 index 0000000000..f8b31df0c1 --- /dev/null +++ b/ydb/core/kqp/run_script_actor/ut/CMakeLists.txt @@ -0,0 +1,17 @@ + +# This file was generated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + +if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" AND NOT HAVE_CUDA) + include(CMakeLists.linux-aarch64.txt) +elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + include(CMakeLists.darwin-x86_64.txt) +elseif (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" AND NOT HAVE_CUDA) + include(CMakeLists.windows-x86_64.txt) +elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT HAVE_CUDA) + include(CMakeLists.linux-x86_64.txt) +endif() diff --git a/ydb/core/kqp/run_script_actor/ut/CMakeLists.windows-x86_64.txt b/ydb/core/kqp/run_script_actor/ut/CMakeLists.windows-x86_64.txt new file mode 100644 index 0000000000..13f5dbd403 --- /dev/null +++ b/ydb/core/kqp/run_script_actor/ut/CMakeLists.windows-x86_64.txt @@ -0,0 +1,69 @@ + +# This file was generated by the build system used internally in the Yandex monorepo. +# Only simple modifications are allowed (adding source-files to targets, adding simple properties +# like target_include_directories). These modifications will be ported to original +# ya.make files by maintainers. Any complex modifications which can't be ported back to the +# original buildsystem will not be accepted. + + + +add_executable(ydb-core-kqp-run_script_actor-ut) +target_compile_options(ydb-core-kqp-run_script_actor-ut PRIVATE + -DUSE_CURRENT_UDF_ABI_VERSION +) +target_include_directories(ydb-core-kqp-run_script_actor-ut PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/core/kqp/run_script_actor +) +target_link_libraries(ydb-core-kqp-run_script_actor-ut PUBLIC + contrib-libs-cxxsupp + yutil + library-cpp-cpuid_check + cpp-testing-unittest_main + core-kqp-run_script_actor + cpp-threading-local_executor + ydb-core-kqp + kqp-ut-common + yql-sql-pg + cpp-client-ydb_operation + client-ydb_types-operation +) +target_sources(ydb-core-kqp-run_script_actor-ut PRIVATE + ${CMAKE_SOURCE_DIR}/ydb/core/kqp/run_script_actor/kqp_run_script_actor_ut.cpp +) +set_property( + TARGET + ydb-core-kqp-run_script_actor-ut + PROPERTY + SPLIT_FACTOR + 50 +) +add_yunittest( + NAME + ydb-core-kqp-run_script_actor-ut + TEST_TARGET + ydb-core-kqp-run_script_actor-ut + TEST_ARG + --print-before-suite + --print-before-test + --fork-tests + --print-times + --show-fails +) +set_yunittest_property( + TEST + ydb-core-kqp-run_script_actor-ut + PROPERTY + LABELS + MEDIUM +) +set_yunittest_property( + TEST + ydb-core-kqp-run_script_actor-ut + PROPERTY + PROCESSORS + 1 +) +target_allocator(ydb-core-kqp-run_script_actor-ut + system_allocator +) +vcs_info(ydb-core-kqp-run_script_actor-ut) diff --git a/ydb/core/kqp/run_script_actor/ut/ya.make b/ydb/core/kqp/run_script_actor/ut/ya.make new file mode 100644 index 0000000000..affac6f148 --- /dev/null +++ b/ydb/core/kqp/run_script_actor/ut/ya.make @@ -0,0 +1,23 @@ +UNITTEST_FOR(ydb/core/kqp/run_script_actor) + +FORK_SUBTESTS() +SPLIT_FACTOR(50) + +SIZE(MEDIUM) + +SRCS( + kqp_run_script_actor_ut.cpp +) + +PEERDIR( + library/cpp/threading/local_executor + ydb/core/kqp + ydb/core/kqp/ut/common + ydb/library/yql/sql/pg + ydb/public/sdk/cpp/client/ydb_operation + ydb/public/sdk/cpp/client/ydb_types/operation +) + +YQL_LAST_ABI_VERSION() + +END()
\ No newline at end of file diff --git a/ydb/core/kqp/run_script_actor/ya.make b/ydb/core/kqp/run_script_actor/ya.make index 6996ff272e..8374348187 100644 --- a/ydb/core/kqp/run_script_actor/ya.make +++ b/ydb/core/kqp/run_script_actor/ya.make @@ -16,3 +16,7 @@ PEERDIR( YQL_LAST_ABI_VERSION() END() + +RECURSE_FOR_TESTS( + ut +) |