aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgrigoriypisar <grigoriypisar@yandex-team.com>2023-06-22 13:07:54 +0300
committergrigoriypisar <grigoriypisar@yandex-team.com>2023-06-22 13:07:54 +0300
commit666c38adf68920e47b012694189ff22730fc6644 (patch)
tree666a51daeb9e1523c9c7a73056e1995561416ac4
parent70b57dc952c025d8ab1d55eeedfecf69d96e4be3 (diff)
downloadydb-666c38adf68920e47b012694189ff22730fc6644.tar.gz
lease deadline updating
Removed Cerr, fixed deadline time. Added lease updating.
-rw-r--r--ydb/core/kqp/common/events/script_executions.h11
-rw-r--r--ydb/core/kqp/common/simple/kqp_event_ids.h1
-rw-r--r--ydb/core/kqp/proxy_service/kqp_script_executions.cpp114
-rw-r--r--ydb/core/kqp/proxy_service/kqp_script_executions.h3
-rw-r--r--ydb/core/kqp/run_script_actor/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/core/kqp/run_script_actor/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/core/kqp/run_script_actor/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/core/kqp/run_script_actor/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/core/kqp/run_script_actor/kqp_run_script_actor.cpp32
-rw-r--r--ydb/core/kqp/run_script_actor/kqp_run_script_actor.h2
-rw-r--r--ydb/core/kqp/run_script_actor/kqp_run_script_actor_ut.cpp253
-rw-r--r--ydb/core/kqp/run_script_actor/ut/CMakeLists.darwin-x86_64.txt76
-rw-r--r--ydb/core/kqp/run_script_actor/ut/CMakeLists.linux-aarch64.txt79
-rw-r--r--ydb/core/kqp/run_script_actor/ut/CMakeLists.linux-x86_64.txt81
-rw-r--r--ydb/core/kqp/run_script_actor/ut/CMakeLists.txt17
-rw-r--r--ydb/core/kqp/run_script_actor/ut/CMakeLists.windows-x86_64.txt69
-rw-r--r--ydb/core/kqp/run_script_actor/ut/ya.make23
-rw-r--r--ydb/core/kqp/run_script_actor/ya.make4
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, &params);
+ }
+
+ 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
+)