Skip to content

Commit 2fe54ce

Browse files
Moved commit "Memory leak in Topic SDK" from ydb repo
1 parent 6ba38eb commit 2fe54ce

File tree

2 files changed

+57
-14
lines changed

2 files changed

+57
-14
lines changed

src/client/topic/impl/read_session_impl.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class TDeferredActions {
140140
}
141141

142142
void DeferReadFromProcessor(const typename IProcessor<UseMigrationProtocol>::TPtr& processor, TServerMessage<UseMigrationProtocol>* dst, typename IProcessor<UseMigrationProtocol>::TReadCallback callback);
143-
void DeferStartExecutorTask(const typename IAExecutor<UseMigrationProtocol>::TPtr& executor, typename IAExecutor<UseMigrationProtocol>::TFunction task);
143+
void DeferStartExecutorTask(const typename IAExecutor<UseMigrationProtocol>::TPtr& executor, typename IAExecutor<UseMigrationProtocol>::TFunction&& task);
144144
void DeferAbortSession(TCallbackContextPtr<UseMigrationProtocol> cbContext, TASessionClosedEvent<UseMigrationProtocol>&& closeEvent);
145145
void DeferAbortSession(TCallbackContextPtr<UseMigrationProtocol> cbContext, EStatus statusCode, NYql::TIssues&& issues);
146146
void DeferAbortSession(TCallbackContextPtr<UseMigrationProtocol> cbContext, EStatus statusCode, const std::string& message);
@@ -206,6 +206,8 @@ class TDataDecompressionInfo : public std::enable_shared_from_this<TDataDecompre
206206
void PlanDecompressionTasks(double averageCompressionRatio,
207207
TIntrusivePtr<TPartitionStreamImpl<UseMigrationProtocol>> partitionStream);
208208

209+
void OnDestroyReadSession();
210+
209211
bool IsReady() const {
210212
return SourceDataNotProcessed == 0;
211213
}
@@ -303,6 +305,8 @@ class TDataDecompressionInfo : public std::enable_shared_from_this<TDataDecompre
303305
return EstimatedDecompressedSize;
304306
}
305307

308+
void ClearParent();
309+
306310
private:
307311
TDataDecompressionInfo::TPtr Parent;
308312
TIntrusivePtr<TPartitionStreamImpl<UseMigrationProtocol>> PartitionStream;
@@ -1096,6 +1100,11 @@ class TSingleClusterReadSessionImpl : public TEnableSelfContext<TSingleClusterRe
10961100

10971101
void OnCreateNewDecompressionTask();
10981102
void OnDecompressionInfoDestroy(i64 compressedSize, i64 decompressedSize, i64 messagesCount, i64 serverBytesSize);
1103+
void OnDecompressionInfoDestroyImpl(i64 compressedSize,
1104+
i64 decompressedSize,
1105+
i64 messagesCount,
1106+
i64 serverBytesSize,
1107+
TDeferredActions<UseMigrationProtocol>& deferred);
10991108

11001109
void OnDataDecompressed(i64 sourceSize, i64 estimatedDecompressedSize, i64 decompressedSize, size_t messagesCount, i64 serverBytesSize = 0);
11011110

@@ -1285,6 +1294,8 @@ class TSingleClusterReadSessionImpl : public TEnableSelfContext<TSingleClusterRe
12851294
{
12861295
}
12871296

1297+
void OnDestroyReadSession();
1298+
12881299
TDataDecompressionInfoPtr<UseMigrationProtocol> BatchInfo;
12891300
TIntrusivePtr<TPartitionStreamImpl<UseMigrationProtocol>> PartitionStream;
12901301
};

src/client/topic/impl/read_session_impl.ipp

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,15 @@ void TRawPartitionStreamEventQueue<UseMigrationProtocol>::DeleteNotReadyTail(TDe
218218
swap(ready, NotReady);
219219
}
220220

