Skip to content

Commit f05faa4

Browse files
quic: free timed out conn when not keep_timed_out
1 parent 2f94aad commit f05faa4

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

src/waltz/quic/fd_quic.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2969,17 +2969,20 @@ fd_quic_handle_crypto_frame( fd_quic_frame_ctx_t * context,
29692969
static int
29702970
fd_quic_conn_free_resources( fd_quic_t * quic, fd_quic_conn_t * conn );
29712971

2972-
static void
2972+
/* Returns new conn state */
2973+
static uint
29732974
fd_quic_timeout_conn( fd_quic_t * quic, fd_quic_conn_t * conn ) {
2975+
quic->metrics.conn_timeout_cnt++;
29742976
if( quic->config.keep_timed_out ) {
29752977
fd_quic_state_t * state = fd_quic_get_state( quic );
29762978
fd_quic_conn_free_resources( quic, conn );
29772979
fd_quic_set_conn_state( conn, FD_QUIC_CONN_STATE_TIMED_OUT );
29782980
fd_quic_svc_schedule( state, conn, FD_QUIC_SVC_TIMEOUT );
2981+
return FD_QUIC_CONN_STATE_TIMED_OUT;
29792982
} else {
29802983
fd_quic_set_conn_state( conn, FD_QUIC_CONN_STATE_DEAD );
2984+
return FD_QUIC_CONN_STATE_DEAD;
29812985
}
2982-
quic->metrics.conn_timeout_cnt++;
29832986
}
29842987

29852988
static int
@@ -2991,7 +2994,7 @@ fd_quic_svc_poll( fd_quic_t * quic,
29912994
conn->state == FD_QUIC_CONN_STATE_TIMED_OUT ) ) {
29922995
/* connection shouldn't have been scheduled,
29932996
and is now removed, so just continue */
2994-
FD_LOG_ERR(( "Bad conn in schedule (svc_type=%u), state=%s", conn->svc_type, conn->state==FD_QUIC_CONN_STATE_INVALID ? "INVALID" : "TIMED_OUT" ));
2997+
FD_LOG_CRIT(( "Bad conn in schedule (svc_type=%u), state=%s", conn->svc_type, conn->state==FD_QUIC_CONN_STATE_INVALID ? "INVALID" : "TIMED_OUT" ));
29952998
return 1;
29962999
}
29973000

@@ -3010,8 +3013,9 @@ fd_quic_svc_poll( fd_quic_t * quic,
30103013
conn->server?"SERVER":"CLIENT",
30113014
(void *)conn, conn->conn_idx, (double)fd_quic_ticks_to_us(conn->idle_timeout_ticks) / 1e3 )); )
30123015

3013-
fd_quic_timeout_conn( quic, conn );
3014-
return 1;
3016+
/* Handle timeout based on config. If left as TIMED_OUT rather than DEAD,
3017+
don't bother servicing further */
3018+
if( fd_quic_timeout_conn( quic, conn )==FD_QUIC_CONN_STATE_TIMED_OUT ) return 1;
30153019
}
30163020
} else if( quic->config.keep_alive & !!(conn->let_die_ticks > now) ) {
30173021
/* send PING */

src/waltz/quic/tests/test_quic_keep_alive.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ int server_complete = 0;
66
int client_complete = 0;
77
fd_quic_conn_t * server_conn = NULL;
88

9+
int called_final = 0;
10+
911
void
1012
my_connection_new( fd_quic_conn_t * conn FD_PARAM_UNUSED,
1113
void * vp_context FD_PARAM_UNUSED ) {
@@ -19,6 +21,12 @@ my_handshake_complete( fd_quic_conn_t * conn FD_PARAM_UNUSED,
1921
client_complete = 1;
2022
}
2123

24+
void
25+
my_connection_final( fd_quic_conn_t * conn FD_PARAM_UNUSED,
26+
void * vp_context FD_PARAM_UNUSED ) {
27+
called_final = 1;
28+
}
29+
2230
/* global "clock" */
2331
ulong now = 145;
2432

@@ -83,6 +91,7 @@ walk_timeout_period( fd_quic_t * client_quic, fd_quic_t * server_quic, int eight
8391
static void
8492
test_quic_keep_alive( fd_quic_t * client_quic, fd_quic_t * server_quic, int keep_alive ) {
8593

94+
called_final = 0;
8695
client_quic->config.keep_alive = keep_alive;
8796
test_init( client_quic, server_quic );
8897

@@ -92,18 +101,21 @@ test_quic_keep_alive( fd_quic_t * client_quic, fd_quic_t * server_quic, int keep
92101
} else {
93102
FD_TEST( server_conn->state == FD_QUIC_CONN_STATE_INVALID ||
94103
server_conn->state == FD_QUIC_CONN_STATE_DEAD );
104+
FD_TEST( called_final );
95105
}
96106
}
97107

98108
static void
99109
test_quic_let_die( fd_quic_t * client_quic, fd_quic_t * server_quic ) {
110+
called_final = 0;
100111
ulong const timestep = client_quic->config.idle_timeout>>3;
101112
fd_quic_conn_t * client_conn = test_init( client_quic, server_quic );
102113

103114
fd_quic_conn_let_die( client_conn, timestep );
104115
walk_timeout_period( client_quic, server_quic, 8 );
105116
FD_TEST( server_conn->state == FD_QUIC_CONN_STATE_INVALID ||
106117
server_conn->state == FD_QUIC_CONN_STATE_DEAD );
118+
FD_TEST( called_final );
107119
}
108120

109121
static void
@@ -247,6 +259,7 @@ main( int argc, char ** argv ) {
247259

248260
server_quic->cb.conn_new = my_connection_new;
249261
client_quic->cb.conn_hs_complete = my_handshake_complete;
262+
server_quic->cb.conn_final = my_connection_final;
250263

251264
server_quic->config.initial_rx_max_stream_data = 1<<16;
252265
client_quic->config.initial_rx_max_stream_data = 1<<16;

0 commit comments

Comments
 (0)