Skip to content

Commit d563efb

Browse files
Cherry pick fix leak (#3167)
Co-authored-by: Oleg Doronin <[email protected]>
1 parent 6fbfd4a commit d563efb

File tree

6 files changed

+43
-6
lines changed

6 files changed

+43
-6
lines changed

.github/config/muted_ya.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@ ydb/core/client/ut TClientTest.ReadFromFollower
1414
ydb/core/client/ut TFlatTest.AutoSplitMergeQueue
1515
ydb/core/cms/ut_sentinel TSentinelTests.BSControllerCantChangeStatus
1616
ydb/core/debug_tools/ut OperationLog.ConcurrentWrites
17-
ydb/core/persqueue/ut [31/40]*
18-
ydb/core/persqueue/ut TopicSplitMerge.PartitionSplit
19-
ydb/core/persqueue/ut TPersQueueMirrorer.TestBasicRemote
20-
ydb/core/persqueue/ut TPQTest.TestDirectReadHappyWay
2117
ydb/core/quoter/ut QuoterWithKesusTest.PrefetchCoefficient
2218
ydb/core/kafka_proxy/ut KafkaProtocol.CreatePartitionsScenario
2319
ydb/core/kafka_proxy/ut KafkaProtocol.ProduceScenario

ydb/core/persqueue/ut/mirrorer_ut.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,6 @@ Y_UNIT_TEST_SUITE(TPersQueueMirrorer) {
251251
}
252252
}
253253
}
254-
255254
}
256255

257256
Y_UNIT_TEST(ValidStartStream) {

ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/read_session.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ TReadSession::TReadSession(const TReadSessionSettings& settings,
5757
}
5858

5959
TReadSession::~TReadSession() {
60+
Close(TDuration::Zero());
61+
6062
{
6163
TDeferredActions<true> deferred;
6264
NYql::TIssues issues;

ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/read_session.h

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,11 @@ class TRawPartitionStreamEventQueue {
518518
(NotReady.empty() ? Ready : NotReady).pop_back();
519519
}
520520

521+
void clear() noexcept {
522+
NotReady.clear();
523+
Ready.clear();
524+
}
525+
521526
void SignalReadyEvents(TIntrusivePtr<TPartitionStreamImpl<UseMigrationProtocol>> stream,
522527
TReadSessionEventsQueue<UseMigrationProtocol>& queue,
523528
TDeferredActions<UseMigrationProtocol>& deferred);
@@ -539,6 +544,7 @@ class TRawPartitionStreamEventQueue {
539544
TUserRetrievedEventsInfoAccumulator<UseMigrationProtocol>& accumulator,
540545
std::deque<TRawPartitionStreamEvent<UseMigrationProtocol>>& queue);
541546

547+
private:
542548
std::deque<TRawPartitionStreamEvent<UseMigrationProtocol>> Ready;
543549
std::deque<TRawPartitionStreamEvent<UseMigrationProtocol>> NotReady;
544550
};
@@ -719,6 +725,14 @@ class TPartitionStreamImpl : public TAPartitionStream<UseMigrationProtocol> {
719725

720726
void DeleteNotReadyTail(TDeferredActions<UseMigrationProtocol>& deferred);
721727

728+
void ClearQueue() noexcept {
729+
EventsQueue.clear();
730+
}
731+
732+
TRawPartitionStreamEventQueue<UseMigrationProtocol> ExtractQueue() noexcept {
733+
return std::move(EventsQueue);
734+
}
735+
722736
static void GetDataEventImpl(TIntrusivePtr<TPartitionStreamImpl<UseMigrationProtocol>> partitionStream,
723737
size_t& maxEventsCount,
724738
size_t& maxByteSize,
@@ -776,14 +790,27 @@ class TReadSessionEventsQueue: public TBaseSessionEventsQueue<TAReadSessionSetti
776790

777791
bool Close(const TASessionClosedEvent<UseMigrationProtocol>& event, TDeferredActions<UseMigrationProtocol>& deferred) {
778792
TWaiter waiter;
793+
TVector<TRawPartitionStreamEventQueue<UseMigrationProtocol>> deferredDelete;
779794
with_lock (TParent::Mutex) {
780-
if (TParent::Closed)
795+
if (TParent::Closed) {
781796
return false;
797+
}
798+
deferredDelete.reserve(TParent::Events.size());
799+
while (!TParent::Events.empty()) {
800+
auto& event = TParent::Events.front();
801+
if (!event.IsEmpty()) {
802+
deferredDelete.push_back(event.PartitionStream->ExtractQueue());
803+
}
804+
TParent::Events.pop();
805+
}
782806
TParent::CloseEvent = event;
783807
TParent::Closed = true;
784808
waiter = TWaiter(TParent::Waiter.ExtractPromise(), this);
785809
}
786810

811+
// Delayed deletion is necessary to avoid deadlock with PushEvent
812+
deferredDelete.clear();
813+
787814
TReadSessionEventInfo<UseMigrationProtocol> info(event);
788815
ApplyHandler(info, deferred);
789816
deferred.DeferSignalWaiter(std::move(waiter));
@@ -959,6 +986,8 @@ class TSingleClusterReadSessionImpl : public NPersQueue::TEnableSelfContext<TSin
959986
{
960987
}
961988

989+
~TSingleClusterReadSessionImpl();
990+
962991
void Start();
963992
void ConfirmPartitionStreamCreate(const TPartitionStreamImpl<UseMigrationProtocol>* partitionStream, TMaybe<ui64> readOffset, TMaybe<ui64> commitOffset);
964993
void ConfirmPartitionStreamDestroy(TPartitionStreamImpl<UseMigrationProtocol>* partitionStream);

ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/read_session.ipp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,14 @@ void TRawPartitionStreamEventQueue<UseMigrationProtocol>::DeleteNotReadyTail(TDe
225225
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
226226
// TSingleClusterReadSessionImpl
227227

228+
template<bool UseMigrationProtocol>
229+
TSingleClusterReadSessionImpl<UseMigrationProtocol>::~TSingleClusterReadSessionImpl() {
230+
for (auto&& [_, partitionStream] : PartitionStreams) {
231+
partitionStream->ClearQueue();
232+
}
233+
}
234+
235+
228236
template<bool UseMigrationProtocol>
229237
TStringBuilder TSingleClusterReadSessionImpl<UseMigrationProtocol>::GetLogPrefix() const {
230238
return TStringBuilder() << GetDatabaseLogPrefix(Database) << "[" << SessionId << "] [" << ClusterName << "] ";
@@ -1057,6 +1065,7 @@ inline void TSingleClusterReadSessionImpl<true>::OnReadDoneImpl(
10571065
PartitionStreams[partitionStream->GetAssignId()];
10581066
if (currentPartitionStream) {
10591067
CookieMapping.RemoveMapping(currentPartitionStream->GetPartitionStreamId());
1068+
10601069
bool pushRes = EventsQueue->PushEvent(
10611070
currentPartitionStream,
10621071
TReadSessionEvent::TPartitionStreamClosedEvent(

ydb/public/sdk/cpp/client/ydb_topic/impl/read_session.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ TReadSession::TReadSession(const TReadSessionSettings& settings,
3434
}
3535

3636
TReadSession::~TReadSession() {
37+
Close(TDuration::Zero());
38+
3739
Abort(EStatus::ABORTED, "Aborted");
3840
ClearAllEvents();
3941

0 commit comments

Comments
 (0)