diff options
-rw-r--r-- | xlators/mgmt/glusterd/src/Makefile.am | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 187 |
2 files changed, 157 insertions, 32 deletions
diff --git a/xlators/mgmt/glusterd/src/Makefile.am b/xlators/mgmt/glusterd/src/Makefile.am index 326d8e63e88..2336000b5bc 100644 --- a/xlators/mgmt/glusterd/src/Makefile.am +++ b/xlators/mgmt/glusterd/src/Makefile.am @@ -16,7 +16,7 @@ AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\ -I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)\ -I$(rpclibdir) -L$(xlatordir)/ -I$(CONTRIBDIR)/rbtree -I$(top_srcdir)/rpc/xdr/src\ -I$(top_srcdir)/rpc/rpc-lib/src -I$(CONTRIBDIR)/uuid -DGFS_PREFIX=\"$(prefix)\" \ - -DDATADIR=\"$(localstatedir)\" + -DDATADIR=\"$(localstatedir)\" -DGSYNC_PREFIX=\"$(libexecdir)\" CLEANFILES = diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index fadafa6a5e1..3a2fbd44ccb 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -54,6 +54,8 @@ #define glusterd_op_start_volume_args_get(req, dict, volname, flags) \ glusterd_op_stop_volume_args_get (req, dict, volname, flags) +#define GSYNCD_PREFIX GSYNC_PREFIX"/python/syncdaemon/" + static struct list_head gd_op_sm_queue; pthread_mutex_t gd_op_sm_lock; glusterd_op_info_t opinfo = {{0},}; @@ -86,6 +88,20 @@ static char *glusterd_op_sm_event_names[] = { "GD_OP_EVENT_INVALID" }; +static char *gsync_opname[] = { + "gluster-command", + "gluster-log-file", + "gluster-log-level", + "log-file", + "log-level", + "remote-gsyncd", + "ssh-command", + "rsync-command", + "timeout", + "sync-jobs", + NULL +}; + static int glusterd_restart_brick_servers (glusterd_volinfo_t *); @@ -1915,6 +1931,87 @@ out: return ret; } +int +gsync_validate_config_type (int32_t config_type) +{ + switch (config_type) { + case GF_GSYNC_OPTION_TYPE_CONFIG_SET: + case GF_GSYNC_OPTION_TYPE_CONFIG_DEL: + case GF_GSYNC_OPTION_TYPE_CONFIG_GET: + case GF_GSYNC_OPTION_TYPE_CONFIG_GET_ALL:return 0; + default: return -1; + } + return 0; +} + +int +gsync_validate_config_option (dict_t *dict, int32_t config_type, + char **op_errstr) +{ + int ret = -1; + int i = 0; + char *op_name = NULL; + + if (config_type == GF_GSYNC_OPTION_TYPE_CONFIG_GET_ALL) + return 0; + + ret = dict_get_str (dict, "op_name", &op_name); + if (ret < 0) { + gf_log ("", GF_LOG_WARNING, "option not specified"); + *op_errstr = gf_strdup ("Please specify the option"); + goto out; + } + + i = 0; + while (gsync_opname[i] != NULL) { + if (strcmp (gsync_opname[i], op_name) == 0) { + ret = 0; + goto out; + } + i++; + } + + gf_log ("", GF_LOG_WARNING, "Invalid option"); + *op_errstr = gf_strdup ("Invalid option"); + + ret = -1; + +out: + return ret; +} + +int +gsync_verify_config_options (dict_t *dict, char **op_errstr) +{ + int ret = -1; + int config_type = 0; + + GF_VALIDATE_OR_GOTO ("gsync", dict, out); + GF_VALIDATE_OR_GOTO ("gsync", op_errstr, out); + + ret = dict_get_int32 (dict, "config_type", &config_type); + if (ret < 0) { + gf_log ("", GF_LOG_WARNING, "config type is missing"); + *op_errstr = gf_strdup ("config-type missing"); + goto out; + } + + ret = gsync_validate_config_type (config_type); + if (ret == -1) { + gf_log ("", GF_LOG_WARNING, "Invalid config type"); + *op_errstr = gf_strdup ("Invalid config type"); + goto out; + } + + ret = gsync_validate_config_option (dict, config_type, op_errstr); + if (ret < 0) + goto out; + + ret = 0; +out: + return ret; +} + static int glusterd_op_stage_gsync_set (gd1_mgmt_stage_op_req *req, char **op_errstr) { @@ -2021,6 +2118,12 @@ glusterd_op_stage_gsync_set (gd1_mgmt_stage_op_req *req, char **op_errstr) goto out; } + if (type == GF_GSYNC_OPTION_TYPE_CONFIGURE) { + ret = gsync_verify_config_options (dict, op_errstr); + if (ret < 0) + goto out; + } + ret = 0; out: if (dict) @@ -3577,17 +3680,45 @@ out: } int +gsync_get_pid_file (char *pidfile, char *master, char *slave) +{ + int ret = -1; + int i = 0; + char str[256] = {0, }; + + GF_VALIDATE_OR_GOTO ("gsync", pidfile, out); + GF_VALIDATE_OR_GOTO ("gsync", master, out); + GF_VALIDATE_OR_GOTO ("gsync", slave, out); + + i = 0; + //change '/' to '-' + while (slave[i]) { + (slave[i] == '/') ? (str[i] = '-') : (str[i] = slave[i]); + i++; + } + + ret = snprintf (pidfile, 1024, "/etc/glusterd/gsync/%s/%s.pid", + master, str); + if (ret <= 0) + ret = -1; + + ret = 0; +out: + return 0; +} + +int start_gsync (char *master, char *slave, char **op_errstr) { int32_t ret = -1; char cmd[1024] = {0,}; char pidfile[1024] = {0,}; - ret = snprintf (pidfile, 1024, "/etc/glusterd/gsync/%s/%s.pid", - master, slave); - - if (ret <= 0) { + ret = gsync_get_pid_file (pidfile, master, slave); + if (ret == -1) { ret = -1; + gf_log ("", GF_LOG_WARNING, "failed to construct the " + "pidfile string"); goto out; } @@ -3601,7 +3732,7 @@ start_gsync (char *master, char *slave, char **op_errstr) goto out; } - ret = snprintf (cmd, 1024, "mkdir -p /etc/glusterd/gsyncd/%s", + ret = snprintf (cmd, 1024, "mkdir -p /etc/glusterd/gsync/%s", master); if (ret <= 0) { ret = -1; @@ -3609,6 +3740,7 @@ start_gsync (char *master, char *slave, char **op_errstr) "pid path"); goto out; } + ret = system (cmd); if (ret == -1) { gf_log ("", GF_LOG_WARNING, "failed to create the " @@ -3616,9 +3748,9 @@ start_gsync (char *master, char *slave, char **op_errstr) goto out; } - ret = snprintf (cmd, 1024, GFS_PREFIX - "/sbin/gsyncd/gsyncd.py %s %s --config-set " - "-p %s", master, slave, pidfile); + memset (cmd, 0, sizeof (cmd)); + ret = snprintf (cmd, 1024, GSYNCD_PREFIX "gsyncd.py %s %s " + "--config-set pid-file %s", master, slave, pidfile); if (ret <= 0) { ret = -1; gf_log ("", GF_LOG_WARNING, "failed to construct the " @@ -3633,8 +3765,8 @@ start_gsync (char *master, char *slave, char **op_errstr) goto out; } - ret = snprintf (cmd, 1024, GFS_PREFIX - "/sbin/gsyncd/gsyncd.py " + memset (cmd, 0, sizeof (cmd)); + ret = snprintf (cmd, 1024, GSYNCD_PREFIX "/gsyncd.py " "%s %s", master, slave); if (ret <= 0) { ret = -1; @@ -3672,11 +3804,11 @@ stop_gsync (char *master, char *slave, char **op_errstr) goto out; } - ret = snprintf (pidfile, 1024, "/etc/glusterd/gsync/%s/%s.pid", - master, slave); - if (ret <= 0) { + //change '/' to '-' + ret = gsync_get_pid_file (pidfile, master, slave); + if (ret == -1) { ret = -1; - gf_log ("", GF_LOG_WARNING, "failed to create the pidfile"); + gf_log ("", GF_LOG_WARNING, "failed to create the pidfile string"); goto out; } @@ -3691,7 +3823,7 @@ stop_gsync (char *master, char *slave, char **op_errstr) ret = read (fileno(file), buf, 1024); if (ret > 0) { pid = strtol (buf, NULL, 10); - ret = kill (pid, SIGTERM); + ret = kill (pid, SIGKILL); if (ret) { gf_log ("", GF_LOG_WARNING, "failed to stop gsyncd"); @@ -3737,10 +3869,8 @@ gsync_config_set (char *master, char *slave, goto out; } - ret = snprintf (cmd, 1024, GFS_PREFIX - "/sbin/gsyncd/gsyncd.py %s %s " - "--config-set %s %s", master, - slave, op_name, op_value); + ret = snprintf (cmd, 1024, GSYNCD_PREFIX "/gsyncd.py %s %s " + "--config-set -%s %s", master, slave, op_name, op_value); if (ret <= 0) { gf_log ("", GF_LOG_WARNING, "failed to " "construct the gsyncd command"); @@ -3787,10 +3917,8 @@ gsync_config_del (char *master, char *slave, goto out; } - ret = snprintf (cmd, 4096, GFS_PREFIX - "/sbin/gsyncd/gsyncd.py %s %s " - "--config-del %s", master, - slave, op_name); + ret = snprintf (cmd, 4096, GSYNCD_PREFIX "/gsyncd.py %s %s " + "config-del %s", master, slave, op_name); if (ret <= 0) { gf_log ("", GF_LOG_WARNING, "failed to " "construct the gsyncd command"); @@ -3835,10 +3963,8 @@ gsync_config_get (char *master, char *slave, goto out; } - ret = snprintf (cmd, 4096, GFS_PREFIX - "/sbin/gsyncd/gsyncd.py %s %s " - "--config-get %s", master, - slave, op_name); + ret = snprintf (cmd, 4096, GSYNCD_PREFIX "/gsyncd.py %s %s " + "config-get %s", master, slave, op_name); if (ret <= 0) { gf_log ("", GF_LOG_WARNING, "failed to " "construct the gsyncd command"); @@ -3870,9 +3996,8 @@ gsync_config_get_all (char *master, char *slave, char **op_errstr) int32_t ret = -1; char cmd[1024] = {0,}; - ret = snprintf (cmd, 4096, GFS_PREFIX - "/sbin/gsyncd/gsyncd.py %s %s " - "--config-get-all", master, slave); + ret = snprintf (cmd, 4096, GSYNCD_PREFIX "/gsyncd.py %s %s " + "config-get-all", master, slave); if (ret <= 0) { gf_log ("", GF_LOG_WARNING, "failed to " "construct the gsyncd command " @@ -4086,7 +4211,7 @@ glusterd_op_gsync_set (gd1_mgmt_stage_op_req *req) ret = glusterd_set_marker_gsync (master, "off"); if (ret != 0) { gf_log ("", GF_LOG_WARNING, "marker stop failed"); - op_errstr = gf_strdup ("gsync start failed"); + op_errstr = gf_strdup ("gsync stop failed"); ret = -1; goto out; } |