diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-scrub-svc.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-scrub-svc.c | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-scrub-svc.c b/xlators/mgmt/glusterd/src/glusterd-scrub-svc.c index b5c97850a75..3761dbadfd1 100644 --- a/xlators/mgmt/glusterd/src/glusterd-scrub-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-scrub-svc.c @@ -14,6 +14,7 @@ #include "glusterd-utils.h" #include "glusterd-volgen.h" #include "glusterd-scrub-svc.h" +#include "glusterd-svc-helper.h" char *scrub_svc_name = "scrub"; @@ -136,5 +137,71 @@ glusterd_scrubsvc_stop (glusterd_svc_t *svc, int sig) int glusterd_scrubsvc_reconfigure () { - return glusterd_svc_reconfigure (glusterd_scrubsvc_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_should_i_stop_bitd ()) + 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->scrub_svc.name, + build_scrub_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->scrub_svc.name, + build_scrub_graph, + &identical); + if (ret) + goto out; + + /* Topology is not changed, but just the options. But write the + * options to scrub volfile, so that scrub will be reconfigured. + */ + if (identical) { + ret = glusterd_scrubsvc_create_volfile (); + if (ret == 0) {/* Only if above PASSES */ + ret = glusterd_fetchspec_notify (THIS); + } + goto out; + } + +manager: + /* + * scrub volfile's topology has been changed. scrub server needs + * to be RESTARTED to ACT on the changed volfile. + */ + ret = priv->scrub_svc.manager (&(priv->scrub_svc), + NULL, + PROC_START_NO_WAIT); + +out: + gf_msg_debug (this->name, 0, "Returning %d", ret); + return ret; + } |