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:
parent
48adf93423
commit
6826e04615
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user