summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/glusterd.vol2
-rw-r--r--rpc/rpc-transport/socket/src/socket.c21
-rw-r--r--rpc/rpc-transport/socket/src/socket.h1
3 files changed, 19 insertions, 5 deletions
diff --git a/doc/glusterd.vol b/doc/glusterd.vol
index 48cad9579a2..b96cbe8eaaf 100644
--- a/doc/glusterd.vol
+++ b/doc/glusterd.vol
@@ -4,6 +4,8 @@ volume management
option transport-type socket,rdma
option transport.socket.listen-port 6969
option transport.rdma.listen-port 6968
+ option transport.socket.keepalive-time 10
+ option transport.socket.keepalive-interval 2
# option listen-port 6969
end-volume
diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c
index c5246822a7c..341c8e94a39 100644
--- a/rpc/rpc-transport/socket/src/socket.c
+++ b/rpc/rpc-transport/socket/src/socket.c
@@ -363,7 +363,7 @@ __socket_nodelay (int fd)
static int
-__socket_keepalive (int fd, int keepalive_intvl)
+__socket_keepalive (int fd, int keepalive_intvl, int keepalive_idle)
{
int on = 1;
int ret = -1;
@@ -381,7 +381,7 @@ __socket_keepalive (int fd, int keepalive_intvl)
if (ret == -1)
goto err;
#else
- ret = setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepalive_intvl,
+ ret = setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepalive_idle,
sizeof (keepalive_intvl));
if (ret == -1)
goto err;
@@ -394,7 +394,7 @@ __socket_keepalive (int fd, int keepalive_intvl)
done:
gf_log ("", GF_LOG_TRACE, "Keep-alive enabled for socket %d, interval "
- "%d", fd, keepalive_intvl);
+ "%d, idle: %d", fd, keepalive_intvl, keepalive_idle);
err:
return ret;
@@ -1802,7 +1802,8 @@ socket_server_event_handler (int fd, int idx, void *data,
if (priv->keepalive) {
ret = __socket_keepalive (new_sock,
- priv->keepaliveintvl);
+ priv->keepaliveintvl,
+ priv->keepaliveidle);
if (ret == -1)
gf_log (this->name, GF_LOG_ERROR,
"Failed to set keep-alive: %s",
@@ -2010,7 +2011,8 @@ socket_connect (rpc_transport_t *this, int port)
if (priv->keepalive) {
ret = __socket_keepalive (priv->sock,
- priv->keepaliveintvl);
+ priv->keepaliveintvl,
+ priv->keepaliveidle);
if (ret == -1)
gf_log (this->name, GF_LOG_ERROR,
"Failed to set keep-alive: %s",
@@ -2600,6 +2602,12 @@ socket_init (rpc_transport_t *this)
priv->keepaliveintvl = keepalive;
}
+ if (dict_get_uint32 (this->options,
+ "transport.socket.keepalive-time",
+ &keepalive) == 0) {
+ priv->keepaliveidle = keepalive;
+ }
+
priv->windowsize = (int)windowsize;
out:
this->private = priv;
@@ -2699,5 +2707,8 @@ struct volume_options options[] = {
{ .key = {"transport.socket.keepalive-interval"},
.type = GF_OPTION_TYPE_INT
},
+ { .key = {"transport.socket.keepalive-time"},
+ .type = GF_OPTION_TYPE_INT
+ },
{ .key = {NULL} }
};
diff --git a/rpc/rpc-transport/socket/src/socket.h b/rpc/rpc-transport/socket/src/socket.h
index f7471ffb85c..f54b64c2ad2 100644
--- a/rpc/rpc-transport/socket/src/socket.h
+++ b/rpc/rpc-transport/socket/src/socket.h
@@ -189,6 +189,7 @@ typedef struct {
char lowlat;
char nodelay;
int keepalive;
+ int keepaliveidle;
int keepaliveintvl;
} socket_private_t;