221+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
222+
// TDecompressionQueueItem
223+
224+
template <bool UseMigrationProtocol>
225+
void TSingleClusterReadSessionImpl<UseMigrationProtocol>::TDecompressionQueueItem::OnDestroyReadSession()
226+
{
227+
BatchInfo->OnDestroyReadSession();
228+
}
229+
221230
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
222231
// TSingleClusterReadSessionImpl
223232

@@ -226,6 +235,10 @@ TSingleClusterReadSessionImpl<UseMigrationProtocol>::~TSingleClusterReadSessionI
226235
for (auto&& [_, partitionStream] : PartitionStreams) {
227236
partitionStream->ClearQueue();
228237
}
238+
239+
for (auto& e : DecompressionQueue) {
240+
e.OnDestroyReadSession();
241+
}
229242
}
230243

231244
template<bool UseMigrationProtocol>
@@ -1565,6 +1578,7 @@ void TSingleClusterReadSessionImpl<UseMigrationProtocol>::OnDecompressionInfoDes
15651578

15661579
template<bool UseMigrationProtocol>
15671580
void TSingleClusterReadSessionImpl<UseMigrationProtocol>::OnDataDecompressed(i64 sourceSize, i64 estimatedDecompressedSize, i64 decompressedSize, size_t messagesCount, i64 serverBytesSize) {
1581+
15681582
TDeferredActions<UseMigrationProtocol> deferred;
15691583

15701584
Y_ABORT_UNLESS(DecompressionTasksInflight > 0);
@@ -2512,6 +2526,14 @@ void TDataDecompressionInfo<UseMigrationProtocol>::PlanDecompressionTasks(double
25122526
}
25132527
}
25142528

