@@ -1147,7 +1147,7 @@ bool TTable::TryToReduceMemoryAndWait() {
11471147 i32 largestBucketIndex = 0 ;
11481148 ui64 largestBucketSize = 0 ;
11491149 for (ui32 bucket = 0 ; bucket < NumberOfBuckets; ++bucket) {
1150- if (TableBucketsSpillers[bucket].HasRunningAsyncIoOperation () || !TableBucketsSpillers[bucket]. IsProcessingFinished ()) return true ;
1150+ if (TableBucketsSpillers[bucket].IsProcessingSpilling ()) return true ;
11511151
11521152 ui64 bucketSize = GetSizeOfBucket (bucket);
11531153 if (bucketSize > largestBucketSize) {
@@ -1169,39 +1169,50 @@ void TTable::UpdateSpilling() {
11691169 }
11701170}
11711171
1172- void TTable::FinalizeSpilling () {
1173- MKQL_ENSURE (!HasRunningAsyncIoOperation (), " Internal logic error" );
1172+ bool TTable::IsSpillingFinished () const {
1173+ for (ui64 i = 0 ; i < NumberOfBuckets; ++i) {
1174+ if (TableBucketsSpillers[i].IsProcessingSpilling ()) return false ;
1175+ }
1176+ return true ;
1177+ }
11741178
1175- for (ui32 bucket = 0 ; bucket < NumberOfBuckets; ++bucket) {
1176- if (!TableBucketsSpillers[bucket].IsInMemory ()) {
1177- TableBucketsSpillers[bucket].SpillBucket (std::move (TableBuckets[bucket]));
1178- TableBuckets[bucket] = TTableBucket{};
1179- TableBucketsSpillers[bucket].Finalize ();
1180- }
1179+ bool TTable::IsSpillingAcceptingDataRequests () const {
1180+ for (ui64 i = 0 ; i < NumberOfBuckets; ++i) {
1181+ if (TableBucketsSpillers[i].IsInMemory ()) continue ;
1182+
1183+ if (!TableBucketsSpillers[i].IsAcceptingDataRequests ()) return false ;
11811184 }
1185+ return true ;
11821186}
11831187
1184- bool TTable::HasRunningAsyncIoOperation () const {
1185- for (ui32 bucket = 0 ; bucket < NumberOfBuckets; ++bucket ) {
1186- if (TableBucketsSpillers[bucket]. HasRunningAsyncIoOperation ()) return true ;
1188+ bool TTable::IsRestoringSpilledBuckets () const {
1189+ for (ui64 i = 0 ; i < NumberOfBuckets; ++i ) {
1190+ if (TableBucketsSpillers[i]. IsRestoring ()) return true ;
11871191 }
11881192 return false ;
11891193}
11901194
1191- bool TTable::IsProcessingFinished () const {
1195+ void TTable::FinalizeSpilling () {
11921196 for (ui32 bucket = 0 ; bucket < NumberOfBuckets; ++bucket) {
1193- if (!TableBucketsSpillers[bucket].IsProcessingFinished ()) return false ;
1197+ if (!TableBucketsSpillers[bucket].IsInMemory ()) {
1198+ TableBucketsSpillers[bucket].Finalize ();
1199+ TableBucketsSpillers[bucket].SpillBucket (std::move (TableBuckets[bucket]));
1200+ TableBuckets[bucket] = TTableBucket{};
1201+
1202+ }
11941203 }
1195- return true ;
11961204}
11971205
11981206bool TTable::IsBucketInMemory (ui32 bucket) const {
11991207 return TableBucketsSpillers[bucket].IsInMemory ();
12001208}
12011209
1210+ bool TTable::IsSpilledBucketWaitingForExtraction (ui32 bucket) const {
1211+ return TableBucketsSpillers[bucket].IsExtractionRequired ();
1212+ }
1213+
12021214void TTable::StartLoadingBucket (ui32 bucket) {
12031215 MKQL_ENSURE (!TableBucketsSpillers[bucket].IsInMemory (), " Internal logic error" );
1204- if (!TableBucketsSpillers[bucket].IsProcessingFinished ()) return ;
12051216
12061217 TableBucketsSpillers[bucket].StartBucketRestoration ();
12071218}
@@ -1280,19 +1291,20 @@ void TTableBucketSpiller::Update() {
12801291
12811292 if (State == EState::Spilling) {
12821293 ProcessBucketSpilling ();
1294+ } else if (State == EState::Finalizing) {
1295+ ProcessFinalizing ();
12831296 } else if (State == EState::Restoring) {
12841297 ProcessBucketRestoration ();
12851298 }
12861299}
12871300
12881301void TTableBucketSpiller::Finalize () {
1289- IsFinalizing = true ;
1302+ IsFinalizingRequested = true ;
12901303}
12911304
12921305void TTableBucketSpiller::SpillBucket (TTableBucket&& bucket) {
12931306 MKQL_ENSURE (NextVectorToProcess == ENextVectorToProcess::None, " Internal logic error" );
12941307 State = EState::Spilling;
1295- IsBucketOwnedBySpiller = true ;
12961308
12971309 CurrentBucket = std::move (bucket);
12981310 NextVectorToProcess = ENextVectorToProcess::KeyAndVals;
@@ -1301,9 +1313,9 @@ void TTableBucketSpiller::SpillBucket(TTableBucket&& bucket) {
13011313}
13021314
13031315TTableBucket&& TTableBucketSpiller::ExtractBucket() {
1304- MKQL_ENSURE (State == EState::InMemory , " Internal logic error" );
1316+ MKQL_ENSURE (State == EState::WaitingForExtraction , " Internal logic error" );
13051317 MKQL_ENSURE (SpilledBucketsCount == 0 , " Internal logic error" );
1306- IsBucketOwnedBySpiller = false ;
1318+ State = EState::InMemory ;
13071319 return std::move (CurrentBucket);
13081320}
13091321
@@ -1318,14 +1330,27 @@ bool TTableBucketSpiller::IsInMemory() const {
13181330}
13191331
13201332bool TTableBucketSpiller::IsExtractionRequired () const {
1321- return IsBucketOwnedBySpiller;
1333+ return State == EState::WaitingForExtraction;
1334+ }
1335+
1336+ bool TTableBucketSpiller::IsProcessingSpilling () const {
1337+ return State == EState::Spilling;
1338+ }
1339+
1340+ bool TTableBucketSpiller::IsAcceptingDataRequests () const {
1341+ return State == EState::AcceptingDataRequests;
1342+ }
1343+
1344+ bool TTableBucketSpiller::IsRestoring () const {
1345+ return State == EState::Restoring;
13221346}
13231347
13241348void TTableBucketSpiller::StartBucketRestoration () {
1325- MKQL_ENSURE (State == EState::Restoring , " Internal logic error" );
1349+ MKQL_ENSURE (State == EState::AcceptingDataRequests , " Internal logic error" );
13261350 MKQL_ENSURE (NextVectorToProcess == ENextVectorToProcess::None, " Internal logic error" );
13271351
13281352 NextVectorToProcess = ENextVectorToProcess::KeyAndVals;
1353+ State = EState::Restoring;
13291354 ProcessBucketRestoration ();
13301355}
13311356
@@ -1374,15 +1399,23 @@ void TTableBucketSpiller::ProcessBucketSpilling() {
13741399 return ;
13751400 }
13761401 }
1377- if (!HasRunningAsyncIoOperation () && IsFinalizing) {
13781402
1403+ if (IsFinalizingRequested) {
1404+ if (!StateCharAdapter.IsAcceptingData () || !StateUi32Adapter.IsAcceptingData () || !StateUi64Adapter.IsAcceptingData ()) return ;
1405+ State = EState::Finalizing;
13791406 StateUi64Adapter.Finalize ();
13801407 StateUi32Adapter.Finalize ();
13811408 StateCharAdapter.Finalize ();
13821409
1383- if (StateCharAdapter.IsAcceptingDataRequests () && StateUi32Adapter.IsAcceptingDataRequests () && StateUi64Adapter.IsAcceptingDataRequests ()) {
1384- State = EState::Restoring;
1385- }
1410+ ProcessFinalizing ();
1411+ return ;
1412+ }
1413+ State = EState::AcceptingData;
1414+ }
1415+
1416+ void TTableBucketSpiller::ProcessFinalizing () {
1417+ if (StateCharAdapter.IsAcceptingDataRequests () && StateUi32Adapter.IsAcceptingDataRequests () && StateUi64Adapter.IsAcceptingDataRequests ()) {
1418+ State = EState::AcceptingDataRequests;
13861419 }
13871420}
13881421
@@ -1460,7 +1493,7 @@ void TTableBucketSpiller::ProcessBucketRestoration() {
14601493 SpilledBucketsCount--;
14611494 if (SpilledBucketsCount == 0 ) {
14621495 NextVectorToProcess = ENextVectorToProcess::None;
1463- State = EState::InMemory ;
1496+ State = EState::WaitingForExtraction ;
14641497 } else {
14651498 NextVectorToProcess = ENextVectorToProcess::KeyAndVals;
14661499 }
0 commit comments