diff options
author | Amar Tumballi <amar@gluster.com> | 2011-02-18 03:34:23 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2011-02-22 08:45:43 -0800 |
commit | 3af42dac5fbea3af8d65799fd50300838f2e1d33 (patch) | |
tree | ce2efccdbba727d20096a995ab649ac6eb6905a7 /xlators/mgmt/glusterd/src/glusterd-volgen.c | |
parent | 28bda239100b9eef9b378dac2052a19d7264a51c (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
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-volgen.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 78 |
1 files changed, 73 insertions, 5 deletions
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; } |