@@ -1961,19 +1961,20 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
1961
1961
return Process ();
1962
1962
}
1963
1963
1964
- bool Prepare (const ui64 txId, NWilson::TTraceId traceId) {
1964
+ bool Prepare (std::optional< NWilson::TTraceId> traceId) {
1965
1965
UpdateTracingState (" Commit" , std::move (traceId));
1966
1966
OperationStartTime = TInstant::Now ();
1967
1967
1968
1968
CA_LOG_D (" Start prepare for distributed commit" );
1969
1969
YQL_ENSURE (State == EState::WRITING);
1970
+ YQL_ENSURE (!NeedToFlushBeforeCommit);
1970
1971
State = EState::PREPARING;
1971
1972
for (auto & [_, queue] : DataQueues) {
1972
1973
YQL_ENSURE (queue.empty ());
1973
1974
}
1974
- TxId = txId;
1975
+ YQL_ENSURE ( TxId)
1975
1976
for (auto & [_, info] : WriteInfos) {
1976
- info.WriteTableActor ->SetPrepare (txId );
1977
+ info.WriteTableActor ->SetPrepare (*TxId );
1977
1978
}
1978
1979
Close ();
1979
1980
if (!Process ()) {
@@ -2424,8 +2425,14 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
2424
2425
TxManager->StartExecute ();
2425
2426
ImmediateCommit (std::move (ev->TraceId ));
2426
2427
} else {
2427
- TxManager->StartPrepare ();
2428
- Prepare (ev->Get ()->TxId , std::move (ev->TraceId ));
2428
+ AFL_ENSURE (ev->Get ()->TxId );
2429
+ TxId = ev->Get ()->TxId ;
2430
+ if (NeedToFlushBeforeCommit) {
2431
+ Flush (std::move (ev->TraceId ));
2432
+ } else {
2433
+ TxManager->StartPrepare ();
2434
+ Prepare (std::move (ev->TraceId ));
2435
+ }
2429
2436
}
2430
2437
}
2431
2438
@@ -2805,6 +2812,14 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
2805
2812
UpdateTracingState (" Write" , BufferWriteActorSpan.GetTraceId ());
2806
2813
OnOperationFinished (Counters->BufferActorFlushLatencyHistogram );
2807
2814
State = EState::WRITING;
2815
+ AFL_ENSURE (!TxId || NeedToFlushBeforeCommit); // TxId => NeedToFlushBeforeCommit
2816
+ NeedToFlushBeforeCommit = false ;
2817
+ if (TxId) {
2818
+ TxManager->StartPrepare ();
2819
+ Prepare (std::nullopt);
2820
+ return ;
2821
+ }
2822
+
2808
2823
Send<ESendingType::Tail>(ExecuterActorId, new TEvKqpBuffer::TEvResult{
2809
2824
BuildStats ()
2810
2825
});
@@ -2846,8 +2861,11 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
2846
2861
ReplyErrorAndDieImpl (statusCode, std::move (issues));
2847
2862
}
2848
2863
2849
- void UpdateTracingState (const char * name, NWilson::TTraceId traceId) {
2850
- BufferWriteActorStateSpan = NWilson::TSpan (TWilsonKqp::BufferWriteActorState, std::move (traceId),
2864
+ void UpdateTracingState (const char * name, std::optional<NWilson::TTraceId> traceId) {
2865
+ if (!traceId) {
2866
+ return ;
2867
+ }
2868
+ BufferWriteActorStateSpan = NWilson::TSpan (TWilsonKqp::BufferWriteActorState, std::move (*traceId),
2851
2869
name, NWilson::EFlags::AUTO_END);
2852
2870
if (BufferWriteActorStateSpan.GetTraceId () != BufferWriteActorSpan.GetTraceId ()) {
2853
2871
BufferWriteActorStateSpan.Link (BufferWriteActorSpan.GetTraceId ());
@@ -2929,6 +2947,7 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
2929
2947
2930
2948
EState State;
2931
2949
bool HasError = false ;
2950
+ bool NeedToFlushBeforeCommit = false ;
2932
2951
THashMap<TPathId, std::queue<TBufferWriteMessage>> DataQueues;
2933
2952
2934
2953
struct TAckMessage {
0 commit comments