summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmar Tumballi <amar@gluster.com>2011-02-18 03:34:23 +0000
committerAnand V. Avati <avati@dev.gluster.com>2011-02-22 08:45:43 -0800
commit3af42dac5fbea3af8d65799fd50300838f2e1d33 (patch)
treece2efccdbba727d20096a995ab649ac6eb6905a7
parent28bda239100b9eef9b378dac2052a19d7264a51c (diff)
glusterd/cli: option added to create volume with both transports
to avail the option, enter the volume create command with arguments 'transport tcp,rdma' and while mounting, on the mountpoints which works on rdma, do, mount -t glusterfs <IP>:/<VOLNAME>-rdma <MOUNT-POINT> Signed-off-by: Amar Tumballi <amar@gluster.com> Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 2294 (Currently there is no way through cli to make a volume listen on both the transports (socket/rdma)) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2294
-rw-r--r--cli/src/cli-cmd-parser.c3
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-op-sm.c5
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volgen.c78
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.h1
-rw-r--r--xlators/protocol/server/src/server.c2
5 files changed, 83 insertions, 6 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c
index 6fa1f80bdfe..a90e6a75e45 100644
--- a/cli/src/cli-cmd-parser.c
+++ b/cli/src/cli-cmd-parser.c
@@ -170,6 +170,9 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
trans_type = gf_strdup ("tcp");
} else if ((strcasecmp (words[index+1], "rdma") == 0)) {
trans_type = gf_strdup ("rdma");
+ } else if ((strcasecmp (words[index+1], "tcp,rdma") == 0) ||
+ (strcasecmp (words[index+1], "rdma,tcp") == 0)) {
+ trans_type = gf_strdup ("tcp,rdma");
} else {
gf_log ("", GF_LOG_ERROR, "incorrect transport"
" protocol specified");
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
index 89e6f47c911..501e01cfc4b 100644
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
@@ -2302,9 +2302,12 @@ glusterd_op_create_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
if (strcasecmp (trans_type, "rdma") == 0) {
volinfo->transport_type = GF_TRANSPORT_RDMA;
- } else {
+ } else if (strcasecmp (trans_type, "tcp") == 0) {
volinfo->transport_type = GF_TRANSPORT_TCP;
+ } else {
+ volinfo->transport_type = GF_TRANSPORT_BOTH_TCP_RDMA;
}
+
volinfo->sub_count = sub_count;
if (bricks) {
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c
index 2933b1d8b7a..90b227c0eb6 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c
@@ -907,9 +907,17 @@ build_graph_generic (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
static void
get_vol_transport_type (glusterd_volinfo_t *volinfo, char *tt)
{
- volinfo->transport_type == GF_TRANSPORT_RDMA ?
- strcpy (tt, "rdma"):
- strcpy (tt, "tcp");
+ switch (volinfo->transport_type) {
+ case GF_TRANSPORT_RDMA:
+ strcpy (tt, "rdma");
+ break;
+ case GF_TRANSPORT_TCP:
+ strcpy (tt, "tcp");
+ break;
+ case GF_TRANSPORT_BOTH_TCP_RDMA:
+ strcpy (tt, "tcp,rdma");
+ break;
+ }
}
static int
@@ -1124,6 +1132,7 @@ client_graph_builder (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
{
int dist_count = 0;
char transt[16] = {0,};
+ char *tt = NULL;
char *volname = NULL;
dict_t *dict = NULL;
glusterd_brickinfo_t *brick = NULL;
@@ -1142,7 +1151,6 @@ client_graph_builder (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
volname = volinfo->volname;
dict = volinfo->dict;
GF_ASSERT (dict);
- get_vol_transport_type (volinfo, transt);
if (volinfo->brick_count == 0) {
gf_log ("", GF_LOG_ERROR,
@@ -1161,6 +1169,12 @@ client_graph_builder (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
return -1;
}
+ ret = dict_get_str (set_dict, "client-transport-type", &tt);
+ if (ret)
+ get_vol_transport_type (volinfo, transt);
+ if (!ret)
+ strcpy (transt, tt);
+
i = 0;
list_for_each_entry (brick, &volinfo->bricks, brick_list) {
xl = volgen_graph_add_nolink (graph, "protocol/client",
@@ -1370,6 +1384,16 @@ build_nfs_graph (glusterfs_graph_t *graph, dict_t *mod_dict)
goto out;
}
}
+
+ /* If both RDMA and TCP are the transport_type, use RDMA
+ for NFS client protocols */
+ if (voliter->transport_type == GF_TRANSPORT_BOTH_TCP_RDMA) {
+ ret = dict_set_str (set_dict, "client-transport-type",
+ "rdma");
+ if (ret)
+ goto out;
+ }
+
memset (&cgraph, 0, sizeof (cgraph));
ret = build_client_graph (&cgraph, voliter, set_dict);
if (ret)
@@ -1528,21 +1552,65 @@ get_client_filepath (char *filename, glusterd_volinfo_t *volinfo)
path, volinfo->volname);
}
+static void
+get_rdma_client_filepath (char *filename, glusterd_volinfo_t *volinfo)
+{
+ char path[PATH_MAX] = {0,};
+ glusterd_conf_t *priv = NULL;
+
+ priv = THIS->private;
+
+ GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv);
+
+ snprintf (filename, PATH_MAX, "%s/%s-rdma-fuse.vol",
+ path, volinfo->volname);
+}
+
static int
generate_client_volfile (glusterd_volinfo_t *volinfo)
{
glusterfs_graph_t graph = {{0,},};
char filename[PATH_MAX] = {0,};
int ret = -1;
+ dict_t *dict = NULL;
get_client_filepath (filename, volinfo);
- ret = build_client_graph (&graph, volinfo, NULL);
+ if (volinfo->transport_type == GF_TRANSPORT_BOTH_TCP_RDMA) {
+ dict = dict_new ();
+ if (!dict)
+ goto out;
+ ret = dict_set_str (dict, "client-transport-type", "tcp");
+ if (ret)
+ goto out;
+ }
+
+ ret = build_client_graph (&graph, volinfo, dict);
if (!ret)
ret = volgen_write_volfile (&graph, filename);
volgen_graph_free (&graph);
+ if (dict) {
+ /* This means, transport type is both RDMA and TCP */
+
+ memset (&graph, 0, sizeof (graph));
+ get_rdma_client_filepath (filename, volinfo);
+
+ ret = dict_set_str (dict, "client-transport-type", "rdma");
+ if (ret)
+ goto out;
+
+ ret = build_client_graph (&graph, volinfo, dict);
+ if (!ret)
+ ret = volgen_write_volfile (&graph, filename);
+
+ volgen_graph_free (&graph);
+
+ dict_unref (dict);
+ }
+
+out:
return ret;
}
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
index 43a14f297d6..aca7b7dc705 100644
--- a/xlators/mgmt/glusterd/src/glusterd.h
+++ b/xlators/mgmt/glusterd/src/glusterd.h
@@ -155,6 +155,7 @@ typedef struct glusterd_defrag_info_ glusterd_defrag_info_t;
typedef enum gf_transport_type_ {
GF_TRANSPORT_TCP, //DEFAULT
GF_TRANSPORT_RDMA,
+ GF_TRANSPORT_BOTH_TCP_RDMA,
} gf_transport_type;
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
index 7c92441ea89..87e78880fa8 100644
--- a/xlators/protocol/server/src/server.c
+++ b/xlators/protocol/server/src/server.c
@@ -829,6 +829,8 @@ struct volume_options options[] = {
.value = {"rpc", "rpc-over-rdma", "tcp", "socket", "ib-verbs",
"unix", "ib-sdp", "tcp/server", "ib-verbs/server", "rdma",
"rdma*([ \t]),*([ \t])socket",
+ "rdma*([ \t]),*([ \t])tcp",
+ "tcp*([ \t]),*([ \t])rdma",
"socket*([ \t]),*([ \t])rdma"},
.type = GF_OPTION_TYPE_STR
},