Skip to content

Commit 1960e5f

Browse files
authored
Smaller memory footprint for shards info (#9207)
1 parent 96cb4ca commit 1960e5f

File tree

3 files changed

+44
-14
lines changed

3 files changed

+44
-14
lines changed

ydb/core/kqp/common/kqp_tx.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ NYql::TIssue GetLocksInvalidatedIssue(const TShardIdToTableInfo& shardIdToTableI
4040
TStringBuilder message;
4141
message << "Transaction locks invalidated.";
4242

43-
if (auto it = shardIdToTableInfo.find(shardId); it != std::end(shardIdToTableInfo)) {
43+
if (auto tableInfoPtr = shardIdToTableInfo.GetPtr(shardId); tableInfoPtr) {
4444
message << " Tables: ";
4545
bool first = true;
46-
for (const auto& path : it->second.Pathes) {
46+
for (const auto& path : tableInfoPtr->Pathes) {
4747
if (!first) {
4848
message << ", ";
4949
first = false;

ydb/core/kqp/common/kqp_tx.h

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,46 @@ struct TDeferredEffects {
123123

124124
struct TTableInfo {
125125
bool IsOlap = false;
126-
THashSet<TString> Pathes;
126+
THashSet<TStringBuf> Pathes;
127127
};
128128

129-
using TShardIdToTableInfo = THashMap<ui64, TTableInfo>;
129+
130+
class TShardIdToTableInfo {
131+
public:
132+
const TTableInfo& Get(ui64 shardId) const {
133+
const auto* result = GetPtr(shardId);
134+
AFL_ENSURE(result);
135+
return *result;
136+
}
137+
138+
const TTableInfo* GetPtr(ui64 shardId) const {
139+
auto it = ShardIdToInfo.find(shardId);
140+
return it != std::end(ShardIdToInfo)
141+
? &it->second
142+
: nullptr;
143+
}
144+
145+
void Add(ui64 shardId, bool isOlap, const TString& path) {
146+
const auto [stringsIter, _] = Strings.insert(path);
147+
const TStringBuf pathBuf = *stringsIter;
148+
auto infoIter = ShardIdToInfo.find(shardId);
149+
if (infoIter != std::end(ShardIdToInfo)) {
150+
AFL_ENSURE(infoIter->second.IsOlap == isOlap);
151+
infoIter->second.Pathes.insert(pathBuf);
152+
} else {
153+
ShardIdToInfo.emplace(
154+
shardId,
155+
TTableInfo{
156+
.IsOlap = isOlap,
157+
.Pathes = {pathBuf},
158+
});
159+
}
160+
}
161+
162+
private:
163+
THashMap<ui64, TTableInfo> ShardIdToInfo;
164+
std::unordered_set<TString> Strings;// Pointers aren't invalidated.
165+
};
130166
using TShardIdToTableInfoPtr = std::shared_ptr<TShardIdToTableInfo>;
131167

132168
class TKqpTransactionContext : public NYql::TKikimrTransactionContextBase {

ydb/core/kqp/executer_actor/kqp_data_executer.cpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,7 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
224224

225225
const auto& task = TasksGraph.GetTask(taskId);
226226
const auto& stageInfo = TasksGraph.GetStageInfo(task.StageId);
227-
auto& info = (*ShardIdToTableInfo)[lock.GetDataShard()];
228-
info.IsOlap = (stageInfo.Meta.TableKind == ETableKind::Olap);
229-
info.Pathes.insert(stageInfo.Meta.TablePath);
227+
ShardIdToTableInfo->Add(lock.GetDataShard(), stageInfo.Meta.TableKind == ETableKind::Olap, stageInfo.Meta.TablePath);
230228
}
231229
} else if (data.GetData().template Is<NKikimrKqp::TEvKqpOutputActorResultInfo>()) {
232230
NKikimrKqp::TEvKqpOutputActorResultInfo info;
@@ -236,9 +234,7 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
236234

237235
const auto& task = TasksGraph.GetTask(taskId);
238236
const auto& stageInfo = TasksGraph.GetStageInfo(task.StageId);
239-
auto& info = (*ShardIdToTableInfo)[lock.GetDataShard()];
240-
info.IsOlap = (stageInfo.Meta.TableKind == ETableKind::Olap);
241-
info.Pathes.insert(stageInfo.Meta.TablePath);
237+
ShardIdToTableInfo->Add(lock.GetDataShard(), stageInfo.Meta.TableKind == ETableKind::Olap, stageInfo.Meta.TablePath);
242238
}
243239
}
244240
};
@@ -1980,9 +1976,7 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
19801976
NYql::NDqProto::TDqTask* protoTask = ArenaSerializeTaskToProto(TasksGraph, task, true);
19811977
datashardTasks[task.Meta.ShardId].emplace_back(protoTask);
19821978

1983-
auto& info = (*ShardIdToTableInfo)[task.Meta.ShardId];
1984-
info.IsOlap = (stageInfo.Meta.TableKind == ETableKind::Olap);
1985-
info.Pathes.insert(stageInfo.Meta.TablePath);
1979+
ShardIdToTableInfo->Add(task.Meta.ShardId, stageInfo.Meta.TableKind == ETableKind::Olap, stageInfo.Meta.TablePath);
19861980
} else if (stageInfo.Meta.IsSysView()) {
19871981
computeTasks.emplace_back(task.Id);
19881982
} else {
@@ -2392,7 +2386,7 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
23922386
// Effects are only applied when all locks are valid
23932387
receivingShardsSet.insert(shardId);
23942388

2395-
if (HtapTx && ShardIdToTableInfo->at(shardId).IsOlap) {
2389+
if (HtapTx && ShardIdToTableInfo->Get(shardId).IsOlap) {
23962390
receivingColumnShardsSet.insert(shardId);
23972391
}
23982392
}

0 commit comments

Comments
 (0)