@@ -739,6 +739,10 @@ class TPartitionStreamImpl : public TAPartitionStream<UseMigrationProtocol> {
739
739
EventsQueue.clear ();
740
740
}
741
741
742
+ TRawPartitionStreamEventQueue<UseMigrationProtocol> ExtractQueue () noexcept {
743
+ return std::move (EventsQueue);
744
+ }
745
+
742
746
static void GetDataEventImpl (TIntrusivePtr<TPartitionStreamImpl<UseMigrationProtocol>> partitionStream,
743
747
size_t & maxEventsCount,
744
748
size_t & maxByteSize,
@@ -796,14 +800,16 @@ class TReadSessionEventsQueue: public TBaseSessionEventsQueue<TAReadSessionSetti
796
800
797
801
bool Close (const TASessionClosedEvent<UseMigrationProtocol>& event, TDeferredActions<UseMigrationProtocol>& deferred) {
798
802
TWaiter waiter;
803
+ TVector<TRawPartitionStreamEventQueue<UseMigrationProtocol>> defferedDelete;
799
804
with_lock (TParent::Mutex) {
800
805
if (TParent::Closed) {
801
806
return false ;
802
807
}
808
+ defferedDelete.reserve (TParent::Events.size ());
803
809
while (!TParent::Events.empty ()) {
804
810
auto & event = TParent::Events.front ();
805
811
if (!event.IsEmpty ()) {
806
- event.PartitionStream ->ClearQueue ( );
812
+ defferedDelete. push_back ( event.PartitionStream ->ExtractQueue () );
807
813
}
808
814
TParent::Events.pop ();
809
815
}
@@ -812,6 +818,9 @@ class TReadSessionEventsQueue: public TBaseSessionEventsQueue<TAReadSessionSetti
812
818
waiter = TWaiter (TParent::Waiter.ExtractPromise (), this );
813
819
}
814
820
821
+ // Delayed deletion is necessary to avoid deadlock with PushEvent
822
+ defferedDelete.clear ();
823
+
815
824
TReadSessionEventInfo<UseMigrationProtocol> info (event);
816
825
ApplyHandler (info, deferred);
817
826
deferred.DeferSignalWaiter (std::move (waiter));
0 commit comments