summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGaurav <gaurav@gluster.com>2011-03-01 06:02:39 +0000
committerAnand V. Avati <avati@dev.gluster.com>2011-03-01 14:02:22 -0800
commit4d9de810f1cb4211fc59ab5b042771402c998331 (patch)
treea653de067f9847b44d0d84fde97d8b65d8f6d34d
parent63632c7b95d204cb077d999e32690a2cdcba1327 (diff)
CLI : NFS persistent local/global options.
Signed-off-by: Gaurav <gaurav@gluster.com> Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 2064 (NFS options are removed upon glusterd restart) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2064
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-handler.c15
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-op-sm.c211
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c1
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volgen.c524
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volgen.h5
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.h3
6 files changed, 597 insertions, 162 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c
index b2d191b7b57..efba9e202c7 100644
--- a/xlators/mgmt/glusterd/src/glusterd-handler.c
+++ b/xlators/mgmt/glusterd/src/glusterd-handler.c
@@ -284,11 +284,16 @@ glusterd_add_volume_detail_to_dict (glusterd_volinfo_t *volinfo,
dict_t *dict = NULL;
data_t *value = NULL;
int opt_count = 0;
+ glusterd_conf_t *priv = NULL;
GF_ASSERT (volinfo);
GF_ASSERT (volumes);
+ priv = THIS->private;
+
+ GF_ASSERT (priv);
+
snprintf (key, 256, "volume%d.name", count);
ret = dict_set_str (volumes, key, volinfo->volname);
if (ret)
@@ -342,11 +347,11 @@ glusterd_add_volume_detail_to_dict (glusterd_volinfo_t *volinfo,
while (pairs) {
if (1 == glusterd_check_option_exists (pairs->key, NULL)) {
value = pairs->value;
- if (!value)
+ if (!value)
continue;
- snprintf (reconfig_key, 256, "volume%d.option.%s", count,
- pairs->key);
+ snprintf (reconfig_key, 256, "volume%d.option.%s", count,
+ pairs->key);
ret = dict_set_str (volumes, reconfig_key, value->data);
if (!ret)
opt_count++;
@@ -356,9 +361,6 @@ glusterd_add_volume_detail_to_dict (glusterd_volinfo_t *volinfo,
snprintf (key, 256, "volume%d.opt_count", count);
ret = dict_set_int32 (volumes, key, opt_count);
- if (ret)
- goto out;
-
out:
return ret;
}
@@ -3429,7 +3431,6 @@ respond:
ret = dict_set_int32 (volumes, "count", count);
if (ret)
goto out;
-
ret = dict_allocate_and_serialize (volumes, &rsp.volumes.volumes_val,
(size_t *)&rsp.volumes.volumes_len);
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
index 9cf34fe8163..fc8f86ac8a3 100644
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
@@ -1098,6 +1098,21 @@ glusterd_op_stage_set_volume (dict_t *dict, char **op_errstr)
char errstr[2048] = {0, };
glusterd_volinfo_t *volinfo = NULL;
dict_t *val_dict = NULL;
+ gf_boolean_t global_opt = _gf_false;
+ glusterd_volinfo_t *voliter = NULL;
+ glusterd_conf_t *priv = NULL;
+ xlator_t *this = NULL;
+
+ GF_ASSERT (dict);
+ this = THIS;
+ GF_ASSERT (this);
+ priv = this->private;
+ GF_ASSERT (priv);
+
+ val_dict = dict_new();
+ if (!val_dict)
+ goto out;
+
ret = dict_get_str (dict, "volname", &volname);
if (ret) {
@@ -1144,7 +1159,7 @@ glusterd_op_stage_set_volume (dict_t *dict, char **op_errstr)
for ( count = 1; ret != 1 ; count++ ) {
-
+ global_opt = _gf_false;
sprintf (str, "key%d", count);
ret = dict_get_str (dict, str, &key);
@@ -1183,6 +1198,11 @@ glusterd_op_stage_set_volume (dict_t *dict, char **op_errstr)
if (key_fixed)
key = key_fixed;
+
+ ret = glusterd_check_globaloption (key);
+ if (ret)
+ global_opt = _gf_true;
+
ret = dict_set_str (val_dict, key, value);
if (ret) {
@@ -1196,14 +1216,25 @@ glusterd_op_stage_set_volume (dict_t *dict, char **op_errstr)
GF_FREE (key_fixed);
key_fixed = NULL;
}
- }
- *op_errstr = NULL;
- ret = glusterd_validate_reconfopts (volinfo, val_dict, op_errstr);
- if (ret) {
- gf_log ("glusterd", GF_LOG_DEBUG, "Could not create temp "
- "volfile, some option failed: %s", *op_errstr);
- goto out;
+ *op_errstr = NULL;
+ if (!global_opt)
+ ret = glusterd_validate_reconfopts (volinfo, val_dict, op_errstr);
+ else {
+ voliter = NULL;
+ list_for_each_entry (voliter, &priv->volumes, vol_list) {
+ ret = glusterd_validate_globalopts (voliter, val_dict, op_errstr);
+ if (ret)
+ break;
+ }
+ }
+
+ if (ret) {
+ gf_log ("glusterd", GF_LOG_DEBUG, "Could not create temp "
+ "volfile, some option failed: %s", *op_errstr);
+ goto out;
+ }
+ dict_del (val_dict, key);
}
@@ -3839,7 +3870,6 @@ glusterd_restart_brick_servers (glusterd_volinfo_t *volinfo)
return 0;
}
-
static int
glusterd_op_set_volume (dict_t *dict)
{
@@ -3848,12 +3878,14 @@ glusterd_op_set_volume (dict_t *dict)
char *volname = NULL;
xlator_t *this = NULL;
glusterd_conf_t *priv = NULL;
- int count = 1;
+ int count = 1;
int restart_flag = 0;
char *key = NULL;
char *key_fixed = NULL;
char *value = NULL;
char str[50] = {0, };
+ gf_boolean_t global_opt = _gf_false;
+ glusterd_volinfo_t *voliter = NULL;
this = THIS;
GF_ASSERT (this);
@@ -3876,8 +3908,14 @@ glusterd_op_set_volume (dict_t *dict)
for ( count = 1; ret != -1 ; count++ ) {
- sprintf (str, "key%d", count);
- ret = dict_get_str (dict, str, &key);
+ global_opt = _gf_false;
+ sprintf (str, "key%d", count);
+ ret = dict_get_str (dict, str, &key);
+
+ if (ret) {
+ break;
+ }
+
if (!ret) {
ret = glusterd_check_option_exists (key, &key_fixed);
GF_ASSERT (ret);
@@ -3888,26 +3926,45 @@ glusterd_op_set_volume (dict_t *dict)
ret = 0;
}
- if (ret)
- break;
-
- sprintf (str, "value%d", count);
- ret = dict_get_str (dict, str, &value);
+ ret = glusterd_check_globaloption (key);
+ if (ret)
+ global_opt = _gf_true;
- if (ret) {
+ sprintf (str, "value%d", count);
+ ret = dict_get_str (dict, str, &value);
+ if (ret) {
gf_log ("", GF_LOG_ERROR,
"invalid key,value pair in 'volume set'");
- ret = -1;
- goto out;
- }
+ ret = -1;
+ goto out;
+ }
- value = gf_strdup (value);
- if (value) {
- if (key_fixed)
- key = key_fixed;
- ret = dict_set_dynstr (volinfo->dict, key, value);
- } else
+ if (!global_opt)
+ value = gf_strdup (value);
+
+ if (!value) {
+ gf_log ("", GF_LOG_ERROR,
+ "Unable to set the options in 'volume set'");
ret = -1;
+ goto out;
+ }
+
+ if (key_fixed)
+ key = key_fixed;
+
+ if (global_opt) {
+ list_for_each_entry (voliter, &priv->volumes, vol_list) {
+ value = gf_strdup (value);
+ ret = dict_set_dynstr (voliter->dict, key, value);
+ if (ret)
+ goto out;
+ }
+ }
+ else {
+ ret = dict_set_dynstr (volinfo->dict, key, value);
+ if (ret)
+ goto out;
+ }
if (strcmp (key, MARKER_VOL_KEY) == 0 &&
GLUSTERD_STATUS_STARTED == volinfo->status) {
@@ -3915,51 +3972,93 @@ glusterd_op_set_volume (dict_t *dict)
restart_flag = 1;
}
- if (ret) {
- gf_log ("", GF_LOG_ERROR,
- "Unable to set the options in 'volume set'");
- ret = -1;
- goto out;
- }
if (key_fixed) {
GF_FREE (key_fixed);
+
key_fixed = NULL;
}
- }
-
- if ( count == 1 ) {
- gf_log ("", GF_LOG_ERROR, "No options received ");
- ret = -1;
- goto out;
- }
+ }
- ret = glusterd_create_volfiles (volinfo);
- if (ret) {
- gf_log ("", GF_LOG_ERROR, "Unable to create volfile for"
- " 'volume set'");
- ret = -1;
- goto out;
+ if ( count == 1 ) {
+ gf_log ("", GF_LOG_ERROR, "No options received ");
+ ret = -1;
+ goto out;
}
- if (restart_flag) {
- if (glusterd_restart_brick_servers (volinfo)) {
+ if (!global_opt) {
+ ret = glusterd_create_volfiles (volinfo);
+ if (ret) {
+ gf_log ("", GF_LOG_ERROR, "Unable to create volfile for"
+ " 'volume set'");
ret = -1;
goto out;
}
+
+ if (restart_flag) {
+ if (glusterd_restart_brick_servers (volinfo)) {
+ ret = -1;
+ goto out;
+ }
+ }
+
+ ret = glusterd_store_update_volume (volinfo);
+ if (ret)
+ goto out;
+
+ ret = glusterd_volume_compute_cksum (volinfo);
+ if (ret)
+ goto out;
+
+ if (GLUSTERD_STATUS_STARTED == volinfo->status) {
+ ret = glusterd_check_generate_start_nfs (volinfo);
+ if (ret) {
+ gf_log ("", GF_LOG_WARNING,
+ "Unable to restart NFS-Server");
+ goto out;
+ }
+ }
+
}
+ else {
+ list_for_each_entry (voliter, &priv->volumes, vol_list) {
+ volinfo = voliter;
+ ret = glusterd_create_volfiles (volinfo);
+ if (ret) {
+ gf_log ("", GF_LOG_ERROR, "Unable to create volfile for"
+ " 'volume set'");
+ ret = -1;
+ goto out;
+ }
- ret = glusterd_store_update_volume (volinfo);
- if (ret)
- goto out;
+ if (restart_flag) {
+ if (glusterd_restart_brick_servers (volinfo)) {
+ ret = -1;
+ goto out;
+ }
+ }
+
+ ret = glusterd_store_update_volume (volinfo);
+ if (ret)
+ goto out;
+
+ ret = glusterd_volume_compute_cksum (volinfo);
+ if (ret)
+ goto out;
+
+ if (GLUSTERD_STATUS_STARTED == volinfo->status) {
+ ret = glusterd_check_generate_start_nfs (volinfo);
+ if (ret) {
+ gf_log ("", GF_LOG_WARNING,
+ "Unable to restart NFS-Server");
+ goto out;
+ }
+ }
+ }
+ }
- ret = glusterd_volume_compute_cksum (volinfo);
- if (ret)
- goto out;
- if (GLUSTERD_STATUS_STARTED == volinfo->status)
- ret = glusterd_check_generate_start_nfs (volinfo);
ret = 0;
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index 8da1b0646a7..0c910477635 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -1816,6 +1816,7 @@ glusterd_check_generate_start_nfs (glusterd_volinfo_t *volinfo)
goto out;
}
+
ret = glusterd_create_nfs_volfile ();
if (ret)
goto out;
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c
index 90b227c0eb6..ec14b665b06 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c
@@ -75,71 +75,91 @@
* "NODOC" entries are not part of the public interface and are subject
* to change at any time.
*/
+typedef enum { DOC, NO_DOC, GLOBAL_DOC, GLOBAL_NO_DOC } option_type_t;
+
struct volopt_map_entry {
char *key;
char *voltype;
char *option;
char *value;
+ option_type_t type;
};
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.data-self-heal-algorithm", "cluster/replicate", "data-self-heal-algorithm"},
-
- {"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", "!log-level",},
-
- {"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.flush-behind", "performance/write-behind", "flush-behind",},
-
- {"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",},
-
- {"transport.keepalive", "protocol/server", "transport.socket.keepalive",},
-
- {"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", "on"}, /* NODOC */
-
- {"nfs.enable-ino32", "nfs/server", "nfs.enable-ino32",},
- {"nfs.mem-factor", "nfs/server", "nfs.mem-factor",},
-
- {MARKER_VOL_KEY, "features/marker", "!marker", "off"},
+ {"cluster.lookup-unhashed", "cluster/distribute", NULL, NULL, NO_DOC }, /* NODOC */
+ {"cluster.min-free-disk", "cluster/distribute", NULL, NULL, NO_DOC }, /* NODOC */
+
+ {"cluster.entry-change-log", "cluster/replicate", NULL, NULL, NO_DOC }, /* NODOC */
+ {"cluster.read-subvolume", "cluster/replicate", NULL, NULL, NO_DOC }, /* NODOC */
+ {"cluster.background-self-heal-count", "cluster/replicate", NULL, NULL, NO_DOC }, /* NODOC */
+ {"cluster.metadata-self-heal", "cluster/replicate", NULL, NULL, NO_DOC }, /* NODOC */
+ {"cluster.data-self-heal", "cluster/replicate", NULL, NULL, NO_DOC }, /* NODOC */
+ {"cluster.entry-self-heal", "cluster/replicate", NULL, NULL, NO_DOC }, /* NODOC */
+ {"cluster.strict-readdir", "cluster/replicate", NULL, NULL, NO_DOC }, /* NODOC */
+ {"cluster.self-heal-window-size", "cluster/replicate", "data-self-heal-window-size", NULL, DOC},
+ {"cluster.data-change-log", "cluster/replicate", NULL, NULL, NO_DOC }, /* NODOC */
+ {"cluster.metadata-change-log", "cluster/replicate", NULL, NULL, NO_DOC }, /* NODOC */
+ {"cluster.data-self-heal-algorithm", "cluster/replicate", "data-self-heal-algorithm", NULL,DOC},
+
+ {"cluster.stripe-block-size", "cluster/stripe", "block-size", NULL, DOC},
+
+ {"diagnostics.latency-measurement", "debug/io-stats", NULL, NULL, NO_DOC },
+ {"diagnostics.dump-fd-stats", "debug/io-stats", NULL, NULL, NO_DOC },
+ {"diagnostics.brick-log-level", "debug/io-stats", "!log-level", NULL, DOC},
+ {"diagnostics.client-log-level", "debug/io-stats", "!log-level", NULL, DOC},
+
+ {"performance.cache-max-file-size", "performance/io-cache", "max-file-size", NULL, DOC},
+ {"performance.cache-min-file-size", "performance/io-cache", "min-file-size", NULL, DOC},
+ {"performance.cache-refresh-timeout", "performance/io-cache", "cache-timeout", NULL, DOC},
+ {"performance.cache-priority", "performance/io-cache", "priority", NULL, DOC}, /* NODOC */
+ {"performance.cache-size", "performance/io-cache", NULL, NULL, NO_DOC },
+ {"performance.cache-size", "performance/quick-read", NULL, NULL, NO_DOC },
+ {"performance.flush-behind", "performance/write-behind", "flush-behind", NULL, DOC},
+
+ {"performance.io-thread-count", "performance/io-threads", "thread-count", DOC},
+
+ {"performance.disk-usage-limit", "performance/quota", NULL, NULL, NO_DOC }, /* NODOC */
+ {"performance.min-free-disk-limit", "performance/quota", NULL, NULL, NO_DOC }, /* NODOC */
+
+ {"performance.write-behind-window-size", "performance/write-behind", "cache-size", NULL, DOC},
+
+ {"network.frame-timeout", "protocol/client", NULL, NULL, NO_DOC },
+ {"network.ping-timeout", "protocol/client", NULL, NULL, NO_DOC },
+ {"network.inode-lru-limit", "protocol/server", NULL, NULL, NO_DOC }, /* NODOC */
+
+ {"auth.allow", "protocol/server", "!server-auth", "*", DOC},
+ {"auth.reject", "protocol/server", "!server-auth", NULL, DOC},
+
+ {"transport.keepalive", "protocol/server", "transport.socket.keepalive", NULL, NO_DOC},
+
+ {"performance.write-behind", "performance/write-behind", "!perf", "on", NO_DOC}, /* NODOC */
+ {"performance.read-ahead", "performance/read-ahead", "!perf", "on", NO_DOC}, /* NODOC */
+ {"performance.io-cache", "performance/io-cache", "!perf", "on", NO_DOC}, /* NODOC */
+ {"performance.quick-read", "performance/quick-read", "!perf", "on", NO_DOC}, /* NODOC */
+ {"performance.stat-prefetch", "performance/stat-prefetch", "!perf", "on", NO_DOC}, /* NODOC */
+
+ {MARKER_VOL_KEY, "features/marker", "!marker", "off", NO_DOC},
+
+ {"nfs.enable-ino32", "nfs/server", "nfs.enable-ino32", NULL, GLOBAL_DOC},
+ {"nfs.export-dirs", "nfs/server", "nfs3.export-dirs", NULL, GLOBAL_DOC},
+ {"nfs.export-volumes", "nfs/server", "nfs3.export-volumes", NULL, GLOBAL_DOC},
+ {"nfs.addr-namelookup", "nfs/server", "rpc-auth.addr.namelookup", NULL, GLOBAL_DOC},
+ {"nfs.dynamic-volumes", "nfs/server", "nfs.dynamic-volumes", NULL, GLOBAL_DOC},
+ {"nfs.register-with-portmap", "nfs/server", "rpc.register-with-portmap", NULL, GLOBAL_DOC},
+ {"nfs.port", "nfs/server", "nfs.port", NULL, GLOBAL_DOC},
+
+ {"nfs.rpc-auth-unix", "nfs/server", "!nfs.rpc-auth-auth-unix", NULL, DOC},
+ {"nfs.rpc-auth-null", "nfs/server", "!nfs.rpc-auth-auth-null", NULL, DOC},
+ {"nfs.rpc-auth-allow", "nfs/server", "!nfs.rpc-auth.addr.allow", NULL, DOC},
+ {"nfs.rpc-auth-reject", "nfs/server", "!nfs.rpc-auth.addr.reject", NULL, DOC},
+ {"nfs.ports-insecure", "nfs/server", "!nfs.auth.ports.insecure", NULL, DOC},
+
+ {"nfs.trusted-sync", "nfs/server", "!nfs-trusted-sync", NULL, DOC},
+ {"nfs.trusted-write", "nfs/server", "!nfs-trusted-write", NULL, DOC},
+ {"nfs.volume-access", "nfs/server", "!nfs-volume-access", NULL, DOC},
+ {"nfs.export-dir", "nfs/server", "!nfs-export-dir", NULL, DOC},
{NULL, }
};
@@ -154,6 +174,7 @@ static struct volopt_map_entry glusterd_volopt_map[] = {
+
static xlator_t *
xlator_instantiate_va (const char *type, const char *format, va_list arg)
{
@@ -531,6 +552,7 @@ struct opthandler_data {
gf_boolean_t found;
gf_boolean_t data_t_fake;
int rv;
+ char *volname;
void *param;
};
@@ -718,6 +740,109 @@ glusterd_volinfo_get (glusterd_volinfo_t *volinfo, char *key, char **value)
return volgen_dict_get (volinfo->dict, key, value);
}
+gf_boolean_t
+glusterd_check_globaloption (char *key)
+{
+ char *completion = NULL;
+ struct volopt_map_entry *vmep = NULL;
+ int ret = 0;
+
+ if (!strchr (key, '.')) {
+ ret = option_complete (key, &completion);
+ if (ret) {
+ gf_log ("", GF_LOG_ERROR, "Out of memory");
+ return _gf_false;
+ }
+
+ if (!completion) {
+ gf_log ("", GF_LOG_ERROR, "option %s does not exist",
+ key);
+ return _gf_false;
+ }
+ }
+
+ for (vmep = glusterd_volopt_map; vmep->key; vmep++) {
+ if (strcmp (vmep->key, key) == 0) {
+ if ((vmep->type == GLOBAL_DOC) ||
+ (vmep->type == GLOBAL_NO_DOC))
+ return _gf_true;
+ else
+ return _gf_false;
+ }
+ }
+
+ return _gf_false;
+}
+
+gf_boolean_t
+glusterd_check_localoption (char *key)
+{
+ char *completion = NULL;
+ struct volopt_map_entry *vmep = NULL;
+ int ret = 0;
+
+ if (!strchr (key, '.')) {
+ ret = option_complete (key, &completion);
+ if (ret) {
+ gf_log ("", GF_LOG_ERROR, "Out of memory");
+ return _gf_false;
+ }
+
+ if (!completion) {
+ gf_log ("", GF_LOG_ERROR, "option %s does not exist",
+ key);
+ return _gf_false;
+ }
+ }
+
+ for (vmep = glusterd_volopt_map; vmep->key; vmep++) {
+ if (strcmp (vmep->key, key) == 0) {
+ if ((vmep->type == DOC) ||
+ (vmep->type == NO_DOC))
+ return _gf_true;
+ else
+ return _gf_false;
+ }
+ }
+
+ return _gf_false;
+}
+
+int
+glusterd_check_voloption (char *key)
+{
+ char *completion = NULL;
+ struct volopt_map_entry *vmep = NULL;
+ int ret = 0;
+
+ if (!strchr (key, '.')) {
+ ret = option_complete (key, &completion);
+ if (ret) {
+ gf_log ("", GF_LOG_ERROR, "Out of memory");
+ return _gf_false;
+ }
+
+ if (!completion) {
+ gf_log ("", GF_LOG_ERROR, "option %s does not exist",
+ key);
+ return _gf_false;
+ }
+ }
+
+ for (vmep = glusterd_volopt_map; vmep->key; vmep++) {
+ if (strcmp (vmep->key, key) == 0) {
+ if ((vmep->type == DOC) ||
+ (vmep->type == DOC))
+ return _gf_true;
+ else
+ return _gf_false;
+ }
+ }
+
+ return _gf_false;
+
+}
+
int
glusterd_check_option_exists (char *key, char **completion)
{
@@ -1286,6 +1411,173 @@ build_client_graph (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo,
&client_graph_builder);
}
+static int
+nfs_option_handler (glusterfs_graph_t *graph,
+ struct volopt_map_entry *vme, void *param)
+{
+ xlator_t *xl = NULL;
+ char *aa = NULL;
+ int ret = 0;
+ glusterd_volinfo_t *volinfo = NULL;
+
+ volinfo = param;
+
+ xl = first_of (graph);
+
+/* if (vme->type == GLOBAL_DOC || vme->type == GLOBAL_NO_DOC) {
+
+ ret = xlator_set_option (xl, vme->key, vme->value);
+ }*/
+ if ( !volinfo || !volinfo->volname)
+ return 0;
+
+ if (! strcmp (vme->option, "!nfs.rpc-auth-addr-allow")) {
+ ret = gf_asprintf (&aa, "rpc-auth.addr.%s.allow",
+ volinfo->volname);
+
+ if (ret != -1) {
+ ret = xlator_set_option (xl, aa, vme->value);
+ GF_FREE (aa);
+ }
+
+ if (ret)
+ return -1;
+ }
+
+ if (! strcmp (vme->option, "!nfs.rpc-auth-addr-reject")) {
+ ret = gf_asprintf (&aa, "rpc-auth.addr.%s.reject",
+ volinfo->volname);
+
+ if (ret != -1) {
+ ret = xlator_set_option (xl, aa, vme->value);
+ GF_FREE (aa);
+ }
+
+ if (ret)
+ return -1;
+ }
+
+ if (! strcmp (vme->option, "!nfs.rpc-auth-auth-unix")) {
+ ret = gf_asprintf (&aa, "rpc-auth.auth.unix.%s",
+ volinfo->volname);
+
+ if (ret != -1) {
+ ret = xlator_set_option (xl, aa, vme->value);
+ GF_FREE (aa);
+ }
+
+ if (ret)
+ return -1;
+ }
+ if (! strcmp (vme->option, "!nfs.rpc-auth-auth-null")) {
+ ret = gf_asprintf (&aa, "rpc-auth.auth.null.%s",
+ volinfo->volname);
+
+ if (ret != -1) {
+ ret = xlator_set_option (xl, aa, vme->value);
+ GF_FREE (aa);
+ }
+
+ if (ret)
+ return -1;
+ }
+
+ if (! strcmp (vme->option, "!nfs-trusted-sync")) {
+ ret = gf_asprintf (&aa, "nfs3.%s.trusted-sync",
+ volinfo->volname);
+
+ if (ret != -1) {
+ ret = xlator_set_option (xl, aa, vme->value);
+ GF_FREE (aa);
+ }
+
+ if (ret)
+ return -1;
+ }
+
+ if (! strcmp (vme->option, "!nfs-trusted-write")) {
+ ret = gf_asprintf (&aa, "nfs3.%s.trusted-write",
+ volinfo->volname);
+
+ if (ret != -1) {
+ ret = xlator_set_option (xl, aa, vme->value);
+ GF_FREE (aa);
+ }
+
+ if (ret)
+ return -1;
+ }
+
+ if (! strcmp (vme->option, "!nfs-volume-access")) {
+ ret = gf_asprintf (&aa, "nfs3.%s.volume-access",
+ volinfo->volname);
+
+ if (ret != -1) {
+ ret = xlator_set_option (xl, aa, vme->value);
+ GF_FREE (aa);
+ }
+
+ if (ret)
+ return -1;
+ }
+
+ if (! strcmp (vme->option, "!nfs-export-dir")) {
+ ret = gf_asprintf (&aa, "nfs3.%s.export-dir",
+ volinfo->volname);
+
+ if (ret != -1) {
+ ret = xlator_set_option (xl, aa, vme->value);
+ GF_FREE (aa);
+ }
+
+ if (ret)
+ return -1;
+ }
+
+
+
+ if (! strcmp (vme->option, "!nfs.ports-insecure")) {
+ ret = gf_asprintf (&aa, "rpc-auth.ports.%s.insecure",
+ volinfo->volname);
+
+ if (ret != -1) {
+ ret = xlator_set_option (xl, aa, vme->value);
+ GF_FREE (aa);
+ }
+
+ if (ret)
+ return -1;
+ }
+
+
+ /*key = strchr (vme->key, '.') + 1;
+
+ for (trav = xl->children; trav; trav = trav->next) {
+ ret = gf_asprintf (&aa, "auth.addr.%s.%s", trav->xlator->name,
+ key);
+ if (ret != -1) {
+ ret = xlator_set_option (xl, aa, vme->value);
+ GF_FREE (aa);
+ }
+ if (ret)
+ return -1;
+ }*/
+
+ return 0;
+}
+
+static int
+nfs_spec_option_handler (glusterfs_graph_t *graph,
+ struct volopt_map_entry *vme, void *param)
+{
+ int ret = 0;
+
+ ret = nfs_option_handler (graph, vme, param);
+ if (!ret)
+ return basic_option_handler (graph, vme, NULL);
+ return ret;
+}
+
/* 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)
@@ -1297,8 +1589,6 @@ build_nfs_graph (glusterfs_graph_t *graph, dict_t *mod_dict)
dict_t *set_dict = NULL;
xlator_t *nfsxl = NULL;
char *skey = NULL;
- char *enable_ino32 = NULL;
- char *mem_factor = NULL;
int ret = 0;
this = THIS;
@@ -1306,10 +1596,7 @@ build_nfs_graph (glusterfs_graph_t *graph, dict_t *mod_dict)
priv = this->private;
GF_ASSERT (priv);
- if (mod_dict)
- set_dict = dict_copy (mod_dict, NULL);
- else
- set_dict = dict_new ();
+ set_dict = dict_new ();
if (!set_dict) {
gf_log ("", GF_LOG_ERROR, "Out of memory");
return -1;
@@ -1355,36 +1642,6 @@ build_nfs_graph (glusterfs_graph_t *graph, dict_t *mod_dict)
if (ret)
goto out;
- if (!dict_get (set_dict, "nfs.enable-ino32")) {
- ret = glusterd_volinfo_get (voliter,
- "nfs.enable-ino32",
- &enable_ino32);
- if (ret)
- goto out;
- if (enable_ino32) {
- ret = dict_set_str (set_dict,
- "nfs.enable-ino32",
- enable_ino32);
- if (ret)
- goto out;
- }
- }
-
- if (!dict_get (set_dict, "nfs.mem-factor")) {
- ret = glusterd_volinfo_get (voliter,
- "nfs.mem-factor",
- &mem_factor);
- if (ret)
- goto out;
- if (mem_factor) {
- ret = dict_set_str (set_dict,
- "nfs.mem-factor",
- mem_factor);
- if (ret)
- goto out;
- }
- }
-
/* If both RDMA and TCP are the transport_type, use RDMA
for NFS client protocols */
if (voliter->transport_type == GF_TRANSPORT_BOTH_TCP_RDMA) {
@@ -1395,15 +1652,25 @@ build_nfs_graph (glusterfs_graph_t *graph, dict_t *mod_dict)
}
memset (&cgraph, 0, sizeof (cgraph));
- ret = build_client_graph (&cgraph, voliter, set_dict);
+ ret = build_client_graph (&cgraph, voliter, mod_dict);
if (ret)
goto out;;
ret = volgen_graph_merge_sub (graph, &cgraph);
if (ret)
- goto out;;
+ goto out;
+
+ if (mod_dict) {
+ dict_copy (mod_dict, set_dict);
+ ret = volgen_graph_set_options_generic (graph, set_dict, voliter,
+ nfs_spec_option_handler);
+ }
+ else
+ ret = volgen_graph_set_options_generic (graph, voliter->dict, voliter,
+ nfs_spec_option_handler);
+
}
- ret = volgen_graph_set_options (graph, set_dict);
+
out:
dict_destroy (set_dict);
@@ -1706,8 +1973,6 @@ validate_nfsopts (glusterd_volinfo_t *volinfo,
glusterfs_graph_t graph = {{0,},};
int ret = -1;
- GF_ASSERT (volinfo);
-
ret = build_nfs_graph (&graph, val_dict);
if (!ret)
ret = graph_reconf_validateopt (&graph, op_errstr);
@@ -1786,14 +2051,75 @@ out:
return ret;
}
+static void
+_check_globalopt (dict_t *this, char *key, data_t *value, void *ret_val)
+{
+ int *ret = NULL;
+
+ ret = ret_val;
+ if (*ret)
+ return;
+ if (!glusterd_check_globaloption (key))
+ *ret = 1;
+}
+
+int
+glusterd_validate_globalopts (glusterd_volinfo_t *volinfo,
+ dict_t *val_dict, char **op_errstr)
+{
+ int ret = 0;
+
+ dict_foreach (val_dict, _check_globalopt, &ret);
+ if (ret) {
+ *op_errstr = gf_strdup ( "option specified is not a global option");
+ return -1;
+ }
+ ret = glusterd_validate_brickreconf (volinfo, val_dict, op_errstr);
+
+ if (ret) {
+ gf_log ("", GF_LOG_DEBUG,
+ "Could not Validate bricks");
+ goto out;
+ }
+
+ ret = validate_clientopts (volinfo, val_dict, op_errstr);
+ if (ret) {
+ gf_log ("", GF_LOG_DEBUG,
+ "Could not Validate client");
+ goto out;
+ }
+
+ ret = validate_nfsopts (volinfo, val_dict, op_errstr);
+
+
+out:
+ gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);
+ return ret;
+}
+
+static void
+_check_localopt (dict_t *this, char *key, data_t *value, void *ret_val)
+{
+ int *ret = NULL;
+
+ ret = ret_val;
+ if (*ret)
+ return;
+ if (!glusterd_check_localoption (key))
+ *ret = 1;
+}
+
int
glusterd_validate_reconfopts (glusterd_volinfo_t *volinfo, dict_t *val_dict,
char **op_errstr)
{
- int ret = -1;
-
- gf_log ("", GF_LOG_DEBUG, "Inside Validate reconfigure options");
+ int ret = 0;
+ dict_foreach (val_dict, _check_localopt, &ret);
+ if (ret) {
+ *op_errstr = gf_strdup ( "option specified is not a local option");
+ return -1;
+ }
ret = glusterd_validate_brickreconf (volinfo, val_dict, op_errstr);
if (ret) {
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.h b/xlators/mgmt/glusterd/src/glusterd-volgen.h
index 372832c7c86..4f4b4b73d33 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.h
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.h
@@ -43,4 +43,9 @@ int glusterd_delete_volfile (glusterd_volinfo_t *volinfo,
int glusterd_volinfo_get (glusterd_volinfo_t *volinfo, char *key, char **value);
+int glusterd_validate_globalopts (glusterd_volinfo_t *volinfo, dict_t *val_dict, char **op_errstr);
+
+int glusterd_validate_localopts (dict_t *val_dict, char **op_errstr);
+gf_boolean_t glusterd_check_globaloption (char *key);
+
#endif
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
index 81c888463cc..d98ddb1c6b7 100644
--- a/xlators/mgmt/glusterd/src/glusterd.h
+++ b/xlators/mgmt/glusterd/src/glusterd.h
@@ -85,6 +85,9 @@ struct glusterd_store_iter_ {
typedef struct glusterd_store_iter_ glusterd_store_iter_t;
+struct glusterd_volgen {
+ dict_t *dict;
+};
typedef struct {
struct _volfile_ctx *volfile;
pthread_mutex_t mutex;