Blob Blame History Raw
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Frediano Ziglio <fziglio@redhat.com>
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 <fziglio@redhat.com>
---
 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);