summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-volgen.c
diff options
context:
space:
mode:
authorCsaba Henk <csaba@gluster.com>2011-04-16 16:04:27 +0000
committerAnand Avati <avati@gluster.com>2011-04-17 07:39:11 -0700
commit856a7ee345713b66ccb6eba6fca276273807fe30 (patch)
tree93dcfd47b028670571ea69e1edddbb4a0cea0312 /xlators/mgmt/glusterd/src/glusterd-volgen.c
parent4ade518a232418ccccc6a7bc3c381022465b6c84 (diff)
glusterd/volgen: make it possible for builders to set the op_errstr during graph validation
Signed-off-by: Csaba Henk <csaba@gluster.com> Signed-off-by: Anand Avati <avati@gluster.com> BUG: 2559 (provide two options in CLI for gluster volume gsync indexing <volname> <enable|disable>) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2559
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-volgen.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volgen.c119
1 files changed, 69 insertions, 50 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c
index d5c5d5bdb9e..f7f3ddd11a5 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c
@@ -194,7 +194,20 @@ static struct volopt_map_entry glusterd_volopt_map[] = {
*********************************************/
+struct volgen_graph {
+ char **errstr;
+ glusterfs_graph_t graph;
+};
+typedef struct volgen_graph volgen_graph_t;
+
+static void
+set_graph_errstr (volgen_graph_t *graph, const char *str)
+{
+ if (!graph->errstr)
+ return;
+ *graph->errstr = gf_strdup (str);
+}
static xlator_t *
xlator_instantiate_va (const char *type, const char *format, va_list arg)
@@ -266,13 +279,13 @@ volgen_xlator_link (xlator_t *pxl, xlator_t *cxl)
}
static int
-volgen_graph_link (glusterfs_graph_t *graph, xlator_t *xl)
+volgen_graph_link (volgen_graph_t *graph, xlator_t *xl)
{
int ret = 0;
/* no need to care about graph->top here */
- if (graph->first)
- ret = volgen_xlator_link (xl, graph->first);
+ if (graph->graph.first)
+ ret = volgen_xlator_link (xl, graph->graph.first);
if (ret == -1) {
gf_log ("", GF_LOG_ERROR, "failed to add graph entry %s",
xl->name);
@@ -284,7 +297,7 @@ volgen_graph_link (glusterfs_graph_t *graph, xlator_t *xl)
}
static xlator_t *
-volgen_graph_add_as (glusterfs_graph_t *graph, const char *type,
+volgen_graph_add_as (volgen_graph_t *graph, const char *type,
const char *format, ...)
{
va_list arg;
@@ -302,13 +315,13 @@ volgen_graph_add_as (glusterfs_graph_t *graph, const char *type,
return NULL;
} else
- glusterfs_graph_set_first (graph, xl);
+ glusterfs_graph_set_first (&graph->graph, xl);
return xl;
}
static xlator_t *
-volgen_graph_add_nolink (glusterfs_graph_t *graph, const char *type,
+volgen_graph_add_nolink (volgen_graph_t *graph, const char *type,
const char *format, ...)
{
va_list arg;
@@ -321,13 +334,13 @@ volgen_graph_add_nolink (glusterfs_graph_t *graph, const char *type,
if (!xl)
return NULL;
- glusterfs_graph_set_first (graph, xl);
+ glusterfs_graph_set_first (&graph->graph, xl);
return xl;
}
static xlator_t *
-volgen_graph_add (glusterfs_graph_t *graph, char *type, char *volname)
+volgen_graph_add (volgen_graph_t *graph, char *type, char *volname)
{
char *shorttype = NULL;
@@ -360,9 +373,9 @@ xlator_set_option (xlator_t *xl, char *key, char *value)
}
static inline xlator_t *
-first_of (glusterfs_graph_t *graph)
+first_of (volgen_graph_t *graph)
{
- return (xlator_t *)graph->first;
+ return (xlator_t *)graph->graph.first;
}
@@ -562,12 +575,12 @@ volopt_trie (char *key, char **hint)
**************************/
-typedef int (*volgen_opthandler_t) (glusterfs_graph_t *graph,
+typedef int (*volgen_opthandler_t) (volgen_graph_t *graph,
struct volopt_map_entry *vme,
void *param);
struct opthandler_data {
- glusterfs_graph_t *graph;
+ volgen_graph_t *graph;
volgen_opthandler_t handler;
struct volopt_map_entry *vme;
gf_boolean_t found;
@@ -613,7 +626,7 @@ process_option (dict_t *dict, char *key, data_t *value, void *param)
}
static int
-volgen_graph_set_options_generic (glusterfs_graph_t *graph, dict_t *dict,
+volgen_graph_set_options_generic (volgen_graph_t *graph, dict_t *dict,
void *param, volgen_opthandler_t handler)
{
struct volopt_map_entry *vme = NULL;
@@ -662,7 +675,7 @@ volgen_graph_set_options_generic (glusterfs_graph_t *graph, dict_t *dict,
}
static int
-basic_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry *vme,
+basic_option_handler (volgen_graph_t *graph, struct volopt_map_entry *vme,
void *param)
{
xlator_t *trav;
@@ -684,14 +697,14 @@ basic_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry *vme,
}
static int
-volgen_graph_set_options (glusterfs_graph_t *graph, dict_t *dict)
+volgen_graph_set_options (volgen_graph_t *graph, dict_t *dict)
{
return volgen_graph_set_options_generic (graph, dict, NULL,
&basic_option_handler);
}
static int
-optget_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry *vme,
+optget_option_handler (volgen_graph_t *graph, struct volopt_map_entry *vme,
void *param)
{
struct volopt_map_entry *vme2 = param;
@@ -999,26 +1012,26 @@ glusterd_check_option_exists (char *key, char **completion)
}
static int
-volgen_graph_merge_sub (glusterfs_graph_t *dgraph, glusterfs_graph_t *sgraph)
+volgen_graph_merge_sub (volgen_graph_t *dgraph, volgen_graph_t *sgraph)
{
xlator_t *trav = NULL;
- GF_ASSERT (dgraph->first);
+ GF_ASSERT (dgraph->graph.first);
if (volgen_xlator_link (first_of (dgraph), first_of (sgraph)) == -1)
return -1;
for (trav = first_of (dgraph); trav->next; trav = trav->next);
- trav->next = sgraph->first;
+ trav->next = first_of (sgraph);
trav->next->prev = trav;
- dgraph->xl_count += sgraph->xl_count;
+ dgraph->graph.xl_count += sgraph->graph.xl_count;
return 0;
}
static int
-volgen_write_volfile (glusterfs_graph_t *graph, char *filename)
+volgen_write_volfile (volgen_graph_t *graph, char *filename)
{
char *ftmp = NULL;
FILE *f = NULL;
@@ -1033,7 +1046,7 @@ volgen_write_volfile (glusterfs_graph_t *graph, char *filename)
if (!f)
goto error;
- if (glusterfs_graph_print_file (f, graph) == -1)
+ if (glusterfs_graph_print_file (f, &graph->graph) == -1)
goto error;
if (fclose (f) == -1)
@@ -1060,7 +1073,7 @@ volgen_write_volfile (glusterfs_graph_t *graph, char *filename)
}
static void
-volgen_graph_free (glusterfs_graph_t *graph)
+volgen_graph_free (volgen_graph_t *graph)
{
xlator_t *trav = NULL;
xlator_t *trav_old = NULL;
@@ -1077,9 +1090,9 @@ volgen_graph_free (glusterfs_graph_t *graph)
}
static int
-build_graph_generic (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
+build_graph_generic (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
dict_t *mod_dict, void *param,
- int (*builder) (glusterfs_graph_t *graph,
+ int (*builder) (volgen_graph_t *graph,
glusterd_volinfo_t *volinfo,
dict_t *set_dict, void *param))
{
@@ -1122,7 +1135,7 @@ get_vol_transport_type (glusterd_volinfo_t *volinfo, char *tt)
}
static int
-server_auth_option_handler (glusterfs_graph_t *graph,
+server_auth_option_handler (volgen_graph_t *graph,
struct volopt_map_entry *vme, void *param)
{
xlator_t *xl = NULL;
@@ -1154,7 +1167,7 @@ server_auth_option_handler (glusterfs_graph_t *graph,
}
static int
-loglevel_option_handler (glusterfs_graph_t *graph,
+loglevel_option_handler (volgen_graph_t *graph,
struct volopt_map_entry *vme, void *param)
{
char *role = param;
@@ -1171,7 +1184,7 @@ loglevel_option_handler (glusterfs_graph_t *graph,
}
static int
-server_check_marker_off (struct volopt_map_entry *vme,
+server_check_marker_off (volgen_graph_t *graph, struct volopt_map_entry *vme,
glusterd_volinfo_t *volinfo)
{
gf_boolean_t bool = _gf_false;
@@ -1199,9 +1212,12 @@ server_check_marker_off (struct volopt_map_entry *vme,
ret = glusterd_check_gsync_running (volinfo, &bool);
if (bool) {
- gf_log ("", GF_LOG_WARNING, "Gsync sessions active"
+ gf_log ("", GF_LOG_WARNING, GEOREP" sessions active"
"for the volume %s, cannot disable marker "
,volinfo->volname);
+ set_graph_errstr (graph,
+ VKEY_MARKER_XTIME" cannot be disabled "
+ "while "GEOREP" sessions exist");
ret = -1;
goto out;
}
@@ -1221,7 +1237,7 @@ server_check_marker_off (struct volopt_map_entry *vme,
}
static int
-server_spec_option_handler (glusterfs_graph_t *graph,
+server_spec_option_handler (volgen_graph_t *graph,
struct volopt_map_entry *vme, void *param)
{
int ret = 0;
@@ -1231,7 +1247,7 @@ server_spec_option_handler (glusterfs_graph_t *graph,
ret = server_auth_option_handler (graph, vme, NULL);
if (!ret)
- ret = server_check_marker_off (vme, volinfo);
+ ret = server_check_marker_off (graph, vme, volinfo);
if (!ret)
ret = loglevel_option_handler (graph, vme, "brick");
@@ -1242,7 +1258,7 @@ server_spec_option_handler (glusterfs_graph_t *graph,
static void get_vol_tstamp_file (char *filename, glusterd_volinfo_t *volinfo);
static int
-server_graph_builder (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
+server_graph_builder (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
dict_t *set_dict, void *param)
{
char *volname = NULL;
@@ -1339,7 +1355,7 @@ server_graph_builder (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
/* builds a graph for server role , with option overrides in mod_dict */
static int
-build_server_graph (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
+build_server_graph (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
dict_t *mod_dict, char *path)
{
return build_graph_generic (graph, volinfo, mod_dict, path,
@@ -1347,7 +1363,7 @@ build_server_graph (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
}
static int
-perfxl_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry *vme,
+perfxl_option_handler (volgen_graph_t *graph, struct volopt_map_entry *vme,
void *param)
{
char *volname = NULL;
@@ -1370,7 +1386,7 @@ perfxl_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry *vme,
}
static int
-client_graph_builder (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
+client_graph_builder (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
dict_t *set_dict, void *param)
{
int dist_count = 0;
@@ -1532,7 +1548,7 @@ client_graph_builder (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
/* builds a graph for client role , with option overrides in mod_dict */
static int
-build_client_graph (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
+build_client_graph (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
dict_t *mod_dict)
{
return build_graph_generic (graph, volinfo, mod_dict, NULL,
@@ -1540,7 +1556,7 @@ build_client_graph (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
}
static int
-nfs_option_handler (glusterfs_graph_t *graph,
+nfs_option_handler (volgen_graph_t *graph,
struct volopt_map_entry *vme, void *param)
{
xlator_t *xl = NULL;
@@ -1709,7 +1725,7 @@ nfs_option_handler (glusterfs_graph_t *graph,
}
static int
-nfs_spec_option_handler (glusterfs_graph_t *graph,
+nfs_spec_option_handler (volgen_graph_t *graph,
struct volopt_map_entry *vme, void *param)
{
int ret = 0;
@@ -1722,9 +1738,9 @@ nfs_spec_option_handler (glusterfs_graph_t *graph,
/* builds a graph for nfs server role, with option overrides in mod_dict */
static int
-build_nfs_graph (glusterfs_graph_t *graph, dict_t *mod_dict)
+build_nfs_graph (volgen_graph_t *graph, dict_t *mod_dict)
{
- glusterfs_graph_t cgraph = {{0,},};
+ volgen_graph_t cgraph = {0,};
glusterd_volinfo_t *voliter = NULL;
xlator_t *this = NULL;
glusterd_conf_t *priv = NULL;
@@ -1855,7 +1871,7 @@ static int
glusterd_generate_brick_volfile (glusterd_volinfo_t *volinfo,
glusterd_brickinfo_t *brickinfo)
{
- glusterfs_graph_t graph = {{0,},};
+ volgen_graph_t graph = {0,};
char filename[PATH_MAX] = {0,};
int ret = -1;
@@ -1971,7 +1987,7 @@ get_rdma_client_filepath (char *filename, glusterd_volinfo_t *volinfo)
static int
generate_client_volfile (glusterd_volinfo_t *volinfo)
{
- glusterfs_graph_t graph = {{0,},};
+ volgen_graph_t graph = {0,};
char filename[PATH_MAX] = {0,};
int ret = -1;
dict_t *dict = NULL;
@@ -2072,7 +2088,7 @@ glusterd_get_nfs_filepath (char *filename)
int
glusterd_create_nfs_volfile ()
{
- glusterfs_graph_t graph = {{0,},};
+ volgen_graph_t graph = {0,};
char filename[PATH_MAX] = {0,};
int ret = -1;
@@ -2110,12 +2126,14 @@ validate_nfsopts (glusterd_volinfo_t *volinfo,
dict_t *val_dict,
char **op_errstr)
{
- glusterfs_graph_t graph = {{0,},};
+ volgen_graph_t graph = {0,};
int ret = -1;
+ graph.errstr = op_errstr;
+
ret = build_nfs_graph (&graph, val_dict);
if (!ret)
- ret = graph_reconf_validateopt (&graph, op_errstr);
+ ret = graph_reconf_validateopt (&graph.graph, op_errstr);
volgen_graph_free (&graph);
@@ -2128,15 +2146,16 @@ validate_clientopts (glusterd_volinfo_t *volinfo,
dict_t *val_dict,
char **op_errstr)
{
- glusterfs_graph_t graph = {{0,},};
+ volgen_graph_t graph = {0,};
int ret = -1;
GF_ASSERT (volinfo);
+ graph.errstr = op_errstr;
ret = build_client_graph (&graph, volinfo, val_dict);
if (!ret)
- ret = graph_reconf_validateopt (&graph, op_errstr);
+ ret = graph_reconf_validateopt (&graph.graph, op_errstr);
volgen_graph_free (&graph);
@@ -2150,16 +2169,16 @@ validate_brickopts (glusterd_volinfo_t *volinfo,
dict_t *val_dict,
char **op_errstr)
{
- glusterfs_graph_t graph = {{0,},};
+ volgen_graph_t graph = {0,};
int ret = -1;
GF_ASSERT (volinfo);
-
+ graph.errstr = op_errstr;
ret = build_server_graph (&graph, volinfo, val_dict, brickinfo_path);
if (!ret)
- ret = graph_reconf_validateopt (&graph, op_errstr);
+ ret = graph_reconf_validateopt (&graph.graph, op_errstr);
volgen_graph_free (&graph);