diff options
Diffstat (limited to 'rpc/rpc-transport/socket/src/socket.c')
| -rw-r--r-- | rpc/rpc-transport/socket/src/socket.c | 135 | 
1 files changed, 93 insertions, 42 deletions
diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c index d062cbbc4fb..e6e73bf8f22 100644 --- a/rpc/rpc-transport/socket/src/socket.c +++ b/rpc/rpc-transport/socket/src/socket.c @@ -838,8 +838,8 @@ __socket_nodelay (int fd)  static int -__socket_keepalive (int fd, int family, int keepalive_intvl, -                    int keepalive_idle, int timeout) +__socket_keepalive (int fd, int family, int keepaliveintvl, +                    int keepaliveidle, int keepalivecnt, int timeout)  {          int     on = 1;          int     ret = -1; @@ -852,16 +852,16 @@ __socket_keepalive (int fd, int family, int keepalive_intvl,                  goto err;          } -        if (keepalive_intvl == GF_USE_DEFAULT_KEEPALIVE) +        if (keepaliveintvl == GF_USE_DEFAULT_KEEPALIVE)                  goto done;  #if !defined(GF_LINUX_HOST_OS) && !defined(__NetBSD__)  #if defined(GF_SOLARIS_HOST_OS) || defined(__FreeBSD__) -        ret = setsockopt (fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive_intvl, -                          sizeof (keepalive_intvl)); +        ret = setsockopt (fd, SOL_SOCKET, SO_KEEPALIVE, &keepaliveintvl, +                          sizeof (keepaliveintvl));  #else -        ret = setsockopt (fd, IPPROTO_TCP, TCP_KEEPALIVE, &keepalive_intvl, -                          sizeof (keepalive_intvl)); +        ret = setsockopt (fd, IPPROTO_TCP, TCP_KEEPALIVE, &keepaliveintvl, +                          sizeof (keepaliveintvl));  #endif          if (ret == -1) {                  gf_log ("socket", GF_LOG_WARNING, @@ -872,20 +872,20 @@ __socket_keepalive (int fd, int family, int keepalive_intvl,          if (family != AF_INET && family != AF_INET6)                  goto done; -        ret = setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepalive_idle, -                          sizeof (keepalive_idle)); +        ret = setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepaliveidle, +                          sizeof (keepaliveidle));          if (ret == -1) {                  gf_log ("socket", GF_LOG_WARNING,                          "failed to set keep idle %d on socket %d, %s", -                        keepalive_idle, fd, strerror(errno)); +                        keepaliveidle, fd, strerror(errno));                  goto err;          } -        ret = setsockopt (fd, IPPROTO_TCP , TCP_KEEPINTVL, &keepalive_intvl, -                          sizeof (keepalive_intvl)); +        ret = setsockopt (fd, IPPROTO_TCP , TCP_KEEPINTVL, &keepaliveintvl, +                          sizeof (keepaliveintvl));          if (ret == -1) {                  gf_log ("socket", GF_LOG_WARNING,                          "failed to set keep interval %d on socket %d, %s", -                        keepalive_intvl, fd, strerror(errno)); +                        keepaliveintvl, fd, strerror(errno));                  goto err;          } @@ -901,12 +901,23 @@ __socket_keepalive (int fd, int family, int keepalive_intvl,                  goto err;          }  #endif +#if defined(TCP_KEEPCNT) +        ret = setsockopt (fd, IPPROTO_TCP, TCP_KEEPCNT, &keepalivecnt, +                          sizeof (keepalivecnt)); +        if (ret == -1) { +                gf_log ("socket", GF_LOG_WARNING, "failed to set " +                        "TCP_KEEPCNT %d on socket %d, %s", keepalivecnt, fd, +                        strerror(errno)); +                goto err; +        } +#endif  #endif  done: -        gf_log (THIS->name, GF_LOG_TRACE, "Keep-alive enabled for socket %d, " -                "interval %d, idle: %d, timeout: %d", fd, keepalive_intvl, -                keepalive_idle, timeout); +        gf_log (THIS->name, GF_LOG_TRACE, "Keep-alive enabled for socket: %d, " +                "(idle: %d, interval: %d, max-probes: %d, timeout: %d)", +                fd, keepaliveidle, keepaliveintvl, keepalivecnt, +                timeout);  err:          return ret; @@ -2700,6 +2711,7 @@ socket_server_event_handler (int fd, int idx, void *data,                                                            new_sockaddr.ss_family,                                                            priv->keepaliveintvl,                                                            priv->keepaliveidle, +                                                          priv->keepalivecnt,                                                            priv->timeout);                                  if (ret == -1)                                          gf_log (this->name, GF_LOG_WARNING, @@ -3104,6 +3116,7 @@ socket_connect (rpc_transport_t *this, int port)                                                    sa_family,                                                    priv->keepaliveintvl,                                                    priv->keepaliveidle, +                                                  priv->keepalivecnt,                                                    priv->timeout);                          if (ret == -1)                                  gf_log (this->name, GF_LOG_ERROR, @@ -3745,6 +3758,9 @@ reconfigure (rpc_transport_t *this, dict_t *options)          int               ret           = 0;          uint64_t          windowsize    = 0;          uint32_t          timeout       = 0; +        int               keepaliveidle  = GF_KEEPALIVE_TIME; +        int               keepaliveintvl = GF_KEEPALIVE_INTERVAL; +        int               keepalivecnt   = GF_KEEPALIVE_COUNT;          GF_VALIDATE_OR_GOTO ("socket", this, out);          GF_VALIDATE_OR_GOTO ("socket", this->private, out); @@ -3773,12 +3789,30 @@ reconfigure (rpc_transport_t *this, dict_t *options)          else                  priv->keepalive = 1; -        if (dict_get_uint32 (this->options, "transport.tcp-user-timeout", -                             &timeout) == 0) { +        if (dict_get_int32 (this->options, "transport.tcp-user-timeout", +                            &(priv->timeout)) != 0)                  priv->timeout = timeout; -                gf_log (this->name, GF_LOG_DEBUG, "Reconfigued " -                        "transport.tcp-user-timeout=%d", timeout); -        } +        gf_log (this->name, GF_LOG_DEBUG, "Reconfigued " +                "transport.tcp-user-timeout=%d", priv->timeout); + +        if (dict_get_int32 (this->options, "transport.socket.keepalive-time", +                            &(priv->keepaliveidle)) != 0) +                priv->keepaliveidle = keepaliveidle; +        gf_log (this->name, GF_LOG_DEBUG, "Reconfigued " +                "transport.socket.keepalive-time=%d", priv->keepaliveidle); + +        if (dict_get_int32 (this->options, +                            "transport.socket.keepalive-interval", +                            &(priv->keepaliveintvl)) != 0) +                priv->keepaliveintvl = keepaliveintvl; +        gf_log (this->name, GF_LOG_DEBUG, "Reconfigued " +                "transport.socket.keepalive-interval=%d", priv->keepaliveintvl); + +        if (dict_get_int32 (this->options, "transport.socket.keepalive-count", +                            &(priv->keepalivecnt)) != 0) +                priv->keepalivecnt = keepalivecnt; +        gf_log (this->name, GF_LOG_DEBUG, "Reconfigued " +                "transport.socket.keepalive-count=%d", priv->keepalivecnt);          optstr = NULL;          if (dict_get_str (this->options, "tcp-window-size", @@ -3921,8 +3955,10 @@ socket_init (rpc_transport_t *this)          gf_boolean_t      tmp_bool = 0;          uint64_t          windowsize = GF_DEFAULT_SOCKET_WINDOW_SIZE;          char             *optstr = NULL; -        uint32_t          keepalive = 0;          uint32_t          timeout = 0; +        int               keepaliveidle  = GF_KEEPALIVE_TIME; +        int               keepaliveintvl = GF_KEEPALIVE_INTERVAL; +        int               keepalivecnt   = GF_KEEPALIVE_COUNT;          uint32_t          backlog = 0;  	int               session_id = 0;          int32_t           cert_depth = DEFAULT_VERIFY_DEPTH; @@ -4014,8 +4050,9 @@ socket_init (rpc_transport_t *this)          optstr = NULL;          /* Enable Keep-alive by default. */          priv->keepalive = 1; -        priv->keepaliveintvl = 2; -        priv->keepaliveidle = 20; +        priv->keepaliveintvl = GF_KEEPALIVE_INTERVAL; +        priv->keepaliveidle = GF_KEEPALIVE_TIME; +        priv->keepalivecnt = GF_KEEPALIVE_COUNT;          if (dict_get_str (this->options, "transport.socket.keepalive",                            &optstr) == 0) {                  if (gf_string2boolean (optstr, &tmp_bool) == -1) { @@ -4029,24 +4066,29 @@ socket_init (rpc_transport_t *this)                          priv->keepalive = 0;          } -        if (dict_get_uint32 (this->options, -                             "transport.socket.keepalive-interval", -                             &keepalive) == 0) { -                priv->keepaliveintvl = keepalive; -        } +        if (dict_get_int32 (this->options, "transport.tcp-user-timeout", +                            &(priv->timeout)) != 0) +                priv->timeout = timeout; +        gf_log (this->name, GF_LOG_DEBUG, "Configued " +                "transport.tcp-user-timeout=%d", priv->timeout); -        if (dict_get_uint32 (this->options, -                             "transport.socket.keepalive-time", -                             &keepalive) == 0) { -                priv->keepaliveidle = keepalive; +        if (dict_get_int32 (this->options, +                            "transport.socket.keepalive-time", +                            &(priv->keepaliveidle)) != 0) { +                priv->keepaliveidle = keepaliveidle;          } -        if (dict_get_uint32 (this->options, "transport.tcp-user-timeout", -                             &timeout) == 0) { -                priv->timeout = timeout; +        if (dict_get_int32 (this->options, +                            "transport.socket.keepalive-interval", +                            &(priv->keepaliveintvl)) != 0) { +                priv->keepaliveintvl = keepaliveintvl;          } -        gf_log (this->name, GF_LOG_DEBUG, "Configued " -                "transport.tcp-user-timeout=%d", priv->timeout); + +        if (dict_get_int32 (this->options, "transport.socket.keepalive-count", +                            &(priv->keepalivecnt)) != 0) +                priv->keepalivecnt = keepalivecnt; +        gf_log (this->name, GF_LOG_DEBUG, "Reconfigued " +                "transport.keepalivecnt=%d", keepalivecnt);          if (dict_get_uint32 (this->options,                               "transport.socket.listen-backlog", @@ -4446,21 +4488,30 @@ struct volume_options options[] = {          },          { .key   = {"transport.tcp-user-timeout"},            .type  = GF_OPTION_TYPE_INT, +          .default_value = "0"          },          { .key   = {"transport.socket.nodelay"}, -          .type  = GF_OPTION_TYPE_BOOL +          .type  = GF_OPTION_TYPE_BOOL, +          .default_value = "1"          },          { .key   = {"transport.socket.lowlat"},            .type  = GF_OPTION_TYPE_BOOL          },          { .key   = {"transport.socket.keepalive"}, -          .type  = GF_OPTION_TYPE_BOOL +          .type  = GF_OPTION_TYPE_BOOL, +          .default_value = "1"          },          { .key   = {"transport.socket.keepalive-interval"}, -          .type  = GF_OPTION_TYPE_INT +          .type  = GF_OPTION_TYPE_INT, +          .default_value = "2"          },          { .key   = {"transport.socket.keepalive-time"}, -          .type  = GF_OPTION_TYPE_INT +          .type  = GF_OPTION_TYPE_INT, +          .default_value = "20" +        }, +        { .key   = {"transport.socket.keepalive-count"}, +          .type  = GF_OPTION_TYPE_INT, +          .default_value = "9"          },          { .key   = {"transport.socket.listen-backlog"},            .type  = GF_OPTION_TYPE_INT  | 
