Skip to content

Commit 228ad64

Browse files
kohtalagrs
authored andcommitted
Send transfer frames that fit in the window for a larger delivery
No frames were sent to the open window for a delivery that was larger than the recipient was ready to receive.
1 parent 7136c1c commit 228ad64

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

lib/session.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ Outgoing.prototype.send = function (sender, tag, data, format) {
159159
'link':sender,
160160
'data': fragments,
161161
'format':format ? format : 0,
162+
'next_to_send': 0,
162163
'sent': false,
163164
'settled': false,
164165
'state': undefined,
@@ -229,20 +230,27 @@ Outgoing.prototype.process = function() {
229230
d = this.deliveries.by_id(this.next_pending_delivery);
230231
if (d) {
231232
if (d.link.has_credit()) {
232-
if (this.transfer_window() >= d.data.length) {
233-
this.window -= d.data.length;
234-
for (var i = 0; i < d.data.length; i++) {
233+
const num_to_send = Math.min(this.transfer_window(), d.data.length - d.next_to_send);
234+
if (num_to_send > 0) {
235+
this.window -= num_to_send;
236+
const end_of_send = d.next_to_send + num_to_send;
237+
for (var i = d.next_to_send; i < end_of_send; i++) {
235238
this.next_transfer_id++;
236239
var more = (i+1) < d.data.length;
237240
var transfer = frames.transfer({'handle':d.link.local.handle,'message_format':d.format,'delivery_id':d.id, 'delivery_tag':d.tag, 'settled':d.settled, 'more':more});
238241
d.link.session.output(transfer, d.data[i]);
242+
}
243+
if (end_of_send < d.data.length) {
244+
d.next_to_send = end_of_send;
245+
break;
246+
} else {
239247
if (d.settled) {
240248
d.remote_settled = true;//if sending presettled, it can now be cleaned up
241249
}
250+
d.link.credit--;
251+
d.link.delivery_count++;
252+
this.next_pending_delivery++;
242253
}
243-
d.link.credit--;
244-
d.link.delivery_count++;
245-
this.next_pending_delivery++;
246254
} else {
247255
log.flow('[%s] Incoming window of peer preventing sending further transfers: remote_window=%d, remote_next_transfer_id=%d, next_transfer_id=%d',
248256
this.connection.options.id, this.remote_window, this.remote_next_transfer_id, this.next_transfer_id);

0 commit comments

Comments
 (0)