Skip to content

Commit 34cd26c

Browse files
authored
register memory allocated for metadata in tiering actualizer (#12348)
1 parent dfc089c commit 34cd26c

File tree

22 files changed

+254
-114
lines changed

22 files changed

+254
-114
lines changed

ydb/core/tx/columnshard/columnshard__statistics.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class TColumnPortionsAccumulator {
140140
sketchesByColumns.emplace(id, TCountMinSketch::Create());
141141
}
142142

143-
for (const auto& portionInfo : result.GetPortions()) {
143+
for (const auto& [id, portionInfo] : result.GetPortions()) {
144144
std::shared_ptr<NOlap::ISnapshotSchema> portionSchema = portionInfo.GetPortionInfo().GetSchema(*VersionedIndex);
145145
for (const ui32 columnId : ColumnTagsRequested) {
146146
auto indexMeta = portionSchema->GetIndexInfo().GetIndexMetaCountMinSketch({ columnId });

ydb/core/tx/columnshard/columnshard_impl.cpp

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,27 @@ class TChangesReadTask: public NOlap::NBlobOperations::NRead::ITask {
616616
}
617617
};
618618

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 {
620640
protected:
621641
const NActors::TActorId ShardActorId;
622642
std::shared_ptr<NOlap::TColumnEngineChanges> Changes;
@@ -625,8 +645,9 @@ class TDataAccessorsSubscriber: public NOlap::IDataAccessorRequestsSubscriber {
625645

626646
virtual void DoOnRequestsFinishedImpl() = 0;
627647

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 {
629649
Changes->SetFetchedDataAccessors(std::move(result), NOlap::TDataAccessorsInitializationContext(VersionedIndex));
650+
Changes->ResourcesGuard = std::move(guard);
630651
DoOnRequestsFinishedImpl();
631652
}
632653

@@ -822,7 +843,7 @@ class TAccessorsMemorySubscriber: public NOlap::NResourceBroker::NSubscribe::ITa
822843
private:
823844
using TBase = NOlap::NResourceBroker::NSubscribe::ITask;
824845
std::shared_ptr<NOlap::TDataAccessorsRequest> Request;
825-
std::shared_ptr<TDataAccessorsSubscriber> Subscriber;
846+
std::shared_ptr<TDataAccessorsSubscriberBase> Subscriber;
826847
std::shared_ptr<NOlap::NDataAccessorControl::IDataAccessorsManager> DataAccessorsManager;
827848

828849
virtual void DoOnAllocationSuccess(const std::shared_ptr<NOlap::NResourceBroker::NSubscribe::TResourcesGuard>& guard) override {
@@ -833,7 +854,7 @@ class TAccessorsMemorySubscriber: public NOlap::NResourceBroker::NSubscribe::ITa
833854

834855
public:
835856
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,
837858
const std::shared_ptr<NOlap::NDataAccessorControl::IDataAccessorsManager>& dataAccessorsManager)
838859
: TBase(0, memory, externalTaskId, context)
839860
, Request(std::move(request))
@@ -852,7 +873,6 @@ class TCompactionDataAccessorsSubscriber: public TDataAccessorsSubscriberWithRea
852873
AFL_DEBUG(NKikimrServices::TX_COLUMNSHARD)("event", "compaction")("external_task_id", externalTaskId);
853874

854875
auto ev = std::make_unique<TEvPrivate::TEvWriteIndex>(VersionedIndex, Changes, CacheDataAfterWrite);
855-
ev->IndexChanges->ResourcesGuard = ExtractResourcesGuard();
856876
TActorContext::AsActorContext().Register(new NOlap::NBlobOperations::NRead::TActor(
857877
std::make_shared<TCompactChangesReadTask>(std::move(ev), ShardActorId, ShardTabletId, Counters, SnapshotModification)));
858878
}
@@ -895,7 +915,6 @@ class TWriteEvictPortionsDataAccessorsSubscriber: public TDataAccessorsSubscribe
895915
virtual void DoOnRequestsFinishedImpl() override {
896916
ACFL_DEBUG("background", "ttl")("need_writes", true);
897917
auto ev = std::make_unique<TEvPrivate::TEvWriteIndex>(VersionedIndex, Changes, false);
898-
ev->IndexChanges->ResourcesGuard = ExtractResourcesGuard();
899918
TActorContext::AsActorContext().Register(new NOlap::NBlobOperations::NRead::TActor(
900919
std::make_shared<TTTLChangesReadTask>(std::move(ev), ShardActorId, ShardTabletId, Counters, SnapshotModification)));
901920
}
@@ -920,14 +939,16 @@ class TNoWriteEvictPortionsDataAccessorsSubscriber: public TDataAccessorsSubscri
920939
using TBase::TBase;
921940
};
922941

923-
class TCSMetadataSubscriber: public NOlap::IDataAccessorRequestsSubscriber, public TObjectCounter<TCSMetadataSubscriber> {
942+
class TCSMetadataSubscriber: public TDataAccessorsSubscriberBase, public TObjectCounter<TCSMetadataSubscriber> {
924943
private:
925944
NActors::TActorId TabletActorId;
926945
const std::shared_ptr<NOlap::IMetadataAccessorResultProcessor> Processor;
927946
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 {
929949
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))));
931952
}
932953

933954
public:
@@ -947,8 +968,12 @@ void TColumnShard::SetupMetadata() {
947968
}
948969
std::vector<NOlap::TCSMetadataRequest> requests = TablesManager.MutablePrimaryIndex().CollectMetadataRequests();
949970
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()));
952977
}
953978
}
954979

