diff options
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-mem-types.h | 7 | ||||
-rw-r--r-- | 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 3bb446d1a90..0ef904c7c14 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 4bd062c143f..14cbb3d5de0 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 |