@@ -616,7 +616,27 @@ class TChangesReadTask: public NOlap::NBlobOperations::NRead::ITask {
616
616
}
617
617
};
618
618
619
- class TDataAccessorsSubscriber : public NOlap ::IDataAccessorRequestsSubscriber {
619
+ class TDataAccessorsSubscriberBase : public NOlap ::IDataAccessorRequestsSubscriber {
620
+ private:
621
+ std::shared_ptr<NOlap::NResourceBroker::NSubscribe::TResourcesGuard> ResourcesGuard;
622
+
623
+ virtual void DoOnRequestsFinished (NOlap::TDataAccessorsResult&& result) override final {
624
+ AFL_VERIFY (ResourcesGuard);
625
+ DoOnRequestsFinished (std::move (result), std::move (ResourcesGuard));
626
+ }
627
+
628
+ protected:
629
+ virtual void DoOnRequestsFinished (NOlap::TDataAccessorsResult&& result, std::shared_ptr<NOlap::NResourceBroker::NSubscribe::TResourcesGuard>&& guard) = 0;
630
+
631
+ public:
632
+ void SetResourcesGuard (const std::shared_ptr<NOlap::NResourceBroker::NSubscribe::TResourcesGuard>& guard) {
633
+ AFL_VERIFY (!ResourcesGuard);
634
+ AFL_VERIFY (guard);
635
+ ResourcesGuard = guard;
636
+ }
637
+ };
638
+
639
+ class TDataAccessorsSubscriber : public TDataAccessorsSubscriberBase {
620
640
protected:
621
641
const NActors::TActorId ShardActorId;
622
642
std::shared_ptr<NOlap::TColumnEngineChanges> Changes;
@@ -625,8 +645,9 @@ class TDataAccessorsSubscriber: public NOlap::IDataAccessorRequestsSubscriber {
625
645
626
646
virtual void DoOnRequestsFinishedImpl () = 0;
627
647
628
- virtual void DoOnRequestsFinished (NOlap::TDataAccessorsResult&& result) override final {
648
+ virtual void DoOnRequestsFinished (NOlap::TDataAccessorsResult&& result, std::shared_ptr<NOlap::NResourceBroker::NSubscribe::TResourcesGuard>&& guard ) override final {
629
649
Changes->SetFetchedDataAccessors (std::move (result), NOlap::TDataAccessorsInitializationContext (VersionedIndex));
650
+ Changes->ResourcesGuard = std::move (guard);
630
651
DoOnRequestsFinishedImpl ();
631
652
}
632
653
@@ -822,7 +843,7 @@ class TAccessorsMemorySubscriber: public NOlap::NResourceBroker::NSubscribe::ITa
822
843
private:
823
844
using TBase = NOlap::NResourceBroker::NSubscribe::ITask;
824
845
std::shared_ptr<NOlap::TDataAccessorsRequest> Request;
825
- std::shared_ptr<TDataAccessorsSubscriber > Subscriber;
846
+ std::shared_ptr<TDataAccessorsSubscriberBase > Subscriber;
826
847
std::shared_ptr<NOlap::NDataAccessorControl::IDataAccessorsManager> DataAccessorsManager;
827
848
828
849
virtual void DoOnAllocationSuccess (const std::shared_ptr<NOlap::NResourceBroker::NSubscribe::TResourcesGuard>& guard) override {
@@ -833,7 +854,7 @@ class TAccessorsMemorySubscriber: public NOlap::NResourceBroker::NSubscribe::ITa
833
854
834
855
public:
835
856
TAccessorsMemorySubscriber (const ui64 memory, const TString& externalTaskId, const NOlap::NResourceBroker::NSubscribe::TTaskContext& context,
836
- std::shared_ptr<NOlap::TDataAccessorsRequest>&& request, const std::shared_ptr<TDataAccessorsSubscriber >& subscriber,
857
+ std::shared_ptr<NOlap::TDataAccessorsRequest>&& request, const std::shared_ptr<TDataAccessorsSubscriberBase >& subscriber,
837
858
const std::shared_ptr<NOlap::NDataAccessorControl::IDataAccessorsManager>& dataAccessorsManager)
838
859
: TBase(0 , memory, externalTaskId, context)
839
860
, Request(std::move(request))
@@ -852,7 +873,6 @@ class TCompactionDataAccessorsSubscriber: public TDataAccessorsSubscriberWithRea
852
873
AFL_DEBUG (NKikimrServices::TX_COLUMNSHARD)(" event" , " compaction" )(" external_task_id" , externalTaskId);
853
874
854
875
auto ev = std::make_unique<TEvPrivate::TEvWriteIndex>(VersionedIndex, Changes, CacheDataAfterWrite);
855
- ev->IndexChanges ->ResourcesGuard = ExtractResourcesGuard ();
856
876
TActorContext::AsActorContext ().Register (new NOlap::NBlobOperations::NRead::TActor (
857
877
std::make_shared<TCompactChangesReadTask>(std::move (ev), ShardActorId, ShardTabletId, Counters, SnapshotModification)));
858
878
}
@@ -895,7 +915,6 @@ class TWriteEvictPortionsDataAccessorsSubscriber: public TDataAccessorsSubscribe
895
915
virtual void DoOnRequestsFinishedImpl () override {
896
916
ACFL_DEBUG (" background" , " ttl" )(" need_writes" , true );
897
917
auto ev = std::make_unique<TEvPrivate::TEvWriteIndex>(VersionedIndex, Changes, false );
898
- ev->IndexChanges ->ResourcesGuard = ExtractResourcesGuard ();
899
918
TActorContext::AsActorContext ().Register (new NOlap::NBlobOperations::NRead::TActor (
900
919
std::make_shared<TTTLChangesReadTask>(std::move (ev), ShardActorId, ShardTabletId, Counters, SnapshotModification)));
901
920
}
@@ -920,14 +939,16 @@ class TNoWriteEvictPortionsDataAccessorsSubscriber: public TDataAccessorsSubscri
920
939
using TBase::TBase;
921
940
};
922
941
923
- class TCSMetadataSubscriber : public NOlap ::IDataAccessorRequestsSubscriber , public TObjectCounter<TCSMetadataSubscriber> {
942
+ class TCSMetadataSubscriber : public TDataAccessorsSubscriberBase , public TObjectCounter <TCSMetadataSubscriber> {
924
943
private:
925
944
NActors::TActorId TabletActorId;
926
945
const std::shared_ptr<NOlap::IMetadataAccessorResultProcessor> Processor;
927
946
const ui64 Generation;
928
- virtual void DoOnRequestsFinished (NOlap::TDataAccessorsResult&& result) override {
947
+ virtual void DoOnRequestsFinished (
948
+ NOlap::TDataAccessorsResult&& result, std::shared_ptr<NOlap::NResourceBroker::NSubscribe::TResourcesGuard>&& guard) override {
929
949
NActors::TActivationContext::Send (
930
- TabletActorId, std::make_unique<TEvPrivate::TEvMetadataAccessorsInfo>(Processor, Generation, std::move (result)));
950
+ TabletActorId, std::make_unique<TEvPrivate::TEvMetadataAccessorsInfo>(Processor, Generation,
951
+ NOlap::NResourceBroker::NSubscribe::TResourceContainer (std::move(result), std::move(guard))));
931
952
}
932
953
933
954
public:
@@ -947,8 +968,12 @@ void TColumnShard::SetupMetadata() {
947
968
}
948
969
std::vector<NOlap::TCSMetadataRequest> requests = TablesManager.MutablePrimaryIndex ().CollectMetadataRequests ();
949
970
for (auto && i : requests) {
950
- i.GetRequest ()->RegisterSubscriber (std::make_shared<TCSMetadataSubscriber>(SelfId (), i.GetProcessor (), Generation ()));
951
- DataAccessorsManager->AskData (i.GetRequest ());
971
+ const ui64 accessorsMemory =
972
+ i.GetRequest ()->PredictAccessorsMemory (TablesManager.GetPrimaryIndex ()->GetVersionedIndex ().GetLastSchema ());
973
+ NOlap::NResourceBroker::NSubscribe::ITask::StartResourceSubscription (ResourceSubscribeActor,
974
+ std::make_shared<TAccessorsMemorySubscriber>(accessorsMemory, i.GetRequest()->GetTaskId(), TTLTaskSubscription,
975
+ std::shared_ptr<NOlap::TDataAccessorsRequest>(i.GetRequest()),
976
+ std::make_shared<TCSMetadataSubscriber>(SelfId(), i.GetProcessor(), Generation()), DataAccessorsManager.GetObjectPtrVerified()));
952
977
}
953
978
}
954
979
@@ -1004,7 +1029,6 @@ class TCleanupPortionsDataAccessorsSubscriber: public TDataAccessorsSubscriber {
1004
1029
virtual void DoOnRequestsFinishedImpl () override {
1005
1030
AFL_DEBUG (NKikimrServices::TX_COLUMNSHARD)(" background" , " cleanup" )(" changes_info" , Changes->DebugString ());
1006
1031
auto ev = std::make_unique<TEvPrivate::TEvWriteIndex>(VersionedIndex, Changes, false );
1007
- ev->IndexChanges ->ResourcesGuard = ExtractResourcesGuard ();
1008
1032
ev->SetPutStatus (NKikimrProto::OK); // No new blobs to write
1009
1033
NActors::TActivationContext::Send (ShardActorId, std::move (ev));
1010
1034
}
@@ -1093,7 +1117,8 @@ void TColumnShard::Handle(TEvPrivate::TEvStartCompaction::TPtr& ev, const TActor
1093
1117
1094
1118
void TColumnShard::Handle (TEvPrivate::TEvMetadataAccessorsInfo::TPtr& ev, const TActorContext& /* ctx*/ ) {
1095
1119
AFL_VERIFY (ev->Get ()->GetGeneration () == Generation ())(" ev" , ev->Get ()->GetGeneration ())(" tablet" , Generation ());
1096
- ev->Get ()->GetProcessor ()->ApplyResult (ev->Get ()->ExtractResult (), TablesManager.MutablePrimaryIndexAsVerified <NOlap::TColumnEngineForLogs>());
1120
+ ev->Get ()->GetProcessor ()->ApplyResult (
1121
+ ev->Get ()->ExtractResult (), TablesManager.MutablePrimaryIndexAsVerified <NOlap::TColumnEngineForLogs>());
1097
1122
SetupMetadata ();
1098
1123
}
1099
1124
0 commit comments