delay tearing down tcp control connections
The TEST_END message is racing with the server_timer_proc timer. When the RTT is higher than a second, the timer wins the race and closes the control socket before the results are exchanged. This results in the client reporting: "error - control socket has closed unexpectedly" as reported in GH issue 751. This change doesn't prevent the race, but significantly increases the grace period based on a maximum RTT of 4 seconds and accounts for the ten transitions in the iperf3 state machine. (cherry picked from commit 34bdddb75194e880e6dbc6dcaa5b5386975c11b3) (originally submitted by @acooks in #859)
Этот коммит содержится в:
родитель
6c7834629a
Коммит
098dd3cc1b
@ -270,6 +270,9 @@ create_server_timers(struct iperf_test * test)
|
|||||||
{
|
{
|
||||||
struct iperf_time now;
|
struct iperf_time now;
|
||||||
TimerClientData cd;
|
TimerClientData cd;
|
||||||
|
int max_rtt = 4; /* seconds */
|
||||||
|
int state_transitions = 10; /* number of state transitions in iperf3 */
|
||||||
|
int grace_period = max_rtt * state_transitions;
|
||||||
|
|
||||||
if (iperf_time_now(&now) < 0) {
|
if (iperf_time_now(&now) < 0) {
|
||||||
i_errno = IEINITTEST;
|
i_errno = IEINITTEST;
|
||||||
@ -279,7 +282,7 @@ create_server_timers(struct iperf_test * test)
|
|||||||
test->timer = test->stats_timer = test->reporter_timer = NULL;
|
test->timer = test->stats_timer = test->reporter_timer = NULL;
|
||||||
if (test->duration != 0 ) {
|
if (test->duration != 0 ) {
|
||||||
test->done = 0;
|
test->done = 0;
|
||||||
test->timer = tmr_create(&now, server_timer_proc, cd, (test->duration + test->omit + 5) * SEC_TO_US, 0);
|
test->timer = tmr_create(&now, server_timer_proc, cd, (test->duration + test->omit + grace_period) * SEC_TO_US, 0);
|
||||||
if (test->timer == NULL) {
|
if (test->timer == NULL) {
|
||||||
i_errno = IEINITTEST;
|
i_errno = IEINITTEST;
|
||||||
return -1;
|
return -1;
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user