summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
Diffstat (limited to 'xlators')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volgen.c253
1 files changed, 119 insertions, 134 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c
index 3a85be50d62..0218a3c7634 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c
@@ -37,107 +37,104 @@
/* dispatch table for VOLUME SET
+ * -----------------------------
+ *
+ * Format of entries:
*
* First field is the <key>, for the purpose of looking it up
- * in volume dictionary.
+ * in volume dictionary. Each <key> is of the format "<domain>.<specifier>".
+ *
+ * Second field is <voltype>.
*
- * Second field is of the format "<xlator-type>:<action-specifier>".
- * The ":<action-specifier>" part can be omitted, which is handled
- * as if <action-specifier> is same as <key>.
+ * Third field is <option>, if its unset, it's assumed to be
+ * the same as <specifier>.
+ *
+ * Fourth field is <value>. In this context they are used to specify
+ * a default. That is, even the volume dict doesn't have a value,
+ * we procced as if the default value were set for it.
*
* There are two type of entries: basic and special.
*
- * - Basic entries are the ones where the <action-specifier>
- * does _not_ start with the bang! character ('!').
- * In their case, <action-specifier> is understood as
- * an option for <xlator-type>. Their effect is to copy over
- * the volinfo->dict[<key>] value to the graph nodes of
- * type <xlator-type> (if such a value is set). You are free to
- * add entries of this type, they will become functional just
- * by being present in the table.
+ * - Basic entries are the ones where the <option> does _not_ start with
+ * the bang! character ('!').
+ *
+ * In their case, <option> is understood as an option for an xlator of
+ * type <voltype>. Their effect is to copy over the volinfo->dict[<key>]
+ * value to all graph nodes of type <voltype> (if such a value is set).
*
- * - Special entries where the <action-specifier> starts
- * with the bang!. They are not applied to all graphs
- * during generation, and you cannot extend them in a
- * trivial way which could be just picked up. Better
+ * You are free to add entries of this type, they will become functional
+ * just by being present in the table.
+ *
+ * - Special entries where the <option> starts with the bang!.
+ *
+ * They are not applied to all graphs during generation, and you cannot
+ * extend them in a trivial way which could be just picked up. Better
* not touch them unless you know what you do.
+ *
+ * "NODOC" entries are not part of the public interface and are subject
+ * to change at any time.
*/
struct volopt_map_entry {
char *key;
char *voltype;
-};
-
-static struct volopt_map_entry glusterd_volopt_map[] = {
- {"lookup-unhashed", "cluster/distribute"},
- {"min-free-disk", "cluster/distribute"},
-
- {"entry-change-log", "cluster/replicate"},
- {"read-subvolume", "cluster/replicate"},
- {"background-self-heal-count", "cluster/replicate"},
- {"metadata-self-heal", "cluster/replicate"},
- {"data-self-heal", "cluster/replicate"},
- {"entry-self-heal", "cluster/replicate"},
- {"strict-readdir", "cluster/replicate"},
- {"data-self-heal-window-size", "cluster/replicate"},
- {"data-change-log", "cluster/replicate"},
- {"metadata-change-log", "cluster/replicate"},
-
- {"block-size", "cluster/stripe"},
-
- {"latency-measurement", "debug/io-stats"},
- {"dump-fd-stats", "debug/io-stats"},
- {"log-level", "debug/io-stats"},
- {"client-log-level", "debug/io-stats"},
-
- {"max-file-size", "performance/io-cache"},
- {"min-file-size", "performance/io-cache"},
- {"cache-timeout", "performance/io-cache"},
- {"cache-size", "performance/io-cache"},
- {"priority", "performance/io-cache"},
-
- {"thread-count", "performance/io-threads"},
-
- {"disk-usage-limit", "performance/quota"},
- {"min-free-disk-limit", "performance/quota"},
-
- {"window-size", "performance/write-behind:cache-size"},
-
- {"frame-timeout", "protocol/client"},
- {"ping-timeout", "protocol/client"},
-
- {"inode-lru-limit", "protocol/server"},
- {"allow", "protocol/server:!server-auth"},
- {"reject", "protocol/server:!server-auth"},
-
- {"write-behind", "performance/write-behind:!perf"},
- {"read-ahead", "performance/read-ahead:!perf"},
- {"io-cache", "performance/io-cache:!perf"},
- {"quick-read", "performance/quick-read:!perf"},
- {"stat-prefetch", "performance/stat-prefetch:!perf"},
-
- {NULL, }
-};
-
-
-/* Default entries (as of now, only for special volopts). */
-
-struct volopt_map_entry2 {
- char *key;
- char *voltype;
char *option;
char *value;
};
-static struct volopt_map_entry2 default_volopt_map2[] = {
- {"allow", NULL, NULL, "*"},
- {"write-behind", NULL, NULL, "on"},
- {"read-ahead", NULL, NULL, "on"},
- {"io-cache", NULL, NULL, "on"},
- {"quick-read", NULL, NULL, "on"},
- {NULL, }
+static struct volopt_map_entry glusterd_volopt_map[] = {
+ {"cluster.lookup-unhashed", "cluster/distribute", }, /* NODOC */
+ {"cluster.min-free-disk", "cluster/distribute", }, /* NODOC */
+
+ {"cluster.entry-change-log", "cluster/replicate", }, /* NODOC */
+ {"cluster.read-subvolume", "cluster/replicate", }, /* NODOC */
+ {"cluster.background-self-heal-count", "cluster/replicate", }, /* NODOC */
+ {"cluster.metadata-self-heal", "cluster/replicate", }, /* NODOC */
+ {"cluster.data-self-heal", "cluster/replicate", }, /* NODOC */
+ {"cluster.entry-self-heal", "cluster/replicate", }, /* NODOC */
+ {"cluster.strict-readdir", "cluster/replicate", }, /* NODOC */
+ {"cluster.self-heal-window-size", "cluster/replicate", "data-self-heal-window-size",},
+ {"cluster.data-change-log", "cluster/replicate", }, /* NODOC */
+ {"cluster.metadata-change-log", "cluster/replicate", }, /* NODOC */
+
+ {"cluster.stripe-block-size", "cluster/stripe", "block-size",},
+
+ {"diagnostics.latency-measurement", "debug/io-stats", },
+ {"diagnostics.dump-fd-stats", "debug/io-stats", },
+ {"diagnostics.brick-log-level", "debug/io-stats", "log-level",},
+ {"diagnostics.client-log-level", "debug/io-stats", },
+
+ {"performance.cache-max-file-size", "performance/io-cache", "max-file-size",},
+ {"performance.cache-min-file-size", "performance/io-cache", "min-file-size",},
+ {"performance.cache-refresh-timeout", "performance/io-cache", "cache-timeout",},
+ {"performance.cache-priority", "performance/io-cache", "priority",}, /* NODOC */
+ {"performance.cache-size", "performance/io-cache", },
+ {"performance.cache-size", "performance/quick-read", },
+
+ {"performance.io-thread-count", "performance/io-threads", "thread-count",},
+
+ {"performance.disk-usage-limit", "performance/quota", }, /* NODOC */
+ {"performance.min-free-disk-limit", "performance/quota", }, /* NODOC */
+
+ {"performance.write-behind-window-size", "performance/write-behind", "cache-size",},
+
+ {"network.frame-timeout", "protocol/client", },
+ {"network.ping-timeout", "protocol/client", },
+ {"network.inode-lru-limit", "protocol/server", }, /* NODOC */
+
+ {"auth.allow", "protocol/server", "!server-auth", "*"},
+ {"auth.reject", "protocol/server", "!server-auth",},
+
+ {"performance.write-behind", "performance/write-behind", "!perf", "on"}, /* NODOC */
+ {"performance.read-ahead", "performance/read-ahead", "!perf", "on"}, /* NODOC */
+ {"performance.io-cache", "performance/io-cache", "!perf", "on"}, /* NODOC */
+ {"performance.quick-read", "performance/quick-read", "!perf", "on"}, /* NODOC */
+ {"performance.stat-prefetch", "performance/stat-prefetch", "!perf",}, /* NODOC */
+
+ {NULL, }
};
+
#define VOLGEN_GET_NFS_DIR(path) \
do { \
glusterd_conf_t *priv = THIS->private; \
@@ -341,7 +338,7 @@ first_of (glusterfs_graph_t *graph)
typedef int (*volgen_opthandler_t) (glusterfs_graph_t *graph,
- struct volopt_map_entry2 *vme2,
+ struct volopt_map_entry *vme,
void *param);
struct opthandler_data {
@@ -358,7 +355,7 @@ static void
process_option (dict_t *dict, char *key, data_t *value, void *param)
{
struct opthandler_data *data = param;
- struct volopt_map_entry2 vme2 = {0,};
+ struct volopt_map_entry vme = {0,};
if (data->rv)
return;
@@ -367,28 +364,22 @@ process_option (dict_t *dict, char *key, data_t *value, void *param)
data->found = _gf_true;
- vme2.key = key;
- vme2.voltype = gf_strdup (data->vme->voltype);
- if (!vme2.voltype) {
- gf_log ("", GF_LOG_ERROR, "Out of memory");
-
- data->rv = -1;
- return;
+ vme.key = key;
+ vme.voltype = data->vme->voltype;
+ vme.option = data->vme->option;
+ if (!vme.option) {
+ vme.option = strrchr (key, '.');
+ if (vme.option)
+ vme.option++;
+ else
+ vme.option = key;
}
- vme2.option = strchr (vme2.voltype, ':');
- if (vme2.option) {
- *vme2.option = '\0';
- vme2.option++;
- } else
- vme2.option = key;
if (data->data_t_fake)
- vme2.value = (char *)value;
+ vme.value = (char *)value;
else
- vme2.value = value->data;
+ vme.value = value->data;
- data->rv = data->handler (data->graph, &vme2, data->param);
-
- GF_FREE (vme2.voltype);
+ data->rv = data->handler (data->graph, &vme, data->param);
}
static int
@@ -396,7 +387,6 @@ volgen_graph_set_options_generic (glusterfs_graph_t *graph, dict_t *dict,
void *param, volgen_opthandler_t handler)
{
struct volopt_map_entry *vme = NULL;
- struct volopt_map_entry2 *vme2 = NULL;
struct opthandler_data data = {0,};
data.graph = graph;
@@ -416,21 +406,16 @@ volgen_graph_set_options_generic (glusterfs_graph_t *graph, dict_t *dict,
continue;
/* check for default value */
- for (vme2 = default_volopt_map2; vme2->key;
- vme2++) {
- if (strcmp (vme2->key, vme->key) != 0)
- continue;
+ if (vme->value) {
/* stupid hack to be able to reuse dict iterator
* in this context
*/
data.data_t_fake = _gf_true;
- process_option (NULL, vme->key, (data_t *)vme2->value,
+ process_option (NULL, vme->key, (data_t *)vme->value,
&data);
if (data.rv)
return data.rv;
-
- break;
}
}
@@ -438,20 +423,20 @@ volgen_graph_set_options_generic (glusterfs_graph_t *graph, dict_t *dict,
}
static int
-basic_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry2 *vme2,
+basic_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry *vme,
void *param)
{
xlator_t *trav;
int ret = 0;
- if (vme2->option[0] == '!')
+ if (vme->option[0] == '!')
return 0;
for (trav = first_of (graph); trav; trav = trav->next) {
- if (strcmp (trav->type, vme2->voltype) != 0)
+ if (strcmp (trav->type, vme->voltype) != 0)
continue;
- ret = xlator_set_option (trav, vme2->option, vme2->value);
+ ret = xlator_set_option (trav, vme->option, vme->value);
if (ret)
return -1;
}
@@ -467,13 +452,13 @@ volgen_graph_set_options (glusterfs_graph_t *graph, dict_t *dict)
}
static int
-optget_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry2 *vme2,
+optget_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry *vme,
void *param)
{
- struct volopt_map_entry2 *vme2x = param;
+ struct volopt_map_entry *vme2 = param;
- if (strcmp (vme2->key, vme2x->key) == 0)
- vme2x->value = vme2->value;
+ if (strcmp (vme->key, vme2->key) == 0)
+ vme2->value = vme->value;
return 0;
}
@@ -482,12 +467,12 @@ optget_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry2 *vme2,
int
glusterd_volinfo_get (glusterd_volinfo_t *volinfo, char *key, char **value)
{
- struct volopt_map_entry2 vme2 = {0,};
+ struct volopt_map_entry vme = {0,};
int ret = 0;
- vme2.key = key;
+ vme.key = key;
- ret = volgen_graph_set_options_generic (NULL, volinfo->dict, &vme2,
+ ret = volgen_graph_set_options_generic (NULL, volinfo->dict, &vme,
&optget_option_handler);
if (ret) {
gf_log ("", GF_LOG_ERROR, "Out of memory");
@@ -495,7 +480,7 @@ glusterd_volinfo_get (glusterd_volinfo_t *volinfo, char *key, char **value)
return -1;
}
- *value = vme2.value;
+ *value = vme.value;
return 0;
}
@@ -504,10 +489,10 @@ int
glusterd_check_option_exists (char *key)
{
dict_t *dict = NULL;
- struct volopt_map_entry2 vme2 = {0,};
+ struct volopt_map_entry vme = {0,};
int ret = 0;
- vme2.key = key;
+ vme.key = key;
/* We are getting a bit anal here to avoid typing
* fnmatch one more time. Orthogonality foremost!
@@ -521,13 +506,13 @@ glusterd_check_option_exists (char *key)
if (!dict || dict_set_str (dict, key, ""))
goto oom;
- ret = volgen_graph_set_options_generic (NULL, dict, &vme2,
+ ret = volgen_graph_set_options_generic (NULL, dict, &vme,
&optget_option_handler);
dict_destroy (dict);
if (ret)
goto oom;
- return !!vme2.value;
+ return !!vme.value;
oom:
gf_log ("", GF_LOG_ERROR, "Out of memory");
@@ -651,23 +636,23 @@ get_vol_transport_type (glusterd_volinfo_t *volinfo, char *tt)
static int
server_auth_option_handler (glusterfs_graph_t *graph,
- struct volopt_map_entry2 *vme2, void *param)
+ struct volopt_map_entry *vme, void *param)
{
xlator_t *xl = NULL;
xlator_list_t *trav = NULL;
char *aa = NULL;
int ret = 0;
- if (strcmp (vme2->option, "!server-auth") != 0)
+ if (strcmp (vme->option, "!server-auth") != 0)
return 0;
xl = first_of (graph);
for (trav = xl->children; trav; trav = trav->next) {
ret = gf_asprintf (&aa, "auth.addr.%s.%s", trav->xlator->name,
- vme2->key);
+ vme->key);
if (ret != -1) {
- ret = xlator_set_option (xl, aa, vme2->value);
+ ret = xlator_set_option (xl, aa, vme->value);
GF_FREE (aa);
}
if (ret)
@@ -776,7 +761,7 @@ build_server_graph (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
}
static int
-perfxl_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry2 *vme2,
+perfxl_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry *vme,
void *param)
{
char *volname = NULL;
@@ -784,15 +769,15 @@ perfxl_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry2 *vme2,
volname = param;
- if (strcmp (vme2->option, "!perf") != 0)
+ if (strcmp (vme->option, "!perf") != 0)
return 0;
- if (gf_string2boolean (vme2->value, &enabled) == -1)
+ if (gf_string2boolean (vme->value, &enabled) == -1)
return -1;
if (!enabled)
return 0;
- if (volgen_graph_add (graph, vme2->voltype, volname))
+ if (volgen_graph_add (graph, vme->voltype, volname))
return 0;
else
return -1;