1414#include < ydb/core/kqp/rm_service/kqp_rm_service.h>
1515#include < ydb/core/kqp/runtime/kqp_read_actor.h>
1616#include < ydb/core/kqp/runtime/kqp_read_iterator_common.h>
17+ #include < ydb/core/kqp/runtime/kqp_compute_scheduler.h>
1718#include < ydb/core/kqp/common/kqp_resolve.h>
1819
1920#include < ydb/library/wilson_ids/wilson.h>
@@ -174,9 +175,10 @@ class TKqpNodeService : public TActorBootstrapped<TKqpNodeService> {
174175
175176private:
176177 STATEFN (WorkState) {
178+ Scheduler.AdvanceTime (TlsActivationContext->Monotonic ());
177179 switch (ev->GetTypeRewrite ()) {
178180 hFunc (TEvKqpNode::TEvStartKqpTasksRequest, HandleWork);
179- hFunc (TEvKqpNode:: TEvFinishKqpTask, HandleWork); // used only for unit tests
181+ hFunc (TEvFinishKqpTask, HandleWork); // used only for unit tests
180182 hFunc (TEvKqpNode::TEvCancelKqpTasksRequest, HandleWork);
181183 hFunc (TEvents::TEvWakeup, HandleWork);
182184 // misc
@@ -444,12 +446,21 @@ class TKqpNodeService : public TActorBootstrapped<TKqpNodeService> {
444446 tableKind = tableKindExtract (meta);
445447 }
446448
449+ TComputeActorSchedulingOptions schedulingOptions {
450+ .NodeService = SelfId (),
451+ .Scheduler = &Scheduler,
452+ .Group = msg.GetRuntimeSettings ().GetExecType () == NYql::NDqProto::TComputeRuntimeSettings::SCAN ? " olap" : " " ,
453+ .Weight = 1 ,
454+ .NoThrottle = msg.GetRuntimeSettings ().GetExecType () == NYql::NDqProto::TComputeRuntimeSettings::DATA,
455+ };
456+
447457 IActor* computeActor;
448458 if (tableKind == ETableKind::Datashard || tableKind == ETableKind::Olap) {
449459 auto & info = computesByStage.UpsertTaskWithScan (dqTask, meta, !AppData ()->FeatureFlags .GetEnableSeparationComputeActorsFromRead ());
450460 computeActor = CreateKqpScanComputeActor (request.Executer , txId, &dqTask,
451461 AsyncIoFactory, runtimeSettings, memoryLimits,
452- NWilson::TTraceId (ev->TraceId ), ev->Get ()->Arena );
462+ NWilson::TTraceId (ev->TraceId ), ev->Get ()->Arena ,
463+ schedulingOptions);
453464 taskCtx.ComputeActorId = Register (computeActor);
454465 info.MutableActorIds ().emplace_back (taskCtx.ComputeActorId );
455466 } else {
@@ -459,7 +470,8 @@ class TKqpNodeService : public TActorBootstrapped<TKqpNodeService> {
459470 }
460471 if (Y_LIKELY (!CaFactory)) {
461472 computeActor = CreateKqpComputeActor (request.Executer , txId, &dqTask, AsyncIoFactory,
462- runtimeSettings, memoryLimits, NWilson::TTraceId (ev->TraceId ), ev->Get ()->Arena , FederatedQuerySetup, GUCSettings);
473+ runtimeSettings, memoryLimits, NWilson::TTraceId (ev->TraceId ), ev->Get ()->Arena , FederatedQuerySetup, GUCSettings,
474+ schedulingOptions);
463475 taskCtx.ComputeActorId = Register (computeActor);
464476 } else {
465477 computeActor = CaFactory->CreateKqpComputeActor (request.Executer , txId, &dqTask,
@@ -490,8 +502,11 @@ class TKqpNodeService : public TActorBootstrapped<TKqpNodeService> {
490502 }
491503
492504 // used only for unit tests
493- void HandleWork (TEvKqpNode:: TEvFinishKqpTask::TPtr& ev) {
505+ void HandleWork (TEvFinishKqpTask::TPtr& ev) {
494506 auto & msg = *ev->Get ();
507+ if (msg.SchedulerEntity ) {
508+ Scheduler.Deregister (*msg.SchedulerEntity );
509+ }
495510 FinishKqpTask (msg.TxId , msg.TaskId , msg.Success , GetStateBucketByTx (Buckets, msg.TxId ), GetKqpResourceManager ());
496511 }
497512
@@ -670,6 +685,8 @@ class TKqpNodeService : public TActorBootstrapped<TKqpNodeService> {
670685 NYql::NDq::IDqAsyncIoFactory::TPtr AsyncIoFactory;
671686 const std::optional<TKqpFederatedQuerySetup> FederatedQuerySetup;
672687
688+ TComputeScheduler Scheduler;
689+
673690 // state sharded by TxId
674691 std::shared_ptr<TBucketArray> Buckets;
675692};
0 commit comments