summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-scrub-svc.c
diff options
context:
space:
mode:
authoranand <anekkunt@redhat.com>2015-05-20 19:52:11 +0530
committerAtin Mukherjee <amukherj@redhat.com>2015-08-06 23:22:53 -0700
commit7255febab2c38cc89b71f2519a20d10f53586000 (patch)
treeca60d73af2f7566a226b24d3fc9e017a363c66e7 /xlators/mgmt/glusterd/src/glusterd-scrub-svc.c
parent7298b622ab39c2e78d6d745ae8b6e8413e1d9f1a (diff)
glusterd: Stop/restart/notify to daemons(svcs) during reset/set on a volume
problem : Reset/set commands were not working properly. reset command returns success but it not sending notification to svcs if corresponding graph modified. Fix: Whenever reset/set command issued, generate the temp graph and compare with original graph and do the fallowing actions 1.) If both graph are identical nothing to do with svcs. 2.) If any changes in graph topology restart/stop service by calling svc manager. 3) If changes in options send notify signal by calling glusterd_fetchspec_notify. Change-Id: I852c4602eafed1ae6e6a02424814fe3a83e3d4c7 BUG: 1209329 Signed-off-by: anand <anekkunt@redhat.com> Reviewed-on: http://review.gluster.org/10850 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-scrub-svc.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-scrub-svc.c69
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;
+
}