@@ -807,7 +807,7 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
807
807
}
808
808
}
809
809
810
- bool FillTable (TIndexBuildInfo& buildInfo) {
810
+ bool FillSecondaryIndex (TIndexBuildInfo& buildInfo) {
811
811
if (buildInfo.DoneShards .empty () && buildInfo.ToUploadShards .empty () && buildInfo.InProgressShards .empty ()) {
812
812
AddAllShards (buildInfo);
813
813
}
@@ -823,6 +823,14 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
823
823
buildInfo.DoneShards .size () == buildInfo.Shards .size ();
824
824
}
825
825
826
+ bool FillLocalKMeans (TIndexBuildInfo& buildInfo) {
827
+ if (buildInfo.DoneShards .empty () && buildInfo.ToUploadShards .empty () && buildInfo.InProgressShards .empty ()) {
828
+ AddAllShards (buildInfo);
829
+ }
830
+ return SendToShards (buildInfo, [&](TShardIdx shardIdx) { SendKMeansLocalRequest (shardIdx, buildInfo); }) &&
831
+ buildInfo.DoneShards .size () == buildInfo.Shards .size ();
832
+ }
833
+
826
834
bool InitSingleKMeans (TIndexBuildInfo& buildInfo) {
827
835
if (!buildInfo.DoneShards .empty () || !buildInfo.InProgressShards .empty () || !buildInfo.ToUploadShards .empty ()) {
828
836
return false ;
@@ -934,50 +942,58 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
934
942
);
935
943
}
936
944
937
- bool FillVectorIndex (TTransactionContext& txc, TIndexBuildInfo& buildInfo) {
938
- if (buildInfo.IsBuildPrefixedVectorIndex () && buildInfo.KMeans .Level == 1 ) {
939
- LOG_D (" FillIndex::Prefixed::Level1::Start " << buildInfo.KMeansTreeToDebugStr ());
940
- if (!FillTable (buildInfo)) {
945
+ bool FillPrefixedVectorIndex (TTransactionContext& txc, TIndexBuildInfo& buildInfo) {
946
+ Y_ASSERT (buildInfo.IsBuildPrefixedVectorIndex ());
947
+ LOG_D (" FillPrefixedIndex::Level::Start " << buildInfo.KMeansTreeToDebugStr ());
948
+
949
+ if (buildInfo.KMeans .Level == 1 ) {
950
+ if (!FillSecondaryIndex (buildInfo)) {
941
951
return false ;
942
952
}
943
- const ui64 doneShards = buildInfo.DoneShards . size ( );
953
+ LOG_D ( " FillPrefixedIndex::Level::Done " << buildInfo.KMeansTreeToDebugStr () );
944
954
955
+ const ui64 doneShards = buildInfo.DoneShards .size ();
945
956
ClearDoneShards (txc, buildInfo);
946
957
// it's approximate but upper bound, so it's ok
947
958
buildInfo.KMeans .TableSize = std::max<ui64>(1 , buildInfo.Processed .GetUploadRows ());
948
959
buildInfo.KMeans .PrefixIndexDone (doneShards);
960
+ LOG_D (" FillIndex::Prefixed::NextLevel " << buildInfo.KMeansTreeToDebugStr ());
961
+
949
962
PersistKMeansState (txc, buildInfo);
950
963
NIceDb::TNiceDb db{txc.DB };
951
964
Self->PersistBuildIndexUploadReset (db, buildInfo);
952
- LOG_D (" FillIndex::Prefixed::Level1::Done " << buildInfo.KMeansTreeToDebugStr ());
953
965
ChangeState (BuildId, TIndexBuildInfo::EState::CreateBuild);
954
966
Progress (BuildId);
955
967
return false ;
956
- }
957
-
958
- if (buildInfo. IsBuildPrefixedVectorIndex () && buildInfo. KMeans . Level == 2 ) {
959
- LOG_D ( " FillIndex::Prefixed::Level2::Start " << buildInfo. KMeansTreeToDebugStr () );
960
- if (!FillPrefixKMeans (buildInfo) ) {
968
+ } else {
969
+ bool filled = buildInfo. KMeans . Level == 2
970
+ ? FillPrefixKMeans (buildInfo)
971
+ : FillLocalKMeans (buildInfo );
972
+ if (!filled ) {
961
973
return false ;
962
974
}
975
+ LOG_D (" FillPrefixedIndex::Level::Done " << buildInfo.KMeansTreeToDebugStr ());
963
976
964
977
ClearDoneShards (txc, buildInfo);
965
978
Y_ASSERT (buildInfo.KMeans .State == TIndexBuildInfo::TKMeans::MultiLocal);
966
979
const bool needsAnotherLevel = buildInfo.KMeans .NextLevel ();
967
980
buildInfo.KMeans .State = TIndexBuildInfo::TKMeans::MultiLocal;
968
981
buildInfo.KMeans .Parent = buildInfo.KMeans .ParentEnd ();
982
+ LOG_D (" FillPrefixedIndex::NextLevel " << buildInfo.KMeansTreeToDebugStr ());
983
+
969
984
PersistKMeansState (txc, buildInfo);
970
985
NIceDb::TNiceDb db{txc.DB };
971
986
Self->PersistBuildIndexUploadReset (db, buildInfo);
972
- LOG_D (" FillIndex::Prefixed::Level2::Done " << buildInfo.KMeansTreeToDebugStr ());
973
987
if (!needsAnotherLevel) {
974
988
return true ;
975
989
}
976
990
ChangeState (BuildId, TIndexBuildInfo::EState::DropBuild);
977
991
Progress (BuildId);
978
992
return false ;
979
993
}
994
+ }
980
995
996
+ bool FillVectorIndex (TTransactionContext& txc, TIndexBuildInfo& buildInfo) {
981
997
if (buildInfo.Sample .State == TIndexBuildInfo::TSample::EState::Upload) {
982
998
return false ;
983
999
}
@@ -1061,11 +1077,17 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
1061
1077
NIceDb::TNiceDb db (txc.DB );
1062
1078
InitiateShards (db, buildInfo);
1063
1079
}
1064
- if (buildInfo.IsBuildVectorIndex ()) {
1065
- return FillVectorIndex (txc, buildInfo);
1066
- } else {
1067
- Y_ASSERT (buildInfo.IsBuildSecondaryIndex () || buildInfo.IsBuildColumns ());
1068
- return FillTable (buildInfo);
1080
+ switch (buildInfo.BuildKind ) {
1081
+ case TIndexBuildInfo::EBuildKind::BuildSecondaryIndex:
1082
+ case TIndexBuildInfo::EBuildKind::BuildColumns:
1083
+ return FillSecondaryIndex (buildInfo);
1084
+ case TIndexBuildInfo::EBuildKind::BuildVectorIndex:
1085
+ return FillVectorIndex (txc, buildInfo);
1086
+ case TIndexBuildInfo::EBuildKind::BuildPrefixedVectorIndex:
1087
+ return FillPrefixedVectorIndex (txc, buildInfo);
1088
+ default :
1089
+ Y_ASSERT (false );
1090
+ return true ;
1069
1091
}
1070
1092
}
1071
1093
@@ -1317,15 +1339,16 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
1317
1339
auto tableColumns = NTableIndex::ExtractInfo (table); // skip dropped columns
1318
1340
TSerializedTableRange shardRange = InfiniteRange (tableColumns.Keys .size ());
1319
1341
static constexpr std::string_view LogPrefix = " " ;
1320
- LOG_D (" infinite range " << buildInfo.KMeans .RangeToDebugStr (shardRange, buildInfo.IsBuildPrefixedVectorIndex () ? 2 : 1 ));
1321
1342
1322
1343
buildInfo.Cluster2Shards .clear ();
1323
1344
for (const auto & x: table->GetPartitions ()) {
1324
1345
Y_ABORT_UNLESS (Self->ShardInfos .contains (x.ShardIdx ));
1325
1346
TSerializedCellVec bound{x.EndOfRange };
1326
1347
shardRange.To = bound;
1327
- LOG_D (" shard " << x.ShardIdx << " range " << buildInfo.KMeans .RangeToDebugStr (shardRange, buildInfo.IsBuildPrefixedVectorIndex () ? 2 : 1 ));
1328
- buildInfo.AddParent (shardRange, x.ShardIdx );
1348
+ if (buildInfo.BuildKind == TIndexBuildInfo::EBuildKind::BuildVectorIndex) {
1349
+ LOG_D (" shard " << x.ShardIdx << " range " << buildInfo.KMeans .RangeToDebugStr (shardRange));
1350
+ buildInfo.AddParent (shardRange, x.ShardIdx );
1351
+ }
1329
1352
auto [it, emplaced] = buildInfo.Shards .emplace (x.ShardIdx , TIndexBuildInfo::TShardStatus{std::move (shardRange), " " , buildInfo.Shards .size ()});
1330
1353
Y_ASSERT (emplaced);
1331
1354
shardRange.From = std::move (bound);
0 commit comments