From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Thu, 14 Nov 2019 15:18:29 +0000 Subject: [PATCH 2/2] red-channel-client: Always enable latency monitor to keep tcp connection alive Create some traffic on the connection to avoid potential timeout on some proxies implementation which require some TCP data traffic. The timeout used by default is quite big (5 minutes) to reduce network traffic. In case connectivity monitoring is enabled or latency monitor is requested the timeout is reduced to the old default. Signed-off-by: Frediano Ziglio --- server/red-channel-client.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/server/red-channel-client.c b/server/red-channel-client.c index 3cc6a70..7be382e 100644 --- a/server/red-channel-client.c +++ b/server/red-channel-client.c @@ -210,6 +210,7 @@ enum { }; #define PING_TEST_TIMEOUT_MS (MSEC_PER_SEC * 15) +#define PING_TEST_LONG_TIMEOUT_MS (MSEC_PER_SEC * 60 * 5) #define PING_TEST_IDLE_NET_TIMEOUT_MS (MSEC_PER_SEC / 10) typedef struct RedEmptyMsgPipeItem { @@ -808,11 +809,13 @@ void red_channel_client_start_connectivity_monitoring(RedChannelClient *rcc, uin if (rcc->priv->latency_monitor.timer == NULL) { rcc->priv->latency_monitor.timer = core->timer_add( core, red_channel_client_ping_timer, rcc); - if (!red_client_during_migrate_at_target(rcc->priv->client)) { - red_channel_client_start_ping_timer(rcc, PING_TEST_IDLE_NET_TIMEOUT_MS); - } rcc->priv->latency_monitor.roundtrip = -1; - rcc->priv->latency_monitor.timeout = PING_TEST_TIMEOUT_MS; + } else { + red_channel_client_cancel_ping_timer(rcc); + } + rcc->priv->latency_monitor.timeout = PING_TEST_TIMEOUT_MS; + if (!red_client_during_migrate_at_target(rcc->priv->client)) { + red_channel_client_start_ping_timer(rcc, PING_TEST_IDLE_NET_TIMEOUT_MS); } if (rcc->priv->connectivity_monitor.timer == NULL) { rcc->priv->connectivity_monitor.state = CONNECTIVITY_STATE_CONNECTED; @@ -948,8 +951,7 @@ static gboolean red_channel_client_initable_init(GInitable *initable, red_channel_client_event, self); - if (self->priv->monitor_latency - && reds_stream_get_family(self->priv->stream) != AF_UNIX) { + if (reds_stream_get_family(self->priv->stream) != AF_UNIX) { self->priv->latency_monitor.timer = core->timer_add(core, red_channel_client_ping_timer, self); @@ -958,7 +960,8 @@ static gboolean red_channel_client_initable_init(GInitable *initable, PING_TEST_IDLE_NET_TIMEOUT_MS); } self->priv->latency_monitor.roundtrip = -1; - self->priv->latency_monitor.timeout = PING_TEST_TIMEOUT_MS; + self->priv->latency_monitor.timeout = + self->priv->monitor_latency ? PING_TEST_TIMEOUT_MS : PING_TEST_LONG_TIMEOUT_MS; } red_channel_add_client(self->priv->channel, self);