@@ -380,7 +380,7 @@ class TKqpExecuterBase : public TActorBootstrapped<TDerived> {
380380 this ->Send (channelComputeActorId, ackEv.Release (), /* TODO: undelivery */ 0 , /* cookie */ channelId);
381381 }
382382
383- void HandleComputeStats (NYql::NDq::TEvDqCompute::TEvState::TPtr& ev) {
383+ bool HandleComputeStats (NYql::NDq::TEvDqCompute::TEvState::TPtr& ev) {
384384 TActorId computeActor = ev->Sender ;
385385 auto & state = ev->Get ()->Record ;
386386 ui64 taskId = state.GetTaskId ();
@@ -409,7 +409,39 @@ class TKqpExecuterBase : public TActorBootstrapped<TDerived> {
409409 }
410410
411411 YQL_ENSURE (Planner);
412- bool populateChannels = Planner->AcknowledgeCA (taskId, computeActor, &state);
412+ bool ack = Planner->AcknowledgeCA (taskId, computeActor, &state);
413+
414+ switch (state.GetState ()) {
415+ case NYql::NDqProto::COMPUTE_STATE_FAILURE:
416+ case NYql::NDqProto::COMPUTE_STATE_FINISHED:
417+ // Don't finalize stats twice.
418+ if (Planner->CompletedCA (taskId, computeActor)) {
419+ ExtraData[computeActor].Swap (state.MutableExtraData ());
420+
421+ if (Stats) {
422+ Stats->AddComputeActorStats (
423+ computeActor.NodeId (),
424+ std::move (*state.MutableStats ()),
425+ TDuration::MilliSeconds (AggregationSettings.GetCollectLongTasksStatsTimeoutMs ())
426+ );
427+ }
428+
429+ LastTaskId = taskId;
430+ LastComputeActorId = computeActor.ToString ();
431+ }
432+ default :
433+ ; // ignore all other states.
434+ }
435+
436+ return ack;
437+ }
438+
439+ void HandleComputeState (NYql::NDq::TEvDqCompute::TEvState::TPtr& ev) {
440+ TActorId computeActor = ev->Sender ;
441+ auto & state = ev->Get ()->Record ;
442+ ui64 taskId = state.GetTaskId ();
443+
444+ bool populateChannels = HandleComputeStats (ev);
413445
414446 switch (state.GetState ()) {
415447 case NYql::NDqProto::COMPUTE_STATE_UNKNOWN: {
@@ -427,22 +459,8 @@ class TKqpExecuterBase : public TActorBootstrapped<TDerived> {
427459 break ;
428460 }
429461
430- case NYql::NDqProto::COMPUTE_STATE_FAILURE:
431- case NYql::NDqProto::COMPUTE_STATE_FINISHED: {
432- ExtraData[computeActor].Swap (state.MutableExtraData ());
433- if (Stats) {
434- Stats->AddComputeActorStats (
435- computeActor.NodeId (),
436- std::move (*state.MutableStats ()),
437- TDuration::MilliSeconds (AggregationSettings.GetCollectLongTasksStatsTimeoutMs ())
438- );
439- }
440-
441- LastTaskId = taskId;
442- LastComputeActorId = computeActor.ToString ();
443- YQL_ENSURE (Planner);
444- Planner->CompletedCA (taskId, computeActor);
445- }
462+ default :
463+ ; // ignore all other states.
446464 }
447465
448466 if (state.GetState () == NYql::NDqProto::COMPUTE_STATE_FAILURE) {
@@ -1854,6 +1872,9 @@ class TKqpExecuterBase : public TActorBootstrapped<TDerived> {
18541872
18551873 void PassAway () override {
18561874 YQL_ENSURE (AlreadyReplied && ResponseEv);
1875+
1876+ // Actualize stats with the last stats from terminated CAs, but keep the status.
1877+ FillResponseStats (ResponseEv->Record .GetResponse ().GetStatus ());
18571878 this ->Send (Target, ResponseEv.release ());
18581879
18591880 for (auto channelPair: ResultChannelProxies) {
0 commit comments