Skip to content

Commit 4c654e2

Browse files
Merge 8175d3c into bf2057f
2 parents bf2057f + 8175d3c commit 4c654e2

File tree

98 files changed

+1964
-1101
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+1964
-1101
lines changed

.github/config/muted_ya.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ ydb/core/kqp/ut/olap KqpOlapIndexes.IndexesActualization
2828
ydb/core/kqp/ut/olap KqpOlapIndexes.IndexesInBS
2929
ydb/core/kqp/ut/olap KqpOlapIndexes.IndexesInLocalMetadata
3030
ydb/core/kqp/ut/olap KqpOlapIndexes.IndexesModificationError
31+
ydb/core/kqp/ut/olap KqpOlapBlobsSharing.*
3132
ydb/core/kqp/ut/olap KqpOlapStatistics.StatsUsageWithTTL
3233
ydb/core/kqp/ut/olap KqpOlapWrite.TierDraftsGCWithRestart
3334
ydb/core/kqp/ut/olap [*/*] chunk chunk

ydb/core/kqp/gateway/behaviour/tablestore/operations/upsert_opt.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,24 @@ TConclusionStatus TUpsertOptionsOperation::DoDeserialize(NYql::TObjectSettingsIm
2929
}
3030
}
3131

32+
if (const auto className = features.Extract<TString>("METADATA_MEMORY_MANAGER.CLASS_NAME")) {
33+
if (!MetadataManagerConstructor.Initialize(*className)) {
34+
return TConclusionStatus::Fail("incorrect class name for metadata manager:" + *className);
35+
}
36+
37+
NJson::TJsonValue jsonData = NJson::JSON_MAP;
38+
auto fValue = features.Extract("METADATA_MEMORY_MANAGER.FEATURES");
39+
if (fValue) {
40+
if (!NJson::ReadJsonFastTree(*fValue, &jsonData)) {
41+
return TConclusionStatus::Fail("incorrect json in request METADATA_MEMORY_MANAGER.FEATURES parameter");
42+
}
43+
}
44+
auto result = MetadataManagerConstructor->DeserializeFromJson(jsonData);
45+
if (result.IsFail()) {
46+
return result;
47+
}
48+
}
49+
3250
return TConclusionStatus::Success();
3351
}
3452

@@ -40,6 +58,9 @@ void TUpsertOptionsOperation::DoSerializeScheme(NKikimrSchemeOp::TAlterColumnTab
4058
if (CompactionPlannerConstructor.HasObject()) {
4159
CompactionPlannerConstructor.SerializeToProto(*schemaData.MutableOptions()->MutableCompactionPlannerConstructor());
4260
}
61+
if (MetadataManagerConstructor.HasObject()) {
62+
MetadataManagerConstructor.SerializeToProto(*schemaData.MutableOptions()->MutableMetadataManagerConstructor());
63+
}
4364
}
4465

4566
}

ydb/core/kqp/gateway/behaviour/tablestore/operations/upsert_opt.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#include "abstract.h"
22
#include <ydb/core/tx/columnshard/engines/storage/optimizer/abstract/optimizer.h>
3+
#include <ydb/core/tx/columnshard/data_accessor/abstract/constructor.h>
34

45
namespace NKikimr::NKqp {
56

6-
class TUpsertOptionsOperation : public ITableStoreOperation {
7+
class TUpsertOptionsOperation: public ITableStoreOperation {
78
private:
89
static TString GetTypeName() {
910
return "UPSERT_OPTIONS";
@@ -14,6 +15,7 @@ class TUpsertOptionsOperation : public ITableStoreOperation {
1415
bool SchemeNeedActualization = false;
1516
std::optional<bool> ExternalGuaranteeExclusivePK;
1617
NOlap::NStorageOptimizer::TOptimizerPlannerConstructorContainer CompactionPlannerConstructor;
18+
NOlap::NDataAccessorControl::TMetadataManagerConstructorContainer MetadataManagerConstructor;
1719
public:
1820
TConclusionStatus DoDeserialize(NYql::TObjectSettingsImpl::TFeaturesExtractor& features) override;
1921

ydb/core/kqp/gateway/behaviour/tablestore/operations/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ PEERDIR(
1515
ydb/services/metadata/manager
1616
ydb/core/formats/arrow/serializer
1717
ydb/core/tx/columnshard/engines/storage/optimizer/abstract
18+
ydb/core/tx/columnshard/data_accessor/abstract
1819
ydb/core/kqp/gateway/utils
1920
ydb/core/protos
2021
)

ydb/core/protos/flat_scheme_op.proto

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,10 +465,26 @@ message TCompactionPlannerConstructorContainer {
465465
}
466466
}
467467

468+
message TMetadataManagerConstructorContainer {
469+
optional string ClassName = 1;
470+
471+
message TInMem {
472+
}
473+
474+
message TLocalDB {
475+
}
476+
477+
oneof Implementation {
478+
TInMem InMem = 20;
479+
TLocalDB LocalDB = 21;
480+
}
481+
}
482+
468483
message TColumnTableSchemeOptions {
469484
optional bool SchemeNeedActualization = 1 [default = false];
470485
optional bool ExternalGuaranteeExclusivePK = 2 [default = false];
471486
optional TCompactionPlannerConstructorContainer CompactionPlannerConstructor = 3;
487+
optional TMetadataManagerConstructorContainer MetadataManagerConstructor = 4;
472488
}
473489

474490
message TColumnTableSchema {
@@ -508,6 +524,7 @@ message TColumnTableRequestedOptions {
508524
optional bool SchemeNeedActualization = 1 [default = false];
509525
optional bool ExternalGuaranteeExclusivePK = 2;
510526
optional TCompactionPlannerConstructorContainer CompactionPlannerConstructor = 3;
527+
optional TMetadataManagerConstructorContainer MetadataManagerConstructor = 4;
511528
}
512529

513530
message TAlterColumnTableSchema {

ydb/core/tx/columnshard/blobs_action/transaction/tx_blobs_written.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ bool TTxBlobsWritingFinished::DoExecute(TTransactionContext& txc, const TActorCo
2525
for (auto&& portion : pack.MutablePortions()) {
2626
if (operation->GetBehaviour() == EOperationBehaviour::NoTxWrite) {
2727
static TAtomicCounter Counter = 0;
28-
portion.GetPortionInfoConstructor()->SetInsertWriteId((TInsertWriteId)Counter.Inc());
28+
portion.GetPortionInfoConstructor()->MutablePortionConstructor().SetInsertWriteId((TInsertWriteId)Counter.Inc());
2929
} else {
30-
portion.GetPortionInfoConstructor()->SetInsertWriteId(Self->InsertTable->BuildNextWriteId(txc));
30+
portion.GetPortionInfoConstructor()->MutablePortionConstructor().SetInsertWriteId(Self->InsertTable->BuildNextWriteId(txc));
3131
}
32-
pack.AddInsertWriteId(portion.GetPortionInfoConstructor()->GetInsertWriteIdVerified());
32+
pack.AddInsertWriteId(portion.GetPortionInfoConstructor()->GetPortionConstructor().GetInsertWriteIdVerified());
3333
portion.Finalize(Self, txc);
3434
if (operation->GetBehaviour() == EOperationBehaviour::NoTxWrite) {
3535
granule.CommitImmediateOnExecute(txc, *CommitSnapshot, portion.GetPortionInfo());
@@ -99,7 +99,7 @@ void TTxBlobsWritingFinished::DoComplete(const TActorContext& ctx) {
9999
Self->GetOperationsManager().AddEventForLock(*Self, op->GetLockId(), evWrite);
100100
}
101101
}
102-
granule.InsertPortionOnComplete(portion.GetPortionInfo().MutablePortionInfoPtr());
102+
granule.InsertPortionOnComplete(portion.GetPortionInfo(), index);
103103
}
104104
if (op->GetBehaviour() == EOperationBehaviour::NoTxWrite) {
105105
AFL_VERIFY(CommitSnapshot);

ydb/core/tx/columnshard/columnshard.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ void TColumnShard::OnActivateExecutor(const TActorContext& ctx) {
109109
ResourceSubscribeActor = ctx.Register(new NOlap::NResourceBroker::NSubscribe::TActor(TabletID(), SelfId()));
110110
BufferizationWriteActorId = ctx.Register(new NColumnShard::NWriting::TActor(TabletID(), SelfId()));
111111
DataAccessorsControlActorId = ctx.Register(new NOlap::NDataAccessorControl::TActor(TabletID(), SelfId()));
112-
DataAccessorsManager = std::make_shared<NOlap::NDataAccessorControl::TActorAccessorsManager>(DataAccessorsControlActorId),
112+
DataAccessorsManager = std::make_shared<NOlap::NDataAccessorControl::TActorAccessorsManager>(DataAccessorsControlActorId, SelfId()),
113113

114114
PrioritizationClientId = NPrioritiesQueue::TCompServiceOperator::RegisterClient();
115115
Execute(CreateTxInitSchema(), ctx);

ydb/core/tx/columnshard/columnshard__statistics.cpp

Lines changed: 180 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,176 @@ void TColumnShard::Handle(NStat::TEvStatistics::TEvAnalyzeTable::TPtr& ev, const
2626
Send(ev->Sender, response.release(), 0, ev->Cookie);
2727
}
2828

29+
class TResultAccumulator {
30+
private:
31+
TMutex Mutex;
32+
THashMap<ui32, std::unique_ptr<TCountMinSketch>> Calculated;
33+
TAtomicCounter ResultsCount = 0;
34+
TAtomicCounter WaitingCount = 0;
35+
const NActors::TActorId RequestSenderActorId;
36+
bool Started = false;
37+
const ui64 Cookie;
38+
std::unique_ptr<NStat::TEvStatistics::TEvStatisticsResponse> Response;
39+
bool Replied = false;
40+
41+
void OnResultReady() {
42+
AFL_VERIFY(!Replied);
43+
Replied = true;
44+
auto& respRecord = Response->Record;
45+
respRecord.SetStatus(NKikimrStat::TEvStatisticsResponse::STATUS_SUCCESS);
46+
47+
for (auto&& [columnTag, sketch] : Calculated) {
48+
if (!sketch) {
49+
continue;
50+
}
51+
52+
auto* column = respRecord.AddColumns();
53+
column->SetTag(columnTag);
54+
auto* statistic = column->AddStatistics();
55+
statistic->SetType(NStat::COUNT_MIN_SKETCH);
56+
statistic->SetData(TString(sketch->AsStringBuf()));
57+
}
58+
59+
NActors::TActivationContext::Send(RequestSenderActorId, std::move(Response), 0, Cookie);
60+
}
61+
62+
public:
63+
TResultAccumulator(const std::set<ui32>& tags, const NActors::TActorId& requestSenderActorId, const ui64 cookie,
64+
std::unique_ptr<NStat::TEvStatistics::TEvStatisticsResponse>&& response)
65+
: RequestSenderActorId(requestSenderActorId)
66+
, Cookie(cookie)
67+
, Response(std::move(response))
68+
{
69+
for (auto&& i : tags) {
70+
AFL_VERIFY(Calculated.emplace(i, nullptr).second);
71+
}
72+
}
73+
74+
void AddResult(THashMap<ui32, std::unique_ptr<TCountMinSketch>>&& sketch) {
75+
{
76+
TGuard<TMutex> g(Mutex);
77+
for (auto&& i : sketch) {
78+
auto it = Calculated.find(i.first);
79+
AFL_VERIFY(it != Calculated.end());
80+
if (!it->second) {
81+
it->second = std::move(i.second);
82+
} else {
83+
*it->second += *i.second;
84+
}
85+
}
86+
}
87+
const i64 count = ResultsCount.Inc();
88+
if (count == WaitingCount.Val()) {
89+
OnResultReady();
90+
} else {
91+
AFL_VERIFY(count < WaitingCount.Val());
92+
}
93+
}
94+
95+
void AddWaitingTask() {
96+
AFL_VERIFY(!Started);
97+
WaitingCount.Inc();
98+
}
99+
100+
void Start() {
101+
AFL_VERIFY(!Started);
102+
Started = true;
103+
if (WaitingCount.Val() == ResultsCount.Val()) {
104+
OnResultReady();
105+
}
106+
}
107+
108+
};
109+
110+
class TColumnPortionsAccumulator {
111+
private:
112+
const std::set<ui32> ColumnTagsRequested;
113+
std::vector<NOlap::TPortionInfo::TConstPtr> Portions;
114+
const ui32 PortionsCountLimit = 10000;
115+
std::shared_ptr<NOlap::NDataAccessorControl::IDataAccessorsManager> DataAccessors;
116+
std::shared_ptr<TResultAccumulator> Result;
117+
const std::shared_ptr<NOlap::TVersionedIndex> VersionedIndex;
118+
119+
public:
120+
TColumnPortionsAccumulator(const std::shared_ptr<TResultAccumulator>& result, const ui32 portionsCountLimit,
121+
const std::set<ui32>& originalColumnTags, const std::shared_ptr<NOlap::TVersionedIndex>& vIndex,
122+
const std::shared_ptr<NOlap::NDataAccessorControl::IDataAccessorsManager>& dataAccessorsManager)
123+
: ColumnTagsRequested(originalColumnTags)
124+
, PortionsCountLimit(portionsCountLimit)
125+
, DataAccessors(dataAccessorsManager)
126+
, Result(result)
127+
, VersionedIndex(vIndex)
128+
{
129+
}
130+
131+
class TMetadataSubscriber: public NOlap::IDataAccessorRequestsSubscriber {
132+
private:
133+
const std::shared_ptr<TResultAccumulator> Result;
134+
std::shared_ptr<NOlap::TVersionedIndex> VersionedIndex;
135+
const std::set<ui32> ColumnTagsRequested;
136+
137+
virtual void DoOnRequestsFinished(NOlap::TDataAccessorsResult&& result) override {
138+
THashMap<ui32, std::unique_ptr<TCountMinSketch>> sketchesByColumns;
139+
for (auto id : ColumnTagsRequested) {
140+
sketchesByColumns.emplace(id, TCountMinSketch::Create());
141+
}
142+
143+
for (const auto& portionInfo : result.GetPortions()) {
144+
std::shared_ptr<NOlap::ISnapshotSchema> portionSchema = portionInfo.GetPortionInfo().GetSchema(*VersionedIndex);
145+
for (const ui32 columnId : ColumnTagsRequested) {
146+
auto indexMeta = portionSchema->GetIndexInfo().GetIndexMetaCountMinSketch({ columnId });
147+
148+
if (!indexMeta) {
149+
AFL_WARN(NKikimrServices::TX_COLUMNSHARD)("error", "Missing countMinSketch index for columnId " + ToString(columnId));
150+
continue;
151+
}
152+
AFL_VERIFY(indexMeta->GetColumnIds().size() == 1);
153+
154+
const std::vector<TString> data = portionInfo.GetIndexInplaceDataVerified(indexMeta->GetIndexId());
155+
156+
for (const auto& sketchAsString : data) {
157+
auto sketch =
158+
std::unique_ptr<TCountMinSketch>(TCountMinSketch::FromString(sketchAsString.data(), sketchAsString.size()));
159+
*sketchesByColumns[columnId] += *sketch;
160+
}
161+
}
162+
}
163+
Result->AddResult(std::move(sketchesByColumns));
164+
}
165+
166+
public:
167+
TMetadataSubscriber(
168+
const std::shared_ptr<TResultAccumulator>& result, const std::shared_ptr<NOlap::TVersionedIndex>& vIndex, const std::set<ui32>& tags)
169+
: Result(result)
170+
, VersionedIndex(vIndex)
171+
, ColumnTagsRequested(tags)
172+
{
173+
174+
}
175+
};
176+
177+
void Flush() {
178+
if (!Portions.size()) {
179+
return;
180+
}
181+
Result->AddWaitingTask();
182+
std::shared_ptr<NOlap::TDataAccessorsRequest> request = std::make_shared<NOlap::TDataAccessorsRequest>();
183+
for (auto&& i : Portions) {
184+
request->AddPortion(i);
185+
}
186+
request->RegisterSubscriber(std::make_shared<TMetadataSubscriber>(Result, VersionedIndex, ColumnTagsRequested));
187+
Portions.clear();
188+
DataAccessors->AskData(request);
189+
}
190+
191+
void AddTask(const NOlap::TPortionInfo::TConstPtr& portion) {
192+
Portions.emplace_back(portion);
193+
if (Portions.size() >= PortionsCountLimit) {
194+
Flush();
195+
}
196+
}
197+
};
198+
29199
void TColumnShard::Handle(NStat::TEvStatistics::TEvStatisticsRequest::TPtr& ev, const TActorContext&) {
30200
const auto& record = ev->Get()->Record;
31201

@@ -57,45 +227,20 @@ void TColumnShard::Handle(NStat::TEvStatistics::TEvStatisticsRequest::TPtr& ev,
57227
columnTagsRequested = std::set<ui32>(allColumnIds.begin(), allColumnIds.end());
58228
}
59229

60-
std::map<ui32, std::unique_ptr<TCountMinSketch>> sketchesByColumns;
61-
for (auto id : columnTagsRequested) {
62-
sketchesByColumns.emplace(id, TCountMinSketch::Create());
63-
}
230+
NOlap::TDataAccessorsRequest request;
231+
std::shared_ptr<TResultAccumulator> resultAccumulator =
232+
std::make_shared<TResultAccumulator>(columnTagsRequested, ev->Sender, ev->Cookie, std::move(response));
233+
auto versionedIndex = std::make_shared<NOlap::TVersionedIndex>(index.GetVersionedIndex());
234+
TColumnPortionsAccumulator portionsPack(resultAccumulator, 1000, columnTagsRequested, versionedIndex, DataAccessorsManager.GetObjectPtrVerified());
64235

65236
for (const auto& [_, portionInfo] : spg->GetPortions()) {
66-
if (portionInfo->IsVisible(GetMaxReadVersion())) {
67-
std::shared_ptr<NOlap::ISnapshotSchema> portionSchema = portionInfo->GetSchema(index.GetVersionedIndex());
68-
for (ui32 columnId : columnTagsRequested) {
69-
auto indexMeta = portionSchema->GetIndexInfo().GetIndexMetaCountMinSketch({columnId});
70-
71-
if (!indexMeta) {
72-
AFL_WARN(NKikimrServices::TX_COLUMNSHARD)("error", "Missing countMinSketch index for columnId " + ToString(columnId));
73-
continue;
74-
}
75-
AFL_VERIFY(indexMeta->GetColumnIds().size() == 1);
76-
77-
const std::vector<TString> data = portionInfo->GetIndexInplaceDataVerified(indexMeta->GetIndexId());
78-
79-
for (const auto& sketchAsString : data) {
80-
auto sketch = std::unique_ptr<TCountMinSketch>(TCountMinSketch::FromString(sketchAsString.data(), sketchAsString.size()));
81-
*sketchesByColumns[columnId] += *sketch;
82-
}
83-
}
237+
if (!portionInfo->IsVisible(GetMaxReadVersion())) {
238+
continue;
84239
}
240+
portionsPack.AddTask(portionInfo);
85241
}
86-
87-
respRecord.SetStatus(NKikimrStat::TEvStatisticsResponse::STATUS_SUCCESS);
88-
89-
for (ui32 columnTag : columnTagsRequested) {
90-
auto* column = respRecord.AddColumns();
91-
column->SetTag(columnTag);
92-
93-
auto* statistic = column->AddStatistics();
94-
statistic->SetType(NStat::COUNT_MIN_SKETCH);
95-
statistic->SetData(TString(sketchesByColumns[columnTag]->AsStringBuf()));
96-
}
97-
98-
Send(ev->Sender, response.release(), 0, ev->Cookie);
242+
portionsPack.Flush();
243+
resultAccumulator->Start();
99244
}
100245

101246
}

0 commit comments

Comments
 (0)