@@ -398,7 +398,7 @@ size_t TStatisticsAggregator::PropagatePart(const std::vector<TNodeId>& nodeIds,
398
398
}
399
399
400
400
void TStatisticsAggregator::Handle (TEvPipeCache::TEvDeliveryProblem::TPtr& ev) {
401
- if (!TraversalTableId. PathId ) {
401
+ if (!TraversalPathId ) {
402
402
return ;
403
403
}
404
404
auto tabletId = ev->Get ()->TabletId ;
@@ -461,11 +461,7 @@ void TStatisticsAggregator::Handle(TEvPrivate::TEvRequestDistribution::TPtr&) {
461
461
++HiveRequestRound;
462
462
463
463
auto reqDistribution = std::make_unique<TEvHive::TEvRequestTabletDistribution>();
464
- reqDistribution->Record .MutableTabletIds ()->Reserve (TabletsForReqDistribution.size ());
465
- for (auto & tablet : TabletsForReqDistribution) {
466
- reqDistribution->Record .AddTabletIds (tablet);
467
- }
468
-
464
+ reqDistribution->Record .MutableTabletIds ()->Add (TabletsForReqDistribution.begin (), TabletsForReqDistribution.end ());
469
465
Send (MakePipePerNodeCacheID (false ),
470
466
new TEvPipeCache::TEvForward (reqDistribution.release (), HiveId, true ));
471
467
}
@@ -485,9 +481,13 @@ void TStatisticsAggregator::InitializeStatisticsTable() {
485
481
}
486
482
487
483
void TStatisticsAggregator::Navigate () {
484
+ Y_ABORT_UNLESS (NavigateType == ENavigateType::Traversal && !NavigateAnalyzeOperationId
485
+ || NavigateType == ENavigateType::Analyze && NavigateAnalyzeOperationId);
486
+ Y_ABORT_UNLESS (NavigatePathId);
487
+
488
488
using TNavigate = NSchemeCache::TSchemeCacheNavigate;
489
489
TNavigate::TEntry entry;
490
- entry.TableId = TraversalTableId ;
490
+ entry.TableId = NavigatePathId ;
491
491
entry.RequestType = TNavigate::TEntry::ERequestType::ByTableId;
492
492
entry.Operation = TNavigate::OpTable;
493
493
@@ -498,12 +498,16 @@ void TStatisticsAggregator::Navigate() {
498
498
}
499
499
500
500
void TStatisticsAggregator::Resolve () {
501
+ Y_ABORT_UNLESS (NavigateType == ENavigateType::Traversal && !NavigateAnalyzeOperationId
502
+ || NavigateType == ENavigateType::Analyze && NavigateAnalyzeOperationId);
503
+ Y_ABORT_UNLESS (NavigatePathId);
504
+
501
505
++ResolveRound;
502
506
503
507
TVector<TCell> plusInf;
504
508
TTableRange range (TraversalStartKey.GetCells (), true , plusInf, true , false );
505
509
auto keyDesc = MakeHolder<TKeyDesc>(
506
- TraversalTableId , range, TKeyDesc::ERowOperation::Read, KeyColumnTypes, Columns);
510
+ NavigatePathId , range, TKeyDesc::ERowOperation::Read, KeyColumnTypes, Columns);
507
511
508
512
auto request = std::make_unique<NSchemeCache::TSchemeCacheRequest>();
509
513
request->ResultSet .emplace_back (std::move (keyDesc));
@@ -521,8 +525,8 @@ void TStatisticsAggregator::ScanNextDatashardRange() {
521
525
auto request = std::make_unique<NStat::TEvStatistics::TEvStatisticsRequest>();
522
526
auto & record = request->Record ;
523
527
auto * path = record.MutableTable ()->MutablePathId ();
524
- path->SetOwnerId (TraversalTableId. PathId .OwnerId );
525
- path->SetLocalId (TraversalTableId. PathId .LocalPathId );
528
+ path->SetOwnerId (TraversalPathId .OwnerId );
529
+ path->SetLocalId (TraversalPathId .LocalPathId );
526
530
record.SetStartKey (TraversalStartKey.GetBuffer ());
527
531
528
532
Send (MakePipePerNodeCacheID (false ),
@@ -557,7 +561,7 @@ void TStatisticsAggregator::SaveStatisticsToTable() {
557
561
data.push_back (strSketch);
558
562
}
559
563
560
- Register (CreateSaveStatisticsQuery (TraversalTableId. PathId , EStatType::COUNT_MIN_SKETCH,
564
+ Register (CreateSaveStatisticsQuery (TraversalPathId , EStatType::COUNT_MIN_SKETCH,
561
565
std::move (columnTags), std::move (data)));
562
566
}
563
567
@@ -569,42 +573,75 @@ void TStatisticsAggregator::DeleteStatisticsFromTable() {
569
573
570
574
PendingDeleteStatistics = false ;
571
575
572
- Register (CreateDeleteStatisticsQuery (TraversalTableId. PathId ));
576
+ Register (CreateDeleteStatisticsQuery (TraversalPathId ));
573
577
}
574
578
575
- void TStatisticsAggregator::ScheduleNextTraversal (NIceDb::TNiceDb& db) {
576
- if (!IsSchemeshardSeen) {
577
- SA_LOG_T (" [" << TabletID () << " ] No info from schemeshard" );
579
+ void TStatisticsAggregator::ScheduleNextAnalyze (NIceDb::TNiceDb& db) {
580
+ Y_UNUSED (db);
581
+ if (ForceTraversals.empty ()) {
582
+ SA_LOG_T (" [" << TabletID () << " ] ScheduleNextAnalyze. Empty ForceTraversals" );
578
583
return ;
584
+ }
585
+ SA_LOG_D (" [" << TabletID () << " ] ScheduleNextAnalyze" );
586
+
587
+ for (TForceTraversalOperation& operation : ForceTraversals) {
588
+ for (TForceTraversalTable& operationTable : operation.Tables ) {
589
+ if (operationTable.Status == TForceTraversalTable::EStatus::None) {
590
+ std::optional<bool > isColumnTable = IsColumnTable (operationTable.PathId );
591
+ if (!isColumnTable) {
592
+ ForceTraversalOperationId = operation.OperationId ;
593
+ TraversalPathId = operationTable.PathId ;
594
+ DeleteStatisticsFromTable ();
595
+ return ;
596
+ }
597
+
598
+ if (*isColumnTable) {
599
+ NavigateAnalyzeOperationId = operation.OperationId ;
600
+ NavigatePathId = operationTable.PathId ;
601
+ Navigate ();
602
+ return ;
603
+ } else {
604
+ SA_LOG_D (" [" << TabletID () << " ] ScheduleNextAnalyze. Skip analyze for datashard table " << operationTable.PathId );
605
+ UpdateForceTraversalTableStatus (TForceTraversalTable::EStatus::AnalyzeFinished, operation.OperationId , operationTable, db);
606
+ return ;
607
+ }
608
+ }
609
+ }
610
+
611
+ SA_LOG_D (" [" << TabletID () << " ] ScheduleNextAnalyze. All the force traversal tables sent the requests. OperationId=" << operation.OperationId );
612
+ continue ;
579
613
}
580
614
615
+ SA_LOG_D (" [" << TabletID () << " ] ScheduleNextAnalyze. All the force traversal operations sent the requests." );
616
+ }
617
+
618
+ void TStatisticsAggregator::ScheduleNextTraversal (NIceDb::TNiceDb& db) {
619
+ SA_LOG_D (" [" << TabletID () << " ] ScheduleNextTraversal" );
620
+
581
621
TPathId pathId;
582
622
583
623
if (!LastTraversalWasForce) {
584
624
LastTraversalWasForce = true ;
585
625
586
626
for (TForceTraversalOperation& operation : ForceTraversals) {
587
627
for (TForceTraversalTable& operationTable : operation.Tables ) {
588
- if (operationTable.Status == TForceTraversalTable::EStatus::None) {
589
- operationTable.Status = TForceTraversalTable::EStatus::RequestSent;
590
- db.Table <Schema::ForceTraversalTables>().Key (operation.OperationId , operationTable.PathId .OwnerId , operationTable.PathId .LocalPathId )
591
- .Update (NIceDb::TUpdate<Schema::ForceTraversalTables::Status>((ui64)operationTable.Status ));
592
-
628
+ if (operationTable.Status == TForceTraversalTable::EStatus::AnalyzeFinished) {
629
+ UpdateForceTraversalTableStatus (TForceTraversalTable::EStatus::TraversalStarted, operation.OperationId , operationTable, db);
593
630
pathId = operationTable.PathId ;
594
631
break ;
595
632
}
596
633
}
597
634
598
635
if (!pathId) {
599
- SA_LOG_D (" [" << TabletID () << " ] All the force traversal tables sent the requests. OperationId=" << operation.OperationId );
636
+ SA_LOG_D (" [" << TabletID () << " ] ScheduleNextTraversal. All the force traversal tables sent the requests. OperationId=" << operation.OperationId );
600
637
continue ;
601
638
}
602
639
603
640
ForceTraversalOperationId = operation.OperationId ;
604
641
}
605
642
606
643
if (!pathId) {
607
- SA_LOG_D (" [" << TabletID () << " ] All the force traversal operations sent the requests." );
644
+ SA_LOG_D (" [" << TabletID () << " ] ScheduleNextTraversal. All the force traversal operations sent the requests." );
608
645
}
609
646
}
610
647
@@ -626,19 +663,19 @@ void TStatisticsAggregator::ScheduleNextTraversal(NIceDb::TNiceDb& db) {
626
663
return ;
627
664
}
628
665
629
- auto itPath = ScheduleTraversals. find ( pathId) ;
630
- if (itPath != ScheduleTraversals. end ()) {
631
- TraversalIsColumnTable = itPath-> second . IsColumnTable ;
632
- } else {
633
- SA_LOG_E ( " [ " << TabletID () << " ] traversal path " << pathId << " is not known to schemeshard " );
666
+ TraversalPathId = pathId;
667
+
668
+ std::optional< bool > isColumnTable = IsColumnTable (pathId) ;
669
+ if (!isColumnTable) {
670
+ DeleteStatisticsFromTable ( );
634
671
return ;
635
672
}
636
673
637
- TraversalTableId. PathId = pathId ;
674
+ TraversalIsColumnTable = *isColumnTable ;
638
675
639
676
SA_LOG_D (" [" << TabletID () << " ] Start "
640
677
<< LastTraversalWasForceString ()
641
- << " traversal for path " << pathId);
678
+ << " traversal navigate for path " << pathId);
642
679
643
680
StartTraversal (db);
644
681
}
@@ -650,11 +687,12 @@ void TStatisticsAggregator::StartTraversal(NIceDb::TNiceDb& db) {
650
687
TraversalStartKey = TSerializedCellVec ();
651
688
PersistStartKey (db);
652
689
690
+ NavigatePathId = TraversalPathId;
653
691
Navigate ();
654
692
}
655
693
656
694
void TStatisticsAggregator::FinishTraversal (NIceDb::TNiceDb& db) {
657
- auto pathId = TraversalTableId. PathId ;
695
+ auto pathId = TraversalPathId ;
658
696
659
697
auto pathIt = ScheduleTraversals.find (pathId);
660
698
if (pathIt != ScheduleTraversals.end ()) {
@@ -670,8 +708,12 @@ void TStatisticsAggregator::FinishTraversal(NIceDb::TNiceDb& db) {
670
708
671
709
auto forceTraversalOperation = CurrentForceTraversalOperation ();
672
710
if (forceTraversalOperation) {
711
+ auto operationTable = CurrentForceTraversalTable ();
712
+
713
+ UpdateForceTraversalTableStatus (TForceTraversalTable::EStatus::TraversalFinished, forceTraversalOperation->OperationId , *operationTable, db);
714
+
673
715
bool tablesRemained = std::any_of (forceTraversalOperation->Tables .begin (), forceTraversalOperation->Tables .end (),
674
- [](const TForceTraversalTable& elem) { return elem.Status == TForceTraversalTable::EStatus::None ;});
716
+ [](const TForceTraversalTable& elem) { return elem.Status != TForceTraversalTable::EStatus::TraversalFinished ;});
675
717
if (!tablesRemained) {
676
718
DeleteForceTraversalOperation (ForceTraversalOperationId, db);
677
719
}
@@ -699,6 +741,21 @@ TStatisticsAggregator::TForceTraversalOperation* TStatisticsAggregator::ForceTra
699
741
}
700
742
}
701
743
744
+ std::optional<bool > TStatisticsAggregator::IsColumnTable (const TPathId& pathId) const {
745
+ Y_ABORT_UNLESS (IsSchemeshardSeen);
746
+
747
+ auto itPath = ScheduleTraversals.find (pathId);
748
+ if (itPath != ScheduleTraversals.end ()) {
749
+ bool ret = itPath->second .IsColumnTable ;
750
+ SA_LOG_D (" [" << TabletID () << " ] IsColumnTable. Path " << pathId << " is "
751
+ << (ret ? " column" : " data" ) << " table." );
752
+ return ret;
753
+ } else {
754
+ SA_LOG_E (" [" << TabletID () << " ] IsColumnTable. traversal path " << pathId << " is not known to schemeshard" );
755
+ return {};
756
+ }
757
+ }
758
+
702
759
void TStatisticsAggregator::DeleteForceTraversalOperation (const TString& operationId, NIceDb::TNiceDb& db) {
703
760
db.Table <Schema::ForceTraversalOperations>().Key (ForceTraversalOperationId).Delete ();
704
761
@@ -725,17 +782,24 @@ TStatisticsAggregator::TForceTraversalTable* TStatisticsAggregator::ForceTravers
725
782
}
726
783
727
784
TStatisticsAggregator::TForceTraversalTable* TStatisticsAggregator::CurrentForceTraversalTable () {
728
- return ForceTraversalTable (ForceTraversalOperationId, TraversalTableId.PathId );
785
+ return ForceTraversalTable (ForceTraversalOperationId, TraversalPathId);
786
+ }
787
+
788
+ void TStatisticsAggregator::UpdateForceTraversalTableStatus (const TForceTraversalTable::EStatus status, const TString& operationId, TStatisticsAggregator::TForceTraversalTable& table, NIceDb::TNiceDb& db) {
789
+ table.Status = status;
790
+ db.Table <Schema::ForceTraversalTables>().Key (operationId, table.PathId .OwnerId , table.PathId .LocalPathId )
791
+ .Update (NIceDb::TUpdate<Schema::ForceTraversalTables::Status>((ui64)status));
729
792
}
730
793
794
+
731
795
void TStatisticsAggregator::PersistSysParam (NIceDb::TNiceDb& db, ui64 id, const TString& value) {
732
796
db.Table <Schema::SysParams>().Key (id).Update (
733
797
NIceDb::TUpdate<Schema::SysParams::Value>(value));
734
798
}
735
799
736
800
void TStatisticsAggregator::PersistTraversal (NIceDb::TNiceDb& db) {
737
- PersistSysParam (db, Schema::SysParam_TraversalTableOwnerId, ToString (TraversalTableId. PathId .OwnerId ));
738
- PersistSysParam (db, Schema::SysParam_TraversalTableLocalPathId, ToString (TraversalTableId. PathId .LocalPathId ));
801
+ PersistSysParam (db, Schema::SysParam_TraversalTableOwnerId, ToString (TraversalPathId .OwnerId ));
802
+ PersistSysParam (db, Schema::SysParam_TraversalTableLocalPathId, ToString (TraversalPathId .LocalPathId ));
739
803
PersistSysParam (db, Schema::SysParam_TraversalStartTime, ToString (TraversalStartTime.MicroSeconds ()));
740
804
PersistSysParam (db, Schema::SysParam_TraversalIsColumnTable, ToString (TraversalIsColumnTable));
741
805
}
@@ -750,7 +814,7 @@ void TStatisticsAggregator::PersistGlobalTraversalRound(NIceDb::TNiceDb& db) {
750
814
751
815
void TStatisticsAggregator::ResetTraversalState (NIceDb::TNiceDb& db) {
752
816
ForceTraversalOperationId.clear ();
753
- TraversalTableId. PathId = TPathId () ;
817
+ TraversalPathId = {} ;
754
818
TraversalStartTime = TInstant::MicroSeconds (0 );
755
819
PersistTraversal (db);
756
820
@@ -856,7 +920,7 @@ bool TStatisticsAggregator::OnRenderAppHtmlPage(NMon::TEvRemoteHttpInfo::TPtr ev
856
920
str << " PendingRequests: " << PendingRequests.size () << Endl;
857
921
str << " ProcessUrgentInFlight: " << ProcessUrgentInFlight << Endl << Endl;
858
922
859
- str << " TraversalTableId : " << TraversalTableId << Endl;
923
+ str << " TraversalPathId : " << TraversalPathId << Endl;
860
924
str << " Columns: " << Columns.size () << Endl;
861
925
str << " DatashardRanges: " << DatashardRanges.size () << Endl;
862
926
str << " CountMinSketches: " << CountMinSketches.size () << Endl << Endl;
0 commit comments