From 9295a00a976df83d2c35a6dc56ceb35c05f692dd Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Mon, 22 Jun 2020 21:59:14 +0200 Subject: Fixup server connection timeouts --- server-proxy.c | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) (limited to 'server-proxy.c') diff --git a/server-proxy.c b/server-proxy.c index 2e8bbd5..f897aa2 100644 --- a/server-proxy.c +++ b/server-proxy.c @@ -10,6 +10,7 @@ #include "main.h" #include "uring.h" +#include "ptimer.h" #include "server.h" #include "server-proxy.h" #include "utils.h" @@ -121,12 +122,15 @@ proxy_delete(struct server_proxy *proxy) assert_return(proxy); + ptimer_del_task(&proxy->ptask); + if (cfg->splice_supported) { uring_close(&proxy->server->task, proxy->cpipe[PIPE_RD]); uring_close(&proxy->server->task, proxy->cpipe[PIPE_WR]); uring_close(&proxy->server->task, proxy->spipe[PIPE_RD]); uring_close(&proxy->server->task, proxy->spipe[PIPE_WR]); } + uring_task_set_fd(&proxy->servertask, proxy->sfd); uring_task_destroy(&proxy->servertask); uring_task_set_fd(&proxy->clienttask, proxy->cfd); @@ -149,7 +153,6 @@ proxy_client_written(struct uring_task *task, int res) if (res <= 0) { debug(DBG_PROXY, "%s: res: %i", proxy->server->name, res); - uring_task_close_fd(task); proxy_delete(proxy); return; } @@ -169,7 +172,6 @@ proxy_client_read(struct uring_task *task, int res) if (res <= 0) { debug(DBG_PROXY, "%s: res: %i", proxy->server->name, res); - uring_task_close_fd(task); proxy_delete(proxy); return; } @@ -190,7 +192,6 @@ proxy_server_written(struct uring_task *task, int res) if (res <= 0) { debug(DBG_PROXY, "%s: res: %i", proxy->server->name, res); - uring_task_close_fd(task); proxy_delete(proxy); return; } @@ -210,7 +211,6 @@ proxy_server_read(struct uring_task *task, int res) if (res <= 0) { debug(DBG_PROXY, "%s: res: %i", proxy->server->name, res); - uring_task_close_fd(task); proxy_delete(proxy); return; } @@ -303,13 +303,17 @@ proxy_connected_cb(struct connection *conn, bool connected) assert_task_alive(DBG_PROXY, &proxy->clienttask); assert_task_alive(DBG_PROXY, &proxy->servertask); + proxy->connecting = false; if (!connected) { error("%s: proxy connection to remote server failed", proxy->server->name); - proxy_delete(proxy); + if (!proxy->ptask.active) + proxy_delete(proxy); return; } + ptimer_del_task(&proxy->ptask); + proxy->sfd = proxy->servertask.fd; verbose("%s: proxy connection %s -> %s opened", proxy->server->name, @@ -338,6 +342,21 @@ proxy_refdump(struct server_proxy *proxy) uring_task_refdump(&proxy->servertask); } +static void +proxy_connect_timer_cb(struct ptimer_task *ptask) +{ + struct server_proxy *proxy = container_of(ptask, struct server_proxy, ptask); + + assert_return(ptask); + + if (proxy->connecting) + return; + + proxy->connecting = true; + connect_any(&proxy->servertask, &proxy->server->remotes, + &proxy->server_conn, proxy_connected_cb); +} + struct server_proxy * proxy_new(struct server *server, struct saddr *client, int fd) { @@ -381,10 +400,14 @@ proxy_new(struct server *server, struct saddr *client, int fd) uring_task_set_buf(&proxy->servertask, &proxy->serverbuf); list_add(&proxy->list, &server->proxys); + if (server->state != SERVER_STATE_RUNNING) { - /* FIXME: We need to wait for the server to start */ - server_start(server); + server_start(server); + ptask_init(&proxy->ptask, 3, 20, proxy_connect_timer_cb); + ptimer_add_task(&proxy->ptask); } + + proxy->connecting = true; connect_any(&proxy->servertask, &server->remotes, &proxy->server_conn, proxy_connected_cb); -- cgit v1.2.3