2529+
template <bool UseMigrationProtocol>
2530+
void TDataDecompressionInfo<UseMigrationProtocol>::OnDestroyReadSession()
2531+
{
2532+
for (auto& task : Tasks) {
2533+
task.ClearParent();
2534+
}
2535+
}
2536+
25152537
template<bool UseMigrationProtocol>
25162538
void TDataDecompressionEvent<UseMigrationProtocol>::TakeData(TIntrusivePtr<TPartitionStreamImpl<UseMigrationProtocol>> partitionStream,
25172539
std::vector<typename TADataReceivedEvent<UseMigrationProtocol>::TMessage>& messages,
@@ -2661,19 +2683,23 @@ TDataDecompressionInfo<UseMigrationProtocol>::TDecompressionTask::TDecompression
26612683

26622684
template<bool UseMigrationProtocol>
26632685
void TDataDecompressionInfo<UseMigrationProtocol>::TDecompressionTask::operator()() {
2686+
auto parent = Parent;
2687+
if (!parent) {
2688+
return;
2689+
}
26642690
i64 minOffset = Max<i64>();
26652691
i64 maxOffset = 0;
2666-
const i64 partition_id = [this](){
2692+
const i64 partition_id = [parent](){
26672693
if constexpr (UseMigrationProtocol) {
2668-
return Parent->ServerMessage.partition();
2694+
return parent->ServerMessage.partition();
26692695
} else {
2670-
return Parent->ServerMessage.partition_session_id();
2696+
return parent->ServerMessage.partition_session_id();
26712697
}
26722698
}();
26732699
i64 dataProcessed = 0;
26742700
size_t messagesProcessed = 0;
26752701
for (const TMessageRange& messages : Messages) {
2676-
auto& batch = *Parent->ServerMessage.mutable_batches(messages.Batch);
2702+
auto& batch = *parent->ServerMessage.mutable_batches(messages.Batch);
26772703
for (size_t i = messages.MessageRange.first; i < messages.MessageRange.second; ++i) {
26782704
auto& data = *batch.mutable_message_data(i);
26792705

@@ -2684,7 +2710,7 @@ void TDataDecompressionInfo<UseMigrationProtocol>::TDecompressionTask::operator(
26842710

26852711
try {
26862712
if constexpr (UseMigrationProtocol) {
2687-
if (Parent->DoDecompress
2713+
if (parent->DoDecompress
26882714
&& data.codec() != Ydb::PersQueue::V1::CODEC_RAW
26892715
&& data.codec() != Ydb::PersQueue::V1::CODEC_UNSPECIFIED
26902716
) {
@@ -2694,7 +2720,7 @@ void TDataDecompressionInfo<UseMigrationProtocol>::TDecompressionTask::operator(
26942720
data.set_codec(Ydb::PersQueue::V1::CODEC_RAW);
26952721
}
26962722
} else {
2697-
if (Parent->DoDecompress
2723+
if (parent->DoDecompress
26982724
&& static_cast<Ydb::Topic::Codec>(batch.codec()) != Ydb::Topic::CODEC_RAW
26992725
&& static_cast<Ydb::Topic::Codec>(batch.codec()) != Ydb::Topic::CODEC_UNSPECIFIED
27002726
) {
@@ -2706,32 +2732,38 @@ void TDataDecompressionInfo<UseMigrationProtocol>::TDecompressionTask::operator(
27062732

27072733
DecompressedSize += data.data().size();
27082734
} catch (...) {
2709-
Parent->PutDecompressionError(std::current_exception(), messages.Batch, i);
2735+
parent->PutDecompressionError(std::current_exception(), messages.Batch, i);
27102736
data.clear_data(); // Free memory, because we don't count it.
27112737

2712-
if (auto session = Parent->CbContext->LockShared()) {
2738+
if (auto session = parent->CbContext->LockShared()) {
27132739
session->GetLog() << TLOG_INFO << "Error decompressing data: " << CurrentExceptionMessage();
27142740
}
27152741
}
27162742
}
27172743
}
2718-
if (auto session = Parent->CbContext->LockShared()) {
2744+
if (auto session = parent->CbContext->LockShared()) {
27192745
LOG_LAZY(session->GetLog(), TLOG_DEBUG, TStringBuilder() << "Decompression task done. Partition/PartitionSessionId: "
27202746
<< partition_id << " (" << minOffset << "-"
27212747
<< maxOffset << ")");
27222748
}
27232749
Y_ASSERT(dataProcessed == SourceDataSize);
27242750

2725-
Parent->OnDataDecompressed(SourceDataSize, EstimatedDecompressedSize, DecompressedSize, messagesProcessed);
2751+
parent->OnDataDecompressed(SourceDataSize, EstimatedDecompressedSize, DecompressedSize, messagesProcessed);
27262752

2727-
Parent->SourceDataNotProcessed -= dataProcessed;
2753+
parent->SourceDataNotProcessed -= dataProcessed;
27282754
Ready->Ready = true;
27292755

2730-
if (auto session = Parent->CbContext->LockShared()) {
2756+
if (auto session = parent->CbContext->LockShared()) {
27312757
session->GetEventsQueue()->SignalReadyEvents(PartitionStream);
27322758
}
27332759
}
27342760

2761+
template<bool UseMigrationProtocol>
2762+
void TDataDecompressionInfo<UseMigrationProtocol>::TDecompressionTask::ClearParent()
2763+
{
2764+
Parent = nullptr;
2765+
}
2766+
27352767
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
27362768
// TUserRetrievedEventsInfoAccumulator
27372769

@@ -2769,7 +2801,7 @@ void TDeferredActions<UseMigrationProtocol>::DeferReadFromProcessor(const typena
27692801
}
27702802

27712803
template<bool UseMigrationProtocol>
2772-
void TDeferredActions<UseMigrationProtocol>::DeferStartExecutorTask(const typename IAExecutor<UseMigrationProtocol>::TPtr& executor, typename IAExecutor<UseMigrationProtocol>::TFunction task) {
2804+
void TDeferredActions<UseMigrationProtocol>::DeferStartExecutorTask(const typename IAExecutor<UseMigrationProtocol>::TPtr& executor, typename IAExecutor<UseMigrationProtocol>::TFunction&& task) {
27732805
ExecutorsTasks.emplace_back(executor, std::move(task));
27742806
}
27752807

0 commit comments

Comments
 (0)