alibaba / xquic

XQUIC Library released by Alibaba is a cross-platform implementation of QUIC and HTTP/3 protocol.
Apache License 2.0
1.65k stars 326 forks source link

[Bug]: in some case, delete record table failed #201

Closed adcen0107 closed 2 years ago

adcen0107 commented 2 years ago

What happened?

在函数xqc_send_ctl_on_ack_received中会完成两个逻辑: 1、对unacked packet out 处理,进行重传; 2、对unacked packet out处理,清理record table。 这两个逻辑除了在遍历时是相同的,遍历之后是独立的,而当前代码却通过 has_ack_eliciting作为开关统一控制,这似乎不合适。 会将1、2两个行为逻辑绑定在一起,无法有效执行行为2,导致record table不能及时清理,ACK反馈数量很大,影响系统性能。

Steps To Reproduce

1、test_client -a 服务端IP -p 服务端端口 -T -N test_server -p 服务端绑定的本地端口 2、在链路设置少量丢包率,如 2%,运行一分钟。 3、会观察到test_client发了多个ACK到test_server,但是test_server只完成了少量的delete record,但是,另外的那些ACK是完全可以执行delete record清理的。

Relevant log output

1.test_server收到的前一个ACK,完成了清理
[2022/07/04 10:41:25 506349] [debug] |scid:499438ed4cfb261f|xqc_send_ctl_on_ack_received|pi-ACK|ACKed po_num:2580 is recved_largest:7629,to update ack_both[2]:0|need_del_record|
[2022/07/04 10:41:25 506399] [debug] |scid:499438ed4cfb261f|xqc_send_ctl_on_ack_received|pi-ACK ACKed po_num:2580|Local pns:2 clean xqc_recv_record_del, base=7630|Local send [2, 5, 2582]|peer recv largest:2580|rtt:258 ms
2、test_server收到的后一个ACK,可以完成清理,但是未完成。
[2022/07/04 10:41:33 233557] [debug] |scid:499438ed4cfb261f|xqc_send_ctl_on_ack_received|pi-ACK|ACKed po_num:5691 is recved_largest:15018,to update ack_both[2]:7629|need_del_record|
原因在于 packet_out->po_pkt.pkt_num == largest_ack 不成立,pkt_num = 5691,而largest_ack = 5697.
adcen0107 commented 2 years ago

新版本已经修复这个问题了