summaryrefslogtreecommitdiffstats
path: root/transport/socket
diff options
context:
space:
mode:
authorVijay Bellur <vijay@gluster.com>2009-06-24 12:54:51 +0000
committerAnand V. Avati <avati@dev.gluster.com>2009-06-24 17:13:36 -0700
commit7a797746b9276493a0891da63124092ddc98f01b (patch)
treef5c437e61bad10e5355653f80629beb2e625dd64 /transport/socket
parent992130efe4d74dd0b69b8e899c620e5dd4786856 (diff)
Added a new option transport.socket.nodelay.
Release 2.0 compatible patch for optionally setting NODELAY. Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
Diffstat (limited to 'transport/socket')
-rw-r--r--transport/socket/src/socket.c50
-rw-r--r--transport/socket/src/socket.h1
2 files changed, 51 insertions, 0 deletions
diff --git a/transport/socket/src/socket.c b/transport/socket/src/socket.c
index 65c17763d13..cae6fb1d870 100644
--- a/transport/socket/src/socket.c
+++ b/transport/socket/src/socket.c
@@ -34,6 +34,7 @@
#include "compat-errno.h"
#include <fcntl.h>
+#include <netinet/tcp.h>
#include <errno.h>
@@ -945,6 +946,7 @@ socket_connect (transport_t *this)
struct sockaddr_storage sockaddr = {0, };
socklen_t sockaddr_len = 0;
glusterfs_ctx_t *ctx = NULL;
+ int on = 1;
priv = this->private;
ctx = this->xl->ctx;
@@ -1017,6 +1019,18 @@ socket_connect (transport_t *this)
strerror (errno));
}
+
+ if (priv->nodelay) {
+ ret = setsockopt(priv->sock, IPPROTO_TCP,
+ TCP_NODELAY, &on, sizeof(on));
+ if (ret == -1) {
+ gf_log (this->xl->name, GF_LOG_ERROR,
+ "setsockopt() failed for NODELAY (%s)",
+ strerror (errno));
+ }
+ }
+
+
if (!priv->bio) {
ret = __socket_nonblock (priv->sock);
@@ -1082,6 +1096,7 @@ socket_listen (transport_t *this)
socklen_t sockaddr_len;
peer_info_t *myinfo = NULL;
glusterfs_ctx_t *ctx = NULL;
+ int on = 1;
priv = this->private;
myinfo = &this->myinfo;
@@ -1148,6 +1163,18 @@ socket_listen (transport_t *this)
strerror (errno));
}
+
+ if (priv->nodelay) {
+ ret = setsockopt(priv->sock, IPPROTO_TCP,
+ TCP_NODELAY, &on, sizeof(on));
+
+ if (ret == -1) {
+ gf_log (this->xl->name, GF_LOG_ERROR,
+ "setsockopt() failed for NODELAY (%s)",
+ strerror (errno));
+ }
+ }
+
if (!priv->bio) {
ret = __socket_nonblock (priv->sock);
@@ -1321,6 +1348,7 @@ socket_init (transport_t *this)
socket_private_t *priv = NULL;
gf_boolean_t tmp_bool = 0;
char *nb_connect = NULL;
+ char *optstr = NULL;
uint64_t windowsize = GF_DEFAULT_SOCKET_WINDOW_SIZE;
char *wsizestr = NULL;
@@ -1364,6 +1392,25 @@ socket_init (transport_t *this)
}
}
+ if (dict_get (this->xl->options, "transport.socket.nodelay")) {
+ optstr = data_to_str (dict_get (this->xl->options,
+ "transport.socket.nodelay"));
+
+ if (gf_string2boolean (optstr, &tmp_bool) == -1) {
+ gf_log (this->xl->name, GF_LOG_ERROR,
+ "'transport.socket.nodelay' takes only "
+ "boolean options, not taking any action");
+ tmp_bool = 0;
+ }
+ // By default we do not enable NODELAY
+ priv->nodelay = 0;
+ if (tmp_bool) {
+ priv->nodelay = 1;
+ gf_log (this->xl->name, GF_LOG_DEBUG,
+ "enabling nodelay");
+ }
+ }
+
if (dict_get_str (this->xl->options, "window-size", &wsizestr) == 0) {
if (gf_string2bytesize (wsizestr, &windowsize) != 0) {
gf_log (this->xl->name, GF_LOG_ERROR,
@@ -1437,6 +1484,9 @@ struct volume_options options[] = {
.min = GF_MIN_SOCKET_WINDOW_SIZE,
.max = GF_MAX_SOCKET_WINDOW_SIZE,
},
+ { .key = {"transport.socket.nodelay"},
+ .type = GF_OPTION_TYPE_BOOL
+ },
{ .key = {NULL} }
};
diff --git a/transport/socket/src/socket.h b/transport/socket/src/socket.h
index 50d7d0303bb..27640ea839a 100644
--- a/transport/socket/src/socket.h
+++ b/transport/socket/src/socket.h
@@ -94,6 +94,7 @@ typedef struct {
char bio;
char connect_finish_log;
char submit_log;
+ char nodelay;
union {
struct list_head ioq;
struct {