@@ -333,6 +333,9 @@ class TKqpTableWriteActor : public TActorBootstrapped<TKqpTableWriteActor> {
333
333
std::move (columnsMetadata),
334
334
std::move (writeIndexes),
335
335
priority);
336
+
337
+ // At current time only insert operation can fail.
338
+ NeedToFlushBeforeCommit |= (operationType == NKikimrDataEvents::TEvWrite::TOperation::OPERATION_INSERT);
336
339
CA_LOG_D (" Open: token=" << token);
337
340
return token;
338
341
}
@@ -365,6 +368,7 @@ class TKqpTableWriteActor : public TActorBootstrapped<TKqpTableWriteActor> {
365
368
void CleanupClosedTokens () {
366
369
YQL_ENSURE (ShardedWriteController);
367
370
ShardedWriteController->CleanupClosedTokens ();
371
+ NeedToFlushBeforeCommit = false ;
368
372
}
369
373
370
374
void SetParentTraceId (NWilson::TTraceId traceId) {
@@ -1301,6 +1305,10 @@ class TKqpTableWriteActor : public TActorBootstrapped<TKqpTableWriteActor> {
1301
1305
Stats.AffectedPartitions .clear ();
1302
1306
}
1303
1307
1308
+ bool FlushBeforeCommit () const {
1309
+ return NeedToFlushBeforeCommit;
1310
+ }
1311
+
1304
1312
private:
1305
1313
NActors::TActorId PipeCacheId = NKikimr::MakePipePerNodeCacheID(false );
1306
1314
@@ -1329,6 +1337,7 @@ class TKqpTableWriteActor : public TActorBootstrapped<TKqpTableWriteActor> {
1329
1337
1330
1338
IKqpTransactionManagerPtr TxManager;
1331
1339
bool Closed = false ;
1340
+ bool NeedToFlushBeforeCommit = false ;
1332
1341
EMode Mode = EMode::WRITE;
1333
1342
THashMap<ui64, TInstant> SendTime;
1334
1343
@@ -1659,7 +1668,6 @@ class TKqpDirectWriteActor : public TActorBootstrapped<TKqpDirectWriteActor>, pu
1659
1668
std::optional<TKqpTableWriteActor::TWriteToken> WriteToken;
1660
1669
1661
1670
bool Closed = false ;
1662
-
1663
1671
bool WaitingForTableActor = false ;
1664
1672
1665
1673
NWilson::TSpan DirectWriteActorSpan;
@@ -1877,6 +1885,23 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
1877
1885
Process ();
1878
1886
}
1879
1887
1888
+ bool NeedToFlush () {
1889
+ const bool outOfMemory = GetTotalFreeSpace () <= 0 ;
1890
+ const bool needToFlush = outOfMemory
1891
+ || State == EState::FLUSHING
1892
+ || State == EState::PREPARING
1893
+ || State == EState::COMMITTING
1894
+ || State == EState::ROLLINGBACK;
1895
+ return needToFlush;
1896
+ }
1897
+
1898
+ bool NeedToFlushActor (const TKqpTableWriteActor* actor) {
1899
+ return NeedToFlush ()
1900
+ && (State != EState::FLUSHING
1901
+ || !TxId // Flush between queries
1902
+ || actor->FlushBeforeCommit ()); // Flush before commit
1903
+ }
1904
+
1880
1905
bool Process () {
1881
1906
ProcessRequestQueue ();
1882
1907
if (!ProcessWrite ()) {
@@ -1887,7 +1912,9 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
1887
1912
if (State == EState::FLUSHING) {
1888
1913
bool isEmpty = true ;
1889
1914
for (auto & [_, info] : WriteInfos) {
1890
- isEmpty = isEmpty && info.WriteTableActor ->IsReady () && info.WriteTableActor ->IsEmpty ();
1915
+ if (NeedToFlushActor (info.WriteTableActor )) {
1916
+ isEmpty = isEmpty && info.WriteTableActor ->IsReady () && info.WriteTableActor ->IsEmpty ();
1917
+ }
1891
1918
}
1892
1919
if (isEmpty) {
1893
1920
OnFlushed ();
@@ -1942,14 +1969,7 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
1942
1969
}
1943
1970
1944
1971
bool ProcessWrite () {
1945
- const bool outOfMemory = GetTotalFreeSpace () <= 0 ;
1946
- const bool needToFlush = outOfMemory
1947
- || State == EState::FLUSHING
1948
- || State == EState::PREPARING
1949
- || State == EState::COMMITTING
1950
- || State == EState::ROLLINGBACK;
1951
-
1952
- if (!EnableStreamWrite && outOfMemory) {
1972
+ if (!EnableStreamWrite && GetTotalFreeSpace () <= 0 ) {
1953
1973
ReplyErrorAndDie (
1954
1974
NYql::NDqProto::StatusIds::PRECONDITION_FAILED,
1955
1975
NYql::TIssuesIds::KIKIMR_PRECONDITION_FAILED,
@@ -1959,10 +1979,10 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
1959
1979
return false ;
1960
1980
}
1961
1981
1962
- if (needToFlush ) {
1982
+ if (NeedToFlush () ) {
1963
1983
CA_LOG_D (" Flush data" );
1964
1984
for (auto & [_, info] : WriteInfos) {
1965
- if (info.WriteTableActor ->IsReady ()) {
1985
+ if (info.WriteTableActor ->IsReady () && NeedToFlushActor (info. WriteTableActor ) ) {
1966
1986
if (!info.WriteTableActor ->FlushToShards ()) {
1967
1987
return false ;
1968
1988
}
@@ -1992,13 +2012,13 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
1992
2012
1993
2013
CA_LOG_D (" Start prepare for distributed commit" );
1994
2014
YQL_ENSURE (State == EState::WRITING);
1995
- YQL_ENSURE (!NeedToFlushBeforeCommit);
1996
2015
State = EState::PREPARING;
1997
2016
for (auto & [_, queue] : DataQueues) {
1998
2017
YQL_ENSURE (queue.empty ());
1999
2018
}
2000
2019
YQL_ENSURE (TxId);
2001
2020
for (auto & [_, info] : WriteInfos) {
2021
+ AFL_ENSURE (!info.WriteTableActor ->FlushBeforeCommit ());
2002
2022
info.WriteTableActor ->SetPrepare (*TxId);
2003
2023
}
2004
2024
Close ();
@@ -2452,7 +2472,13 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
2452
2472
} else {
2453
2473
AFL_ENSURE (ev->Get ()->TxId );
2454
2474
TxId = ev->Get ()->TxId ;
2455
- if (NeedToFlushBeforeCommit) {
2475
+
2476
+ bool needToFlushBeforeCommit = false ;
2477
+ for (auto & [_, info] : WriteInfos) {
2478
+ needToFlushBeforeCommit |= info.WriteTableActor ->FlushBeforeCommit ();
2479
+ }
2480
+
2481
+ if (needToFlushBeforeCommit) {
2456
2482
Flush (std::move (ev->TraceId ));
2457
2483
} else {
2458
2484
TxManager->StartPrepare ();
@@ -2837,8 +2863,19 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
2837
2863
UpdateTracingState (" Write" , BufferWriteActorSpan.GetTraceId ());
2838
2864
OnOperationFinished (Counters->BufferActorFlushLatencyHistogram );
2839
2865
State = EState::WRITING;
2840
- AFL_ENSURE (!TxId || NeedToFlushBeforeCommit); // TxId => NeedToFlushBeforeCommit
2841
- NeedToFlushBeforeCommit = false ;
2866
+
2867
+ for (auto & [_, info] : WriteInfos) {
2868
+ AFL_ENSURE (TxId || info.WriteTableActor ->IsEmpty ());
2869
+ if (info.WriteTableActor ->IsEmpty ()) {
2870
+ info.WriteTableActor ->CleanupClosedTokens ();
2871
+ }
2872
+ if (!TxId) {
2873
+ info.WriteTableActor ->Unlink ();
2874
+ }
2875
+
2876
+ AFL_ENSURE (!info.WriteTableActor ->FlushBeforeCommit ());
2877
+ }
2878
+
2842
2879
if (TxId) {
2843
2880
TxManager->StartPrepare ();
2844
2881
Prepare (std::nullopt);
@@ -2972,7 +3009,6 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
2972
3009
2973
3010
EState State;
2974
3011
bool HasError = false ;
2975
- bool NeedToFlushBeforeCommit = false ;
2976
3012
THashMap<TPathId, std::queue<TBufferWriteMessage>> DataQueues;
2977
3013
2978
3014
struct TAckMessage {
0 commit comments