summaryrefslogtreecommitdiff
path: root/server-proxy.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-06-22 21:59:14 +0200
committerDavid Härdeman <david@hardeman.nu>2020-06-22 21:59:14 +0200
commit9295a00a976df83d2c35a6dc56ceb35c05f692dd (patch)
treece5c72b18357400c0472960605dd12355107f7cc /server-proxy.c
parent3d7ae10a541629727844163f7d64507baedd6c78 (diff)
Fixup server connection timeouts
Diffstat (limited to 'server-proxy.c')
-rw-r--r--server-proxy.c37
1 files changed, 30 insertions, 7 deletions
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);