diff options
| author | Kaushik BV <kaushikbv@gluster.com> | 2011-04-18 07:34:54 +0000 | 
|---|---|---|
| committer | Anand Avati <avati@gluster.com> | 2011-04-18 07:42:15 -0700 | 
| commit | c034f263c0ced77b6b8f806b4533a612631a9c77 (patch) | |
| tree | cc67357ddf5d22e0ec6cee358439f2f7a4d9ddab | |
| parent | 4d644dda668e5b55f3f9516e8552e689608b7ad7 (diff) | |
mgmt/glusterd: geo-rep config set/del restarts the geo-rep process so that it takes up the new configuration values
Signed-off-by: Kaushik BV <kaushikbv@gluster.com>
Signed-off-by: Anand Avati <avati@gluster.com>
BUG: 2777 (geo-replication config setting should have effect on already running sessions)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2777
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 82 | 
1 files changed, 69 insertions, 13 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 2d78449b079..688fec15281 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -4059,13 +4059,17 @@ stop_gsync (char *master, char *slave, char **op_errstr)          if (pfd == -2) {                  gf_log ("", GF_LOG_WARNING, GEOREP" stop validation "                          " failed"); -                *op_errstr = gf_strdup (GEOREP" stop internal error"); +                if (op_errstr) +                        *op_errstr = gf_strdup (GEOREP" stop internal error");                  ret = -1;                  goto out;          }          if (gsync_status_byfd (pfd) == -1) { +                ret = -1;                  gf_log ("", GF_LOG_WARNING, "gsyncd is not running"); -                *op_errstr = gf_strdup ("warning: gsyncd is not running"); +                if (op_errstr) +                        *op_errstr = gf_strdup ("warning: "GEOREP" session is" +                                                "not running");                  goto out;          } @@ -4094,8 +4098,6 @@ stop_gsync (char *master, char *slave, char **op_errstr)          }          ret = 0; -        *op_errstr = gf_strdup (GEOREP" stopped successfully"); -  out:          close (pfd);          return ret; @@ -4339,29 +4341,77 @@ glusterd_read_status_file (char *master, char *slave,  }  int -glusterd_gsync_configure (char *master, char *slave, -                 dict_t *dict, char **op_errstr) +glusterd_check_restart_gsync_session (glusterd_volinfo_t *volinfo, char *slave) +{ + +        int                    ret = 0; +        uuid_t                 uuid = {0, }; +        glusterd_conf_t        *priv = NULL; +        gf_boolean_t           is_running = _gf_false; + +        GF_ASSERT (volinfo); +        GF_ASSERT (slave); +        GF_ASSERT (THIS); +        GF_ASSERT (THIS->private); + +        priv = THIS->private; + +        ret = glusterd_gsync_get_uuid (slave, volinfo, uuid); +        if ((ret == 0) && (uuid_compare (priv->uuid, uuid) == 0)) { +                ret = glusterd_check_gsync_running_local (volinfo->volname, +                                                          slave, &is_running); +                if (ret) +                        goto out; + +                if (_gf_true == is_running) { +                        ret = stop_gsync (volinfo->volname, slave, NULL); +                        gf_log ("", GF_LOG_INFO, GEOREP " not running," +                                " retart the process"); +                } + +                ret = glusterd_start_gsync (volinfo->volname, slave, +                                            uuid_utoa(priv->uuid), NULL); +                if (ret) +                        goto out; +        } + + out: +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} + +int +glusterd_gsync_configure (glusterd_volinfo_t *volinfo, char *slave, +                          dict_t *dict, char **op_errstr)  {          int32_t         ret     = -1;          int32_t         config_type = 0; +        GF_ASSERT (volinfo); +        GF_ASSERT (slave); +        GF_ASSERT (op_errstr); +          ret = dict_get_int32 (dict, "config_type", &config_type);          if (ret < 0) { -                gf_log ("", GF_LOG_WARNING, "couldn't get the " -                        "config-type for %s %s", master, slave); +                gf_log ("", GF_LOG_WARNING, "couldn't get the config-type" +                        " for %s %s", volinfo->volname, slave);                  *op_errstr = gf_strdup ("configure command failed, "                                          "please check the log-file\n");                  goto out;          }          if (config_type == GF_GSYNC_OPTION_TYPE_CONFIG_SET) { -                ret = gsync_config_set (master, slave, dict, op_errstr); -                goto out; +                ret = gsync_config_set (volinfo->volname, slave, dict, +                                        op_errstr); +                if (ret) +                        goto out; +                goto config_done;          }          if (config_type == GF_GSYNC_OPTION_TYPE_CONFIG_DEL) { -                ret = gsync_config_del (master, slave, dict, op_errstr); -                goto out; +                ret = gsync_config_del (volinfo->volname, slave, dict, +                                        op_errstr); +                goto config_done;          }          if ((config_type == GF_GSYNC_OPTION_TYPE_CONFIG_GET_ALL) || @@ -4371,9 +4421,15 @@ glusterd_gsync_configure (char *master, char *slave,                  gf_log ("", GF_LOG_WARNING, "Invalid config type");                  *op_errstr = gf_strdup ("Invalid config type");                  ret = -1; +                goto out;          } + config_done: +        ret = glusterd_check_restart_gsync_session (volinfo, slave); +        if (ret) +                *op_errstr = gf_strdup (GEOREP" conig: Internal error");  out: +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);          return ret;  } @@ -4662,7 +4718,7 @@ glusterd_op_gsync_set (dict_t *dict, char **op_errstr, dict_t *rsp_dict)          }          if (type == GF_GSYNC_OPTION_TYPE_CONFIGURE) { -                ret = glusterd_gsync_configure (volname, slave, dict, +                ret = glusterd_gsync_configure (volinfo, slave, dict,                                                  op_errstr);                  goto out;          }  | 
