From 6826e046157a6ea1a07ba2a38a1825b05eb0b666 Mon Sep 17 00:00:00 2001 From: Csaba Henk Date: Mon, 27 Feb 2012 05:41:17 +0100 Subject: glusterd/mountbroker: enhance mountbroker-geo-replication.* option to take multiple volumes Comma can be used in the value of a "mountbroker-geo-replication.*" option with semantics as of these examples: option mountbroker-geo-replication.foolabel vol1,vol2,vol3:geouser and option mountbroker-geo-replication.geouser vol1,vol2,vol3 will allow geouser to mount any of the volumes vol{1,2,3} with params of a geo-rep aux mount under label foolabel, resp. geouser Also fix memleak in parsing of this option. Change-Id: I5311388812f503a078a52a14f2679f5ddb33b248 BUG: 765214 Signed-off-by: Csaba Henk Reviewed-on: http://review.gluster.com/2818 Tested-by: Gluster Build System Reviewed-by: Amar Tumballi Reviewed-by: Venky Shankar --- xlators/mgmt/glusterd/src/glusterd-mem-types.h | 7 +-- xlators/mgmt/glusterd/src/glusterd-mountbroker.c | 65 +++++++++++++++++++++--- 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/xlators/mgmt/glusterd/src/glusterd-mem-types.h b/xlators/mgmt/glusterd/src/glusterd-mem-types.h index 3bb446d1a..0ef904c7c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-mem-types.h +++ b/xlators/mgmt/glusterd/src/glusterd-mem-types.h @@ -70,9 +70,10 @@ typedef enum gf_gld_mem_types_ { gf_gld_mt_mount_comp_container = gf_common_mt_end + 44, gf_gld_mt_mount_component = gf_common_mt_end + 45, gf_gld_mt_mount_spec = gf_common_mt_end + 46, - gf_gld_mt_nodesrv_t = gf_common_mt_end + 47, - gf_gld_mt_charptr = gf_common_mt_end + 48, - gf_gld_mt_end = gf_common_mt_end + 49, + gf_gld_mt_georep_meet_spec = gf_common_mt_end + 47, + gf_gld_mt_nodesrv_t = gf_common_mt_end + 48, + gf_gld_mt_charptr = gf_common_mt_end + 49, + gf_gld_mt_end = gf_common_mt_end + 50, } gf_gld_mem_types_t; #endif diff --git a/xlators/mgmt/glusterd/src/glusterd-mountbroker.c b/xlators/mgmt/glusterd/src/glusterd-mountbroker.c index 4bd062c14..14cbb3d5d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-mountbroker.c +++ b/xlators/mgmt/glusterd/src/glusterd-mountbroker.c @@ -244,12 +244,15 @@ const char *georep_mnt_desc_template = "xlator-option=\\*-dht.assert-no-child-down=true " "volfile-server=localhost " "client-pid=%d " - "volfile-id=%s " "user-map-root=%s " ")" "SUB+(" "log-file="DEFAULT_LOG_FILE_DIRECTORY"/"GEOREP"*/* " "log-level=* " + "volfile-id=* " + ")" + "MEET(" + "%s" ")"; const char *hadoop_mnt_desc_template = @@ -265,18 +268,68 @@ const char *hadoop_mnt_desc_template = ")"; int -make_georep_mountspec (gf_mount_spec_t *mspec, const char *volname, +make_georep_mountspec (gf_mount_spec_t *mspec, const char *volnames, char *user) { char *georep_mnt_desc = NULL; + char *meetspec = NULL; + char *vols = NULL; + char *vol = NULL; + char *p = NULL; + char *fa[3] = {0,}; + size_t siz = 0; + int vc = 0; + int i = 0; int ret = 0; + vols = gf_strdup ((char *)volnames); + if (!vols) + goto out; + + for (vc = 1, p = vols; *p; p++) { + if (*p == ',') + vc++; + } + siz = strlen (volnames) + vc * strlen("volfile-id="); + meetspec = GF_CALLOC (1, siz + 1, gf_gld_mt_georep_meet_spec); + if (!meetspec) + goto out; + + for (p = vols;;) { + vol = strtok (p, ","); + if (!vol) { + GF_ASSERT (vc == 0); + break; + } + p = NULL; + strcat (meetspec, "volfile-id="); + strcat (meetspec, vol); + if (--vc > 0) + strcat (meetspec, " "); + } + ret = gf_asprintf (&georep_mnt_desc, georep_mnt_desc_template, - GF_CLIENT_PID_GSYNCD, volname, user); - if (ret == -1) - return ret; + GF_CLIENT_PID_GSYNCD, user, meetspec); + if (ret == -1) { + georep_mnt_desc = NULL; + goto out; + } + + ret = parse_mount_pattern_desc (mspec, georep_mnt_desc); + + out: + fa[0] = meetspec; + fa[1] = vols; + fa[2] = georep_mnt_desc; + + for (i = 0; i < 3; i++) { + if (fa[i]) + GF_FREE (fa[i]); + else + ret = -1; + } - return parse_mount_pattern_desc (mspec, georep_mnt_desc); + return ret; } int -- cgit