diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-shd-svc.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-shd-svc.c | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-shd-svc.c b/xlators/mgmt/glusterd/src/glusterd-shd-svc.c index f9f41898b39..0e664b5c786 100644 --- a/xlators/mgmt/glusterd/src/glusterd-shd-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-shd-svc.c @@ -15,6 +15,7 @@ #include "glusterd-volgen.h" #include "glusterd-svc-mgmt.h" #include "glusterd-shd-svc.h" +#include "glusterd-svc-helper.h" char *shd_svc_name = "glustershd"; @@ -182,5 +183,68 @@ out: int glusterd_shdsvc_reconfigure () { - return glusterd_svc_reconfigure (glusterd_shdsvc_create_volfile); + int ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *priv = NULL; + gf_boolean_t identical = _gf_false; + + this = THIS; + GF_VALIDATE_OR_GOTO (this->name, this, out); + + priv = this->private; + GF_VALIDATE_OR_GOTO (this->name, priv, out); + + if (glusterd_all_shd_compatible_volumes_stopped ()) + goto manager; + + /* + * Check both OLD and NEW volfiles, if they are SAME by size + * and cksum i.e. "character-by-character". If YES, then + * NOTHING has been changed, just return. + */ + ret = glusterd_svc_check_volfile_identical (priv->shd_svc.name, + build_shd_graph, + &identical); + if (ret) + goto out; + + if (identical) { + ret = 0; + goto out; + } + + /* + * They are not identical. Find out if the topology is changed + * OR just the volume options. If just the options which got + * changed, then inform the xlator to reconfigure the options. + */ + identical = _gf_false; /* RESET the FLAG */ + ret = glusterd_svc_check_topology_identical (priv->shd_svc.name, + build_shd_graph, + &identical); + if (ret) + goto out; + + /* Topology is not changed, but just the options. But write the + * options to shd volfile, so that shd will be reconfigured. + */ + if (identical) { + ret = glusterd_shdsvc_create_volfile (); + if (ret == 0) {/* Only if above PASSES */ + ret = glusterd_fetchspec_notify (THIS); + } + goto out; + } +manager: + /* + * shd volfile's topology has been changed. shd server needs + * to be RESTARTED to ACT on the changed volfile. + */ + ret = priv->shd_svc.manager (&(priv->shd_svc), NULL, + PROC_START_NO_WAIT); + +out: + gf_msg_debug (this->name, 0, "Returning %d", ret); + return ret; + } |