@@ -370,7 +370,7 @@ THolder<TEvSchemeShard::TEvModifySchemeTransaction> CreateBuildPropose(
370
370
static constexpr std::string_view LogPrefix = " Create build table boundaries for " ;
371
371
LOG_D (buildInfo.Id << " table " << suffix
372
372
<< " , count: " << count << " , parts: " << parts << " , step: " << step
373
- << " , kmeans: " << buildInfo.KMeansTreeToDebugStr ());
373
+ << " , " << buildInfo.DebugString ());
374
374
if (parts > 1 ) {
375
375
const auto from = buildInfo.KMeans .ChildBegin ;
376
376
for (auto i = from + step, e = from + count; i < e; i += step) {
@@ -699,7 +699,7 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
699
699
ToTabletSend.emplace_back (shardId, ui64 (BuildId), std::move (ev));
700
700
}
701
701
702
- void SendBuildIndexRequest (TShardIdx shardIdx, TIndexBuildInfo& buildInfo) {
702
+ void SendBuildSecondaryIndexRequest (TShardIdx shardIdx, TIndexBuildInfo& buildInfo) {
703
703
auto ev = MakeHolder<TEvDataShard::TEvBuildIndexCreateRequest>();
704
704
ev->Record .SetBuildIndexId (ui64 (BuildId));
705
705
@@ -807,12 +807,20 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
807
807
}
808
808
}
809
809
810
- bool FillTable (TIndexBuildInfo& buildInfo) {
810
+ bool FillSecondaryIndex (TIndexBuildInfo& buildInfo) {
811
+ LOG_D (" FillSecondaryIndex Start" );
812
+
811
813
if (buildInfo.DoneShards .empty () && buildInfo.ToUploadShards .empty () && buildInfo.InProgressShards .empty ()) {
812
814
AddAllShards (buildInfo);
813
815
}
814
- return SendToShards (buildInfo, [&](TShardIdx shardIdx) { SendBuildIndexRequest (shardIdx, buildInfo); }) &&
816
+ auto done = SendToShards (buildInfo, [&](TShardIdx shardIdx) { SendBuildSecondaryIndexRequest (shardIdx, buildInfo); }) &&
815
817
buildInfo.DoneShards .size () == buildInfo.Shards .size ();
818
+
819
+ if (done) {
820
+ LOG_D (" FillSecondaryIndex Done" );
821
+ }
822
+
823
+ return done;
816
824
}
817
825
818
826
bool FillPrefixKMeans (TIndexBuildInfo& buildInfo) {
@@ -823,6 +831,14 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
823
831
buildInfo.DoneShards .size () == buildInfo.Shards .size ();
824
832
}
825
833
834
+ bool FillLocalKMeans (TIndexBuildInfo& buildInfo) {
835
+ if (buildInfo.DoneShards .empty () && buildInfo.ToUploadShards .empty () && buildInfo.InProgressShards .empty ()) {
836
+ AddAllShards (buildInfo);
837
+ }
838
+ return SendToShards (buildInfo, [&](TShardIdx shardIdx) { SendKMeansLocalRequest (shardIdx, buildInfo); }) &&
839
+ buildInfo.DoneShards .size () == buildInfo.Shards .size ();
840
+ }
841
+
826
842
bool InitSingleKMeans (TIndexBuildInfo& buildInfo) {
827
843
if (!buildInfo.DoneShards .empty () || !buildInfo.InProgressShards .empty () || !buildInfo.ToUploadShards .empty ()) {
828
844
return false ;
@@ -934,102 +950,112 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
934
950
);
935
951
}
936
952
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)) {
953
+ bool FillPrefixedVectorIndex (TTransactionContext& txc, TIndexBuildInfo& buildInfo) {
954
+ LOG_D (" FillPrefixedVectorIndex Start " << buildInfo.DebugString ());
955
+
956
+ if (buildInfo.KMeans .Level == 1 ) {
957
+ if (!FillSecondaryIndex (buildInfo)) {
941
958
return false ;
942
959
}
943
- const ui64 doneShards = buildInfo.DoneShards . size ( );
960
+ LOG_D ( " FillPrefixedVectorIndex DoneLevel " << buildInfo.DebugString () );
944
961
962
+ const ui64 doneShards = buildInfo.DoneShards .size ();
945
963
ClearDoneShards (txc, buildInfo);
946
964
// it's approximate but upper bound, so it's ok
947
965
buildInfo.KMeans .TableSize = std::max<ui64>(1 , buildInfo.Processed .GetUploadRows ());
948
966
buildInfo.KMeans .PrefixIndexDone (doneShards);
967
+ LOG_D (" FillPrefixedVectorIndex PrefixIndexDone " << buildInfo.DebugString ());
968
+
949
969
PersistKMeansState (txc, buildInfo);
950
970
NIceDb::TNiceDb db{txc.DB };
951
971
Self->PersistBuildIndexUploadReset (db, buildInfo);
952
- LOG_D (" FillIndex::Prefixed::Level1::Done " << buildInfo.KMeansTreeToDebugStr ());
953
972
ChangeState (BuildId, TIndexBuildInfo::EState::CreateBuild);
954
973
Progress (BuildId);
955
974
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) ) {
975
+ } else {
976
+ bool filled = buildInfo. KMeans . Level == 2
977
+ ? FillPrefixKMeans (buildInfo)
978
+ : FillLocalKMeans (buildInfo );
979
+ if (!filled ) {
961
980
return false ;
962
981
}
982
+ LOG_D (" FillPrefixedVectorIndex DoneLevel " << buildInfo.DebugString ());
963
983
964
984
ClearDoneShards (txc, buildInfo);
965
985
Y_ASSERT (buildInfo.KMeans .State == TIndexBuildInfo::TKMeans::MultiLocal);
966
986
const bool needsAnotherLevel = buildInfo.KMeans .NextLevel ();
967
987
buildInfo.KMeans .State = TIndexBuildInfo::TKMeans::MultiLocal;
968
- buildInfo.KMeans .Parent = buildInfo.KMeans .ParentEnd ();
988
+ if (buildInfo.KMeans .Level == 2 ) {
989
+ buildInfo.KMeans .Parent = buildInfo.KMeans .ParentEnd ();
990
+ }
991
+ LOG_D (" FillPrefixedVectorIndex NextLevel " << buildInfo.DebugString ());
992
+
969
993
PersistKMeansState (txc, buildInfo);
970
994
NIceDb::TNiceDb db{txc.DB };
971
995
Self->PersistBuildIndexUploadReset (db, buildInfo);
972
- LOG_D (" FillIndex::Prefixed::Level2::Done " << buildInfo.KMeansTreeToDebugStr ());
973
996
if (!needsAnotherLevel) {
997
+ LOG_D (" FillPrefixedVectorIndex Done " << buildInfo.DebugString ());
974
998
return true ;
975
999
}
976
1000
ChangeState (BuildId, TIndexBuildInfo::EState::DropBuild);
977
1001
Progress (BuildId);
978
1002
return false ;
979
1003
}
1004
+ }
1005
+
1006
+ bool FillVectorIndex (TTransactionContext& txc, TIndexBuildInfo& buildInfo) {
1007
+ LOG_D (" FillVectorIndex Start " << buildInfo.DebugString ());
980
1008
981
1009
if (buildInfo.Sample .State == TIndexBuildInfo::TSample::EState::Upload) {
982
1010
return false ;
983
1011
}
984
1012
if (InitSingleKMeans (buildInfo)) {
985
- LOG_D (" FillIndex:: SingleKMeans::Start " << buildInfo.KMeansTreeToDebugStr ());
1013
+ LOG_D (" FillVectorIndex SingleKMeans " << buildInfo.DebugString ());
986
1014
}
987
1015
if (!SendVectorIndex (buildInfo)) {
988
1016
return false ;
989
1017
}
990
1018
991
- LOG_D (" FillIndex::SendVectorIndex::Done " << buildInfo.KMeansTreeToDebugStr ());
992
1019
if (!buildInfo.Sample .Rows .empty ()) {
993
1020
if (buildInfo.Sample .State == TIndexBuildInfo::TSample::EState::Collect) {
994
- LOG_D (" FillIndex::SendSample::Start " << buildInfo.KMeansTreeToDebugStr ());
1021
+ LOG_D (" FillVectorIndex SendUploadSampleKRequest " << buildInfo.DebugString ());
995
1022
SendUploadSampleKRequest (buildInfo);
996
1023
return false ;
997
1024
}
998
- LOG_D (" FillIndex::SendSample::Done " << buildInfo.KMeansTreeToDebugStr ());
999
1025
}
1000
1026
1001
- LOG_D (" FillIndex::ClearDoneShards " << buildInfo.KMeansTreeToDebugStr ());
1027
+ LOG_D (" FillVectorIndex DoneLevel " << buildInfo.DebugString ());
1002
1028
ClearDoneShards (txc, buildInfo);
1003
1029
1004
1030
if (!buildInfo.Sample .Rows .empty ()) {
1005
1031
if (buildInfo.KMeans .NextState ()) {
1006
- LOG_D (" FillIndex:: NextState::Start " << buildInfo.KMeansTreeToDebugStr ());
1032
+ LOG_D (" FillVectorIndex NextState " << buildInfo.DebugString ());
1007
1033
PersistKMeansState (txc, buildInfo);
1008
1034
Progress (BuildId);
1009
1035
return false ;
1010
1036
}
1011
1037
buildInfo.Sample .Clear ();
1012
1038
NIceDb::TNiceDb db{txc.DB };
1013
1039
Self->PersistBuildIndexSampleForget (db, buildInfo);
1014
- LOG_D (" FillIndex::NextState::Done " << buildInfo.KMeansTreeToDebugStr ());
1040
+ LOG_D (" FillVectorIndex DoneState " << buildInfo.DebugString ());
1015
1041
}
1016
1042
1017
1043
if (buildInfo.KMeans .NextParent ()) {
1018
- LOG_D (" FillIndex:: NextParent::Start " << buildInfo.KMeansTreeToDebugStr ());
1044
+ LOG_D (" FillVectorIndex NextParent " << buildInfo.DebugString ());
1019
1045
PersistKMeansState (txc, buildInfo);
1020
1046
Progress (BuildId);
1021
1047
return false ;
1022
1048
}
1023
1049
1024
1050
if (InitMultiKMeans (buildInfo)) {
1025
- LOG_D (" FillIndex:: MultiKMeans::Start " << buildInfo.KMeansTreeToDebugStr ());
1051
+ LOG_D (" FillVectorIndex MultiKMeans " << buildInfo.DebugString ());
1026
1052
PersistKMeansState (txc, buildInfo);
1027
1053
Progress (BuildId);
1028
1054
return false ;
1029
1055
}
1030
1056
1031
1057
if (buildInfo.KMeans .NextLevel ()) {
1032
- LOG_D (" FillIndex:: NextLevel::Start " << buildInfo.KMeansTreeToDebugStr ());
1058
+ LOG_D (" FillVectorIndex NextLevel " << buildInfo.DebugString ());
1033
1059
PersistKMeansState (txc, buildInfo);
1034
1060
NIceDb::TNiceDb db{txc.DB };
1035
1061
Self->PersistBuildIndexUploadReset (db, buildInfo);
@@ -1039,7 +1065,7 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
1039
1065
Progress (BuildId);
1040
1066
return false ;
1041
1067
}
1042
- LOG_D (" FillIndex:: Done " << buildInfo.KMeansTreeToDebugStr ());
1068
+ LOG_D (" FillVectorIndex Done " << buildInfo.DebugString ());
1043
1069
return true ;
1044
1070
}
1045
1071
@@ -1057,15 +1083,20 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
1057
1083
Y_ABORT_UNLESS (buildInfo.SnapshotStep );
1058
1084
}
1059
1085
if (buildInfo.Shards .empty ()) {
1060
- LOG_D (" FillIndex::InitiateShards " << buildInfo.KMeansTreeToDebugStr ());
1061
1086
NIceDb::TNiceDb db (txc.DB );
1062
1087
InitiateShards (db, buildInfo);
1063
1088
}
1064
- if (buildInfo.IsBuildVectorIndex ()) {
1065
- return FillVectorIndex (txc, buildInfo);
1066
- } else {
1067
- Y_ASSERT (buildInfo.IsBuildSecondaryIndex () || buildInfo.IsBuildColumns ());
1068
- return FillTable (buildInfo);
1089
+ switch (buildInfo.BuildKind ) {
1090
+ case TIndexBuildInfo::EBuildKind::BuildSecondaryIndex:
1091
+ case TIndexBuildInfo::EBuildKind::BuildColumns:
1092
+ return FillSecondaryIndex (buildInfo);
1093
+ case TIndexBuildInfo::EBuildKind::BuildVectorIndex:
1094
+ return FillVectorIndex (txc, buildInfo);
1095
+ case TIndexBuildInfo::EBuildKind::BuildPrefixedVectorIndex:
1096
+ return FillPrefixedVectorIndex (txc, buildInfo);
1097
+ default :
1098
+ Y_ASSERT (false );
1099
+ return true ;
1069
1100
}
1070
1101
}
1071
1102
@@ -1302,6 +1333,8 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
1302
1333
}
1303
1334
1304
1335
void InitiateShards (NIceDb::TNiceDb& db, TIndexBuildInfo& buildInfo) {
1336
+ LOG_D (" InitiateShards " << buildInfo.DebugString ());
1337
+
1305
1338
Y_ASSERT (buildInfo.Shards .empty ());
1306
1339
Y_ASSERT (buildInfo.ToUploadShards .empty ());
1307
1340
Y_ASSERT (buildInfo.InProgressShards .empty ());
@@ -1317,15 +1350,16 @@ struct TSchemeShard::TIndexBuilder::TTxProgress: public TSchemeShard::TIndexBuil
1317
1350
auto tableColumns = NTableIndex::ExtractInfo (table); // skip dropped columns
1318
1351
TSerializedTableRange shardRange = InfiniteRange (tableColumns.Keys .size ());
1319
1352
static constexpr std::string_view LogPrefix = " " ;
1320
- LOG_D (" infinite range " << buildInfo.KMeans .RangeToDebugStr (shardRange, buildInfo.IsBuildPrefixedVectorIndex () ? 2 : 1 ));
1321
1353
1322
1354
buildInfo.Cluster2Shards .clear ();
1323
1355
for (const auto & x: table->GetPartitions ()) {
1324
1356
Y_ABORT_UNLESS (Self->ShardInfos .contains (x.ShardIdx ));
1325
1357
TSerializedCellVec bound{x.EndOfRange };
1326
1358
shardRange.To = bound;
1327
- LOG_D (" shard " << x.ShardIdx << " range " << buildInfo.KMeans .RangeToDebugStr (shardRange, buildInfo.IsBuildPrefixedVectorIndex () ? 2 : 1 ));
1328
- buildInfo.AddParent (shardRange, x.ShardIdx );
1359
+ if (buildInfo.BuildKind == TIndexBuildInfo::EBuildKind::BuildVectorIndex) {
1360
+ LOG_D (" shard " << x.ShardIdx << " range " << buildInfo.KMeans .RangeToDebugStr (shardRange));
1361
+ buildInfo.AddParent (shardRange, x.ShardIdx );
1362
+ }
1329
1363
auto [it, emplaced] = buildInfo.Shards .emplace (x.ShardIdx , TIndexBuildInfo::TShardStatus{std::move (shardRange), " " , buildInfo.Shards .size ()});
1330
1364
Y_ASSERT (emplaced);
1331
1365
shardRange.From = std::move (bound);
0 commit comments