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 <csaba@redhat.com>
Reviewed-on: http://review.gluster.com/2818
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Reviewed-by: Venky Shankar <vshankar@redhat.com>
This commit is contained in:
Csaba Henk 2012-02-27 05:41:17 +01:00 committed by Vijay Bellur
parent 48adf93423
commit 6826e04615
2 changed files with 64 additions and 10 deletions

View File

@ -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

View File

@ -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;
ret = gf_asprintf (&georep_mnt_desc, georep_mnt_desc_template,
GF_CLIENT_PID_GSYNCD, volname, user);
if (ret == -1)
return ret;
vols = gf_strdup ((char *)volnames);
if (!vols)
goto out;
return parse_mount_pattern_desc (mspec, georep_mnt_desc);
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, 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 ret;
}
int