@@ -18,7 +18,7 @@ void TBaseChangeSender::LazyCreateSender(THashMap<ui64, TSender>& senders, ui64
18
18
for (const auto & [order, broadcast] : Broadcasting) {
19
19
if (AddBroadcastPartition (order, partitionId)) {
20
20
// re-enqueue record to send it in the correct order
21
- Enqueued.insert (broadcast.Record );
21
+ Enqueued.insert (ReEnqueue ( broadcast.Record ) );
22
22
}
23
23
}
24
24
}
@@ -95,21 +95,22 @@ void TBaseChangeSender::EnqueueRecords(TVector<TEvChangeExchange::TEvEnqueueReco
95
95
RequestRecords ();
96
96
}
97
97
98
- bool TBaseChangeSender::RequestRecords (bool forceAtLeastOne ) {
98
+ bool TBaseChangeSender::RequestRecords () {
99
99
if (!Enqueued) {
100
100
return false ;
101
101
}
102
102
103
103
auto it = Enqueued.begin ();
104
- TVector<TRequestedRecord > records;
104
+ TVector<TIncompleteRecord > records;
105
105
106
+ bool exceeded = false ;
106
107
while (it != Enqueued.end ()) {
107
108
if (MemUsage && (MemUsage + it->BodySize ) > MemLimit) {
108
- if (!forceAtLeastOne ) {
109
+ if (!it-> ReEnqueued || exceeded ) {
109
110
break ;
110
111
}
111
112
112
- forceAtLeastOne = false ;
113
+ exceeded = true ;
113
114
}
114
115
115
116
MemUsage += it->BodySize ;
@@ -165,16 +166,11 @@ void TBaseChangeSender::SendRecords() {
165
166
THashSet<ui64> registrations;
166
167
bool needToResolve = false ;
167
168
168
- // used to avoid deadlock between RequestRecords & SendRecords
169
- bool processedAtLeastOne = false ;
170
-
171
169
while (it != PendingSent.end ()) {
172
170
if (Enqueued && Enqueued.begin ()->Order <= it->first ) {
173
171
break ;
174
172
}
175
173
176
- processedAtLeastOne = true ;
177
-
178
174
if (PendingBody && PendingBody.begin ()->Order <= it->first ) {
179
175
break ;
180
176
}
@@ -232,7 +228,7 @@ void TBaseChangeSender::SendRecords() {
232
228
Resolver->Resolve ();
233
229
}
234
230
235
- RequestRecords (!processedAtLeastOne );
231
+ RequestRecords ();
236
232
}
237
233
238
234
void TBaseChangeSender::ForgetRecords (TVector<ui64>&& records) {
@@ -314,12 +310,12 @@ void TBaseChangeSender::SendPreparedRecords(ui64 partitionId) {
314
310
315
311
void TBaseChangeSender::ReEnqueueRecords (const TSender& sender) {
316
312
for (const auto & record : sender.Pending ) {
317
- Enqueued.insert (record);
313
+ Enqueued.insert (ReEnqueue ( record) );
318
314
}
319
315
320
316
for (const auto & record : sender.Prepared ) {
321
317
if (!record->IsBroadcast ()) {
322
- Enqueued.emplace ( record->GetOrder (), record->GetBody ().size ());
318
+ Enqueued.insert ( ReEnqueue ( record->GetOrder (), record->GetBody ().size () ));
323
319
MemUsage -= record->GetBody ().size ();
324
320
}
325
321
}
0 commit comments