@@ -28,6 +28,25 @@ struct TProducerState {
28
28
TMaybe<ui64> LastSeqNo;
29
29
i64 AckedFreeSpaceBytes = 0 ;
30
30
TActorId ActorId;
31
+ ui64 ChannelId = 0 ;
32
+
33
+ void SendAck (const NActors::TActorIdentity& actor) const {
34
+ auto resp = MakeHolder<NKqp::TEvKqpExecuter::TEvStreamDataAck>();
35
+ resp->Record .SetSeqNo (*LastSeqNo);
36
+ resp->Record .SetFreeSpace (AckedFreeSpaceBytes);
37
+ resp->Record .SetChannelId (ChannelId);
38
+
39
+ actor.Send (ActorId, resp.Release ());
40
+ }
41
+
42
+ bool ResumeIfStopped (const NActors::TActorIdentity& actor, i64 freeSpaceBytes) {
43
+ if (LastSeqNo && AckedFreeSpaceBytes <= 0 ) {
44
+ AckedFreeSpaceBytes = freeSpaceBytes;
45
+ SendAck (actor);
46
+ return true ;
47
+ }
48
+ return false ;
49
+ }
31
50
};
32
51
33
52
bool FillTxSettings (const Ydb::Query::TransactionSettings& from, Ydb::Table::TransactionSettings& to,
@@ -292,28 +311,16 @@ class TExecuteQueryRPC : public TActorBootstrapped<TExecuteQueryRPC> {
292
311
}
293
312
294
313
const i64 freeSpaceBytes = FlowControl_.FreeSpaceBytes ();
295
-
296
- for (auto & pair : StreamChannels_) {
297
- const auto & channelId = pair.first ;
298
- auto & channel = pair.second ;
299
-
300
- if (freeSpaceBytes > 0 && channel.LastSeqNo && channel.AckedFreeSpaceBytes <= 0 ) {
301
- LOG_DEBUG_S (ctx, NKikimrServices::RPC_REQUEST, this ->SelfId () << " Resume execution, "
302
- << " , channel: " << channelId
303
- << " , seqNo: " << channel.LastSeqNo
304
- << " , freeSpace: " << freeSpaceBytes);
305
-
306
- auto resp = MakeHolder<NKqp::TEvKqpExecuter::TEvStreamDataAck>();
307
- resp->Record .SetSeqNo (*channel.LastSeqNo );
308
- resp->Record .SetFreeSpace (freeSpaceBytes);
309
- resp->Record .SetChannelId (channelId);
310
-
311
- ctx.Send (channel.ActorId , resp.Release ());
312
-
313
- channel.AckedFreeSpaceBytes = freeSpaceBytes;
314
+ if (freeSpaceBytes > 0 ) {
315
+ for (auto & [channelId, channel] : StreamChannels_) {
316
+ if (channel.ResumeIfStopped (SelfId (), freeSpaceBytes)) {
317
+ LOG_DEBUG_S (ctx, NKikimrServices::RPC_REQUEST, this ->SelfId () << " Resume execution, "
318
+ << " , channel: " << channelId
319
+ << " , seqNo: " << channel.LastSeqNo
320
+ << " , freeSpace: " << freeSpaceBytes);
321
+ }
314
322
}
315
323
}
316
-
317
324
}
318
325
319
326
void Handle (NKqp::TEvKqpExecuter::TEvStreamData::TPtr& ev, const TActorContext& ctx) {
@@ -334,19 +341,15 @@ class TExecuteQueryRPC : public TActorBootstrapped<TExecuteQueryRPC> {
334
341
channel.ActorId = ev->Sender ;
335
342
channel.LastSeqNo = ev->Get ()->Record .GetSeqNo ();
336
343
channel.AckedFreeSpaceBytes = freeSpaceBytes;
344
+ channel.ChannelId = ev->Get ()->Record .GetChannelId ();
337
345
338
346
LOG_DEBUG_S (ctx, NKikimrServices::RPC_REQUEST, this ->SelfId () << " Send stream data ack"
339
347
<< " , seqNo: " << ev->Get ()->Record .GetSeqNo ()
340
348
<< " , freeSpace: " << freeSpaceBytes
341
349
<< " , to: " << ev->Sender
342
350
<< " , queue: " << FlowControl_.QueueSize ());
343
351
344
- auto resp = MakeHolder<NKqp::TEvKqpExecuter::TEvStreamDataAck>();
345
- resp->Record .SetSeqNo (ev->Get ()->Record .GetSeqNo ());
346
- resp->Record .SetFreeSpace (freeSpaceBytes);
347
- resp->Record .SetChannelId (ev->Get ()->Record .GetChannelId ());
348
-
349
- ctx.Send (channel.ActorId , resp.Release ());
352
+ channel.SendAck (SelfId ());
350
353
}
351
354
352
355
void Handle (NKqp::TEvKqp::TEvQueryResponse::TPtr& ev, const TActorContext& ctx) {
@@ -489,7 +492,7 @@ class TExecuteQueryRPC : public TActorBootstrapped<TExecuteQueryRPC> {
489
492
NKikimrKqp::EQueryAction QueryAction;
490
493
TRpcFlowControlState FlowControl_;
491
494
TMap<ui64, TProducerState> StreamChannels_;
492
-
495
+
493
496
NWilson::TSpan Span_;
494
497
};
495
498
0 commit comments