@@ -95,7 +95,7 @@ void TBaseChangeSender::EnqueueRecords(TVector<TEvChangeExchange::TEvEnqueueReco
9595 RequestRecords ();
9696}
9797
98- bool TBaseChangeSender::RequestRecords () {
98+ bool TBaseChangeSender::RequestRecords (bool forceAtLeastOne ) {
9999 if (!Enqueued) {
100100 return false ;
101101 }
@@ -105,7 +105,11 @@ bool TBaseChangeSender::RequestRecords() {
105105
106106 while (it != Enqueued.end ()) {
107107 if (MemUsage && (MemUsage + it->BodySize ) > MemLimit) {
108- break ;
108+ if (!forceAtLeastOne) {
109+ break ;
110+ }
111+
112+ forceAtLeastOne = false ;
109113 }
110114
111115 MemUsage += it->BodySize ;
@@ -161,7 +165,20 @@ void TBaseChangeSender::SendRecords() {
161165 THashSet<ui64> registrations;
162166 bool needToResolve = false ;
163167
168+ // used to avoid deadlock between RequestRecords & SendRecords
169+ bool processedAtLeastOne = false ;
170+
164171 while (it != PendingSent.end ()) {
172+ if (Enqueued && Enqueued.begin ()->Order <= it->first ) {
173+ break ;
174+ }
175+
176+ processedAtLeastOne = true ;
177+
178+ if (PendingBody && PendingBody.begin ()->Order <= it->first ) {
179+ break ;
180+ }
181+
165182 if (!it->second ->IsBroadcast ()) {
166183 const ui64 partitionId = Resolver->GetPartitionId (it->second );
167184 if (!Senders.contains (partitionId)) {
@@ -215,7 +232,7 @@ void TBaseChangeSender::SendRecords() {
215232 Resolver->Resolve ();
216233 }
217234
218- RequestRecords ();
235+ RequestRecords (!processedAtLeastOne );
219236}
220237
221238void TBaseChangeSender::ForgetRecords (TVector<ui64>&& records) {
0 commit comments