@@ -729,6 +729,10 @@ class TPartitionStreamImpl : public TAPartitionStream<UseMigrationProtocol> {
729
729
EventsQueue.clear ();
730
730
}
731
731
732
+ TRawPartitionStreamEventQueue<UseMigrationProtocol> ExtractQueue () noexcept {
733
+ return std::move (EventsQueue);
734
+ }
735
+
732
736
static void GetDataEventImpl (TIntrusivePtr<TPartitionStreamImpl<UseMigrationProtocol>> partitionStream,
733
737
size_t & maxEventsCount,
734
738
size_t & maxByteSize,
@@ -786,14 +790,16 @@ class TReadSessionEventsQueue: public TBaseSessionEventsQueue<TAReadSessionSetti
786
790
787
791
bool Close (const TASessionClosedEvent<UseMigrationProtocol>& event, TDeferredActions<UseMigrationProtocol>& deferred) {
788
792
TWaiter waiter;
793
+ TVector<TRawPartitionStreamEventQueue<UseMigrationProtocol>> defferedDelete;
789
794
with_lock (TParent::Mutex) {
790
795
if (TParent::Closed) {
791
796
return false ;
792
797
}
798
+ defferedDelete.reserve (TParent::Events.size ());
793
799
while (!TParent::Events.empty ()) {
794
800
auto & event = TParent::Events.front ();
795
801
if (!event.IsEmpty ()) {
796
- event.PartitionStream ->ClearQueue ( );
802
+ defferedDelete. push_back ( event.PartitionStream ->ExtractQueue () );
797
803
}
798
804
TParent::Events.pop ();
799
805
}
@@ -802,6 +808,9 @@ class TReadSessionEventsQueue: public TBaseSessionEventsQueue<TAReadSessionSetti
802
808
waiter = TWaiter (TParent::Waiter.ExtractPromise (), this );
803
809
}
804
810
811
+ // Delayed deletion is necessary to avoid deadlock with PushEvent
812
+ defferedDelete.clear ();
813
+
805
814
TReadSessionEventInfo<UseMigrationProtocol> info (event);
806
815
ApplyHandler (info, deferred);
807
816
deferred.DeferSignalWaiter (std::move (waiter));
0 commit comments