@@ -1004,7 +1029,6 @@ class TCleanupPortionsDataAccessorsSubscriber: public TDataAccessorsSubscriber {
10041029
virtual void DoOnRequestsFinishedImpl() override {
10051030
AFL_DEBUG(NKikimrServices::TX_COLUMNSHARD)("background", "cleanup")("changes_info", Changes->DebugString());
10061031
auto ev = std::make_unique<TEvPrivate::TEvWriteIndex>(VersionedIndex, Changes, false);
1007-
ev->IndexChanges->ResourcesGuard = ExtractResourcesGuard();
10081032
ev->SetPutStatus(NKikimrProto::OK); // No new blobs to write
10091033
NActors::TActivationContext::Send(ShardActorId, std::move(ev));
10101034
}
@@ -1093,7 +1117,8 @@ void TColumnShard::Handle(TEvPrivate::TEvStartCompaction::TPtr& ev, const TActor
10931117

10941118
void TColumnShard::Handle(TEvPrivate::TEvMetadataAccessorsInfo::TPtr& ev, const TActorContext& /*ctx*/) {
10951119
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>());
10971122
SetupMetadata();
10981123
}
10991124

ydb/core/tx/columnshard/columnshard_private_events.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <ydb/core/tx/columnshard/engines/writer/indexed_blob_constructor.h>
1111
#include <ydb/core/tx/columnshard/engines/writer/write_controller.h>
1212
#include <ydb/core/tx/columnshard/normalizer/abstract/abstract.h>
13+
#include <ydb/core/tx/columnshard/resource_subscriber/container.h>
1314
#include <ydb/core/tx/data_events/write_data.h>
1415
#include <ydb/core/tx/priorities/usage/abstract.h>
1516

@@ -75,7 +76,7 @@ struct TEvPrivate {
7576
private:
7677
const std::shared_ptr<NOlap::IMetadataAccessorResultProcessor> Processor;
7778
const ui64 Generation;
78-
NOlap::TDataAccessorsResult Result;
79+
std::optional<NOlap::NResourceBroker::NSubscribe::TResourceContainer<NOlap::TDataAccessorsResult>> Result;
7980

8081
public:
8182
const std::shared_ptr<NOlap::IMetadataAccessorResultProcessor>& GetProcessor() const {
@@ -84,12 +85,15 @@ struct TEvPrivate {
8485
ui64 GetGeneration() const {
8586
return Generation;
8687
}
87-
NOlap::TDataAccessorsResult ExtractResult() {
88-
return std::move(Result);
88+
NOlap::NResourceBroker::NSubscribe::TResourceContainer<NOlap::TDataAccessorsResult> ExtractResult() {
89+
AFL_VERIFY(Result);
90+
auto result = std::move(*Result);
91+
Result.reset();
92+
return result;
8993
}
9094

91-
TEvMetadataAccessorsInfo(
92-
const std::shared_ptr<NOlap::IMetadataAccessorResultProcessor>& processor, const ui64 gen, NOlap::TDataAccessorsResult&& result)
95+
TEvMetadataAccessorsInfo(const std::shared_ptr<NOlap::IMetadataAccessorResultProcessor>& processor, const ui64 gen,
96+
NOlap::NResourceBroker::NSubscribe::TResourceContainer<NOlap::TDataAccessorsResult>&& result)
9397
: Processor(processor)
9498
, Generation(gen)
9599
, Result(std::move(result)) {

ydb/core/tx/columnshard/data_accessor/request.h

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,38 @@
22
#include <ydb/core/tx/columnshard/counters/common/object_counter.h>
33
#include <ydb/core/tx/columnshard/engines/portions/data_accessor.h>
44
#include <ydb/core/tx/columnshard/engines/portions/portion_info.h>
5+
#include <ydb/core/tx/columnshard/resource_subscriber/task.h>
56

67
namespace NKikimr::NOlap {
78

89
class TDataAccessorsRequest;
910

10-
class TDataAccessorsResult {
11+
class TDataAccessorsResult: private NNonCopyable::TMoveOnly {
1112
private:
1213
THashMap<ui64, TString> ErrorsByPathId;
13-
THashMap<ui64, std::vector<TPortionDataAccessor>> AccessorsByPathId;
1414
THashMap<ui64, TPortionDataAccessor> PortionsById;
15-
std::vector<TPortionDataAccessor> Portions;
1615

1716
public:
18-
const std::vector<TPortionDataAccessor>& GetPortions() const {
19-
return Portions;
17+
const THashMap<ui64, TPortionDataAccessor>& GetPortions() const {
18+
return PortionsById;
19+
}
20+
21+
std::vector<TPortionDataAccessor> ExtractPortionsVector() {
22+
std::vector<TPortionDataAccessor> portions;
23+
portions.reserve(PortionsById.size());
24+
for (auto&& [_, portionInfo] : PortionsById) {
25+
portions.emplace_back(std::move(portionInfo));
26+
}
27+
return portions;
2028
}
2129

2230
void Merge(TDataAccessorsResult&& result) {
2331
for (auto&& i : result.ErrorsByPathId) {
2432
AFL_VERIFY(ErrorsByPathId.emplace(i.first, i.second).second);
2533
}
26-
for (auto&& i : result.AccessorsByPathId) {
27-
AFL_VERIFY(AccessorsByPathId.emplace(i.first, std::move(i.second)).second);
28-
}
2934
for (auto&& i : result.PortionsById) {
3035
AFL_VERIFY(PortionsById.emplace(i.first, std::move(i.second)).second);
3136
}
32-
Portions.insert(Portions.end(), result.Portions.begin(), result.Portions.end());
3337
}
3438

3539
const TPortionDataAccessor& GetPortionAccessorVerified(const ui64 portionId) const {
@@ -38,18 +42,10 @@ class TDataAccessorsResult {
3842
return it->second;
3943
}
4044

41-
std::vector<TPortionDataAccessor> ExtractPortionsVector() {
42-
return std::move(Portions);
43-
}
44-
45-
void AddData(const ui64 pathId, THashMap<ui64, TPortionDataAccessor>&& accessors) {
46-
auto info = AccessorsByPathId.emplace(pathId, std::vector<TPortionDataAccessor>());
47-
AFL_VERIFY(info.second);
48-
auto& v = info.first->second;
45+
void AddData(THashMap<ui64, TPortionDataAccessor>&& accessors) {
46+
std::deque<TPortionDataAccessor> v;
4947
for (auto&& [portionId, i] : accessors) {
50-
v.emplace_back(std::move(i));
51-
AFL_VERIFY(PortionsById.emplace(portionId, v.back()).second);
52-
Portions.emplace_back(v.back());
48+
AFL_VERIFY(PortionsById.emplace(portionId, i).second);
5349
}
5450
}
5551

@@ -301,7 +297,7 @@ class TDataAccessorsRequest: public NColumnShard::TMonitoringObjectsCounter<TDat
301297
if (itStatus->second.IsFinished()) {
302298
AFL_VERIFY(FetchingCount.Dec() >= 0);
303299
ReadyCount.Inc();
304-
AccessorsByPathId.AddData(pathId, itStatus->second.DetachAccessors());
300+
AccessorsByPathId.AddData(itStatus->second.DetachAccessors());
305301
PathIdStatus.erase(itStatus);
306302
}
307303
}
@@ -315,6 +311,10 @@ class TDataAccessorsRequest: public NColumnShard::TMonitoringObjectsCounter<TDat
315311
}
316312
}
317313
}
314+
315+
TString GetTaskId() const {
316+
return TStringBuilder() << "data-accessor-request-" << RequestId;
317+
}
318318
};
319319

320320
} // namespace NKikimr::NOlap

ydb/core/tx/columnshard/data_accessor/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ PEERDIR(
1212
ydb/core/tx/columnshard/engines/portions
1313
ydb/core/tx/columnshard/data_accessor/abstract
1414
ydb/core/tx/columnshard/data_accessor/local_db
15+
ydb/core/tx/columnshard/resource_subscriber
1516
)
1617

1718
END()

ydb/core/tx/columnshard/engines/changes/cleanup_portions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ void TCleanupPortionsColumnEngineChanges::DoWriteIndexOnExecute(NColumnShard::TC
2323
return;
2424
}
2525
THashMap<TString, THashSet<TUnifiedBlobId>> blobIdsByStorage;
26-
for (auto&& p : FetchedDataAccessors->GetPortions()) {
26+
for (auto&& [_, p] : FetchedDataAccessors->GetPortions()) {
2727
p.RemoveFromDatabase(context.DBWrapper);
2828
p.FillBlobIdsByStorage(blobIdsByStorage, context.EngineLogs.GetVersionedIndex());
2929
pathIds.emplace(p.GetPortionInfo().GetPathId());

ydb/core/tx/columnshard/engines/column_engine.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <ydb/core/tx/columnshard/common/reverse_accessor.h>
1111
#include <ydb/core/tx/columnshard/counters/common_data.h>
12+
#include <ydb/core/tx/columnshard/resource_subscriber/container.h>
1213
#include <ydb/core/tx/columnshard/tx_reader/abstract.h>
1314

1415
namespace NKikimr::NColumnShard {
@@ -252,12 +253,12 @@ class TColumnEngineStats {
252253
class TColumnEngineForLogs;
253254
class IMetadataAccessorResultProcessor {
254255
private:
255-
virtual void DoApplyResult(TDataAccessorsResult&& result, TColumnEngineForLogs& engine) = 0;
256+
virtual void DoApplyResult(NResourceBroker::NSubscribe::TResourceContainer<TDataAccessorsResult>&& result, TColumnEngineForLogs& engine) = 0;
256257

257258
public:
258259
virtual ~IMetadataAccessorResultProcessor() = default;
259260

260-
void ApplyResult(TDataAccessorsResult&& result, TColumnEngineForLogs& engine) {
261+
void ApplyResult(NResourceBroker::NSubscribe::TResourceContainer<TDataAccessorsResult>&& result, TColumnEngineForLogs& engine) {
261262
return DoApplyResult(std::move(result), engine);
262263
}
263264

ydb/core/tx/columnshard/engines/reader/sys_view/chunks/chunks.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class TStatsIterator: public NAbstract::TStatsIterator<NKikimr::NSysView::Schema
127127
AFL_VERIFY(result.GetPortions().size() == 1)("count", result.GetPortions().size());
128128
NActors::TActivationContext::AsActorContext().Send(
129129
OwnerId, new NColumnShard::TEvPrivate::TEvTaskProcessedResult(
130-
std::make_shared<TApplyResult>(result.GetPortions(), std::move(WaitingCountersGuard))));
130+
std::make_shared<TApplyResult>(result.ExtractPortionsVector(), std::move(WaitingCountersGuard))));
131131
}
132132
}
133133

ydb/core/tx/columnshard/engines/storage/actualizer/index/index.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,7 @@ std::vector<TCSMetadataRequest> TGranuleActualizationIndex::CollectMetadataReque
5656
if (!TieringActualizer) {
5757
return {};
5858
}
59-
auto req = TieringActualizer->BuildMetadataRequest(PathId, portions, TieringActualizer);
60-
if (!req) {
61-
return {};
62-
}
63-
return { *req };
59+
return TieringActualizer->BuildMetadataRequests(PathId, portions, TieringActualizer);
6460
}
6561

6662
}

0 commit comments

Comments
 (0)