diff options
author | Venky Shankar <vshankar@redhat.com> | 2015-03-13 22:00:22 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2015-03-24 10:26:15 -0700 |
commit | 31f841d6b35c242942b6bdcbfdc83cf548d5235a (patch) | |
tree | 450558d7e4b1788bb254b2117fef8cdc9b6f2033 | |
parent | 84db9f8271f150fbb6024186f7f681e941731280 (diff) |
cli/glusterd: CLI interface for BitRot detection
* BitRot enable/disable CLI per volume
* Volfile generation for Scrubber
* Relevant glusterd infrastructure
Change-Id: I1212af63f93ecc52b22ee6da920e1664f66a1e39
BUG: 1170075
Original-Author: Raghavendra Bhat <raghavendra@redhat.com>
Original-Author: Venky Shankar <vshankar@redhat.com>
Original-Author: Gaurav Kumar Garg <ggarg@redhat.com>
Original-Author: Anand Nekkunti <anekkunt@redhat.com>
Reviewed-on: http://review.gluster.org/9986
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
-rw-r--r-- | xlators/mgmt/glusterd/src/Makefile.am | 4 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-bitd-svc.c | 7 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-bitrot.c | 48 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-scrub-svc.c | 119 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-scrub-svc.h | 47 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-svc-helper.c | 18 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 98 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.h | 4 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 17 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 4 |
10 files changed, 337 insertions, 29 deletions
diff --git a/xlators/mgmt/glusterd/src/Makefile.am b/xlators/mgmt/glusterd/src/Makefile.am index 90afa4f298b..58a1d2fdb2a 100644 --- a/xlators/mgmt/glusterd/src/Makefile.am +++ b/xlators/mgmt/glusterd/src/Makefile.am @@ -16,7 +16,7 @@ glusterd_la_SOURCES = glusterd.c glusterd-handler.c glusterd-sm.c \ glusterd-proc-mgmt.c glusterd-svc-mgmt.c glusterd-shd-svc.c \ glusterd-nfs-svc.c glusterd-quotad-svc.c glusterd-svc-helper.c \ glusterd-conn-helper.c glusterd-snapd-svc.c glusterd-snapd-svc-helper.c \ - glusterd-bitd-svc.c + glusterd-bitd-svc.c glusterd-scrub-svc.c glusterd_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \ @@ -37,7 +37,7 @@ noinst_HEADERS = glusterd.h glusterd-utils.h glusterd-op-sm.h \ glusterd-svc-mgmt.h glusterd-shd-svc.h glusterd-nfs-svc.h \ glusterd-quotad-svc.h glusterd-svc-helper.h glusterd-snapd-svc.h \ glusterd-snapd-svc-helper.h glusterd-rcu.h glusterd-bitd-svc.h \ - $(CONTRIBDIR)/userspace-rcu/rculist-extra.h + glusterd-scrub-svc.h $(CONTRIBDIR)/userspace-rcu/rculist-extra.h AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \ -I$(rpclibdir) -I$(CONTRIBDIR)/rbtree \ diff --git a/xlators/mgmt/glusterd/src/glusterd-bitd-svc.c b/xlators/mgmt/glusterd/src/glusterd-bitd-svc.c index ab06ab64db0..d007f3a0a0d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-bitd-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-bitd-svc.c @@ -70,10 +70,10 @@ out: int glusterd_bitdsvc_manager (glusterd_svc_t *svc, void *data, int flags) { - int ret = -1; + int ret = -EINVAL; - if (glusterd_are_all_volumes_stopped ()) { - ret = svc->stop (svc, SIGKILL); + if (glusterd_all_volumes_with_bitrot_stopped ()) { + ret = svc->stop (svc, SIGTERM); } else { ret = glusterd_bitdsvc_create_volfile (); if (ret) @@ -91,6 +91,7 @@ glusterd_bitdsvc_manager (glusterd_svc_t *svc, void *data, int flags) if (ret) goto out; } + out: gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret); diff --git a/xlators/mgmt/glusterd/src/glusterd-bitrot.c b/xlators/mgmt/glusterd/src/glusterd-bitrot.c index 44fefe82b7e..5bd906312a4 100644 --- a/xlators/mgmt/glusterd/src/glusterd-bitrot.c +++ b/xlators/mgmt/glusterd/src/glusterd-bitrot.c @@ -192,6 +192,27 @@ out: return ret; } +gf_boolean_t +glusterd_all_volumes_with_bitrot_stopped () +{ + glusterd_conf_t *conf = THIS->private; + glusterd_volinfo_t *volinfo = NULL; + gf_boolean_t stopped = _gf_true; + + cds_list_for_each_entry (volinfo, &conf->volumes, vol_list) { + if (!glusterd_is_bitrot_enabled (volinfo)) + continue; + else if (volinfo->status != GLUSTERD_STATUS_STARTED) + continue; + else { + stopped = _gf_false; + break; + } + } + + return stopped; +} + static int glusterd_manage_bitrot (int opcode) { @@ -207,28 +228,13 @@ glusterd_manage_bitrot (int opcode) switch (opcode) { case GF_BITROT_OPTION_TYPE_ENABLE: - /* TO DO: - * Start bitd service. once bitd volfile generation patch - * merge or this patch become dependent of bitd volfile - * generation patch below comment will remove. - * http://review.gluster.org/#/c/9710/ - */ - /*ret = priv->bitd_svc.manager (&(priv->bitd_svc), - NULL, PROC_START);*/ case GF_BITROT_OPTION_TYPE_DISABLE: - - /* TO DO: - * Stop bitd service. once bitd volfile generation patch - * merge or this patch become dependent of bitd volfile - * generation patch below comment will remove. - * http://review.gluster.org/#/c/9710/ - */ - - /*if (glusterd_all_volumes_with_bitrot_stopped ()) - ret = glusterd_svc_stop (&(priv->bitd_svc), - SIGTERM); - */ - ret = 0; + ret = priv->bitd_svc.manager (&(priv->bitd_svc), + NULL, PROC_START_NO_WAIT); + if (ret) + break; + ret = priv->scrub_svc.manager (&(priv->scrub_svc), NULL, + PROC_START_NO_WAIT); break; default: ret = 0; diff --git a/xlators/mgmt/glusterd/src/glusterd-scrub-svc.c b/xlators/mgmt/glusterd/src/glusterd-scrub-svc.c new file mode 100644 index 00000000000..bd1ed390f46 --- /dev/null +++ b/xlators/mgmt/glusterd/src/glusterd-scrub-svc.c @@ -0,0 +1,119 @@ +/* + Copyright (c) 2006-2012 Red Hat, Inc. <http://www.redhat.com> + This file is part of GlusterFS. + + This file is licensed to you under your choice of the GNU Lesser + General Public License, version 3 or any later version (LGPLv3 or + later), or the GNU General Public License, version 2 (GPLv2), in all + cases as published by the Free Software Foundation. +*/ + +#include "globals.h" +#include "run.h" +#include "glusterd.h" +#include "glusterd-utils.h" +#include "glusterd-volgen.h" +#include "glusterd-scrub-svc.h" + +char *scrub_svc_name = "scrub"; + +int +glusterd_scrubsvc_init (glusterd_svc_t *svc) +{ + return glusterd_svc_init (svc, scrub_svc_name, + glusterd_scrubsvc_manager, + glusterd_scrubsvc_start, + glusterd_scrubsvc_stop); +} + +static int +glusterd_scrubsvc_create_volfile () +{ + char filepath[PATH_MAX] = {0,}; + int ret = -1; + glusterd_conf_t *conf = NULL; + dict_t *mod_dict = NULL; + xlator_t *this = NULL; + + this = THIS; + conf = this->private; + GF_ASSERT (conf); + + + mod_dict = dict_new (); + if (!mod_dict) { + gf_log (this->name, GF_LOG_ERROR, "failed to allocate new " + "dict"); + goto out; + } + + ret = dict_set_uint32 (mod_dict, "trusted-client", GF_CLIENT_TRUSTED); + if (ret) + goto free_dict; + + glusterd_svc_build_volfile_path (scrub_svc_name, conf->workdir, + filepath, sizeof (filepath)); + + ret = glusterd_create_global_volfile (build_scrub_graph, + filepath, mod_dict); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to create volfile"); + goto free_dict; + } + +free_dict: + dict_unref (mod_dict); +out: + gf_log (this->name, GF_LOG_DEBUG, "Returning %d", ret); + + return ret; +} + +int +glusterd_scrubsvc_manager (glusterd_svc_t *svc, void *data, int flags) +{ + int ret = -EINVAL; + + if (glusterd_all_volumes_with_bitrot_stopped ()) { + ret = svc->stop (svc, SIGTERM); + } else { + ret = glusterd_scrubsvc_create_volfile (); + if (ret) + goto out; + + ret = svc->stop (svc, SIGKILL); + if (ret) + goto out; + + ret = svc->start (svc, flags); + if (ret) + goto out; + + ret = glusterd_conn_connect (&(svc->conn)); + if (ret) + goto out; + } + +out: + gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret); + + return ret; +} + +int +glusterd_scrubsvc_start (glusterd_svc_t *svc, int flags) +{ + return glusterd_svc_start (svc, flags, NULL); +} + +int +glusterd_scrubsvc_stop (glusterd_svc_t *svc, int sig) +{ + return glusterd_svc_stop (svc, sig); +} + +int +glusterd_scrubsvc_reconfigure () +{ + return glusterd_svc_reconfigure (glusterd_scrubsvc_create_volfile); +} diff --git a/xlators/mgmt/glusterd/src/glusterd-scrub-svc.h b/xlators/mgmt/glusterd/src/glusterd-scrub-svc.h new file mode 100644 index 00000000000..e2e3b0d2ba2 --- /dev/null +++ b/xlators/mgmt/glusterd/src/glusterd-scrub-svc.h @@ -0,0 +1,47 @@ +/* + Copyright (c) 2006-2012 Red Hat, Inc. <http://www.redhat.com> + This file is part of GlusterFS. + + This file is licensed to you under your choice of the GNU Lesser + General Public License, version 3 or any later version (LGPLv3 or + later), or the GNU General Public License, version 2 (GPLv2), in all + cases as published by the Free Software Foundation. +*/ + +#ifndef _GLUSTERD_SCRUB_SVC_H_ +#define _GLUSTERD_SCRUB_SVC_H_ + +#ifndef _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif + +#include "glusterd-svc-mgmt.h" + +typedef struct glusterd_scrubsvc_ glusterd_scrubsvc_t; + +struct glusterd_scrubsvc_{ + glusterd_svc_t svc; + gf_store_handle_t *handle; +}; + +int +glusterd_scrubsvc_init (glusterd_svc_t *svc); + +int +glusterd_scrubsvc_manager (glusterd_svc_t *svc, void *data, int flags); + +int +glusterd_scrubsvc_start (glusterd_svc_t *svc, int flags); + +int +glusterd_scrubsvc_stop (glusterd_svc_t *svc, int sig); + +int +glusterd_scrubsvc_reconfigure (); + +void +glusterd_scrubsvc_build_volfile_path (char *server, char *workdir, + char *volfile, size_t len); + +#endif diff --git a/xlators/mgmt/glusterd/src/glusterd-svc-helper.c b/xlators/mgmt/glusterd/src/glusterd-svc-helper.c index 39384545c86..8ee715f1a94 100644 --- a/xlators/mgmt/glusterd/src/glusterd-svc-helper.c +++ b/xlators/mgmt/glusterd/src/glusterd-svc-helper.c @@ -18,6 +18,7 @@ #include "glusterd-quotad-svc.h" #include "glusterd-nfs-svc.h" #include "glusterd-bitd-svc.h" +#include "glusterd-scrub-svc.h" int glusterd_svcs_reconfigure (glusterd_volinfo_t *volinfo) @@ -55,6 +56,10 @@ glusterd_svcs_reconfigure (glusterd_volinfo_t *volinfo) ret = glusterd_bitdsvc_reconfigure (); if (ret) goto out; + + ret = glusterd_scrubsvc_reconfigure (); + if (ret) + goto out; out: return ret; } @@ -87,6 +92,9 @@ glusterd_svcs_stop () ret = glusterd_svc_stop (&(priv->bitd_svc), SIGTERM); if (ret) goto out; + + ret = glusterd_svc_stop (&(priv->scrub_svc), SIGTERM); + out: return ret; } @@ -128,12 +136,18 @@ glusterd_svcs_manager (glusterd_volinfo_t *volinfo) if (ret) goto out; - ret = conf->bitd_svc.manager (&(conf->bitd_svc), volinfo, - PROC_START_NO_WAIT); + ret = conf->bitd_svc.manager (&(conf->bitd_svc), NULL, + PROC_START_NO_WAIT); if (ret == -EINVAL) ret = 0; if (ret) goto out; + + ret = conf->scrub_svc.manager (&(conf->scrub_svc), NULL, + PROC_START_NO_WAIT); + if (ret == -EINVAL) + ret = 0; + out: return ret; } diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index ea00eea432f..65f446e8548 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -1670,7 +1670,6 @@ static int brick_graph_add_acl (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, dict_t *set_dict, glusterd_brickinfo_t *brickinfo) { - xlator_t *xl = NULL; int ret = -1; @@ -4751,6 +4750,99 @@ build_bitd_graph (volgen_graph_t *graph, dict_t *mod_dict) if (voliter->status != GLUSTERD_STATUS_STARTED) continue; + if (!glusterd_is_bitrot_enabled (voliter)) + continue; + + memset (transt, '\0', 16); + + get_transport_type (voliter, set_dict, transt, _gf_false); + if (!strcmp (transt, "tcp,rdma")) + strcpy (transt, "tcp"); + + + list_for_each_entry (brickinfo, &voliter->bricks, brick_list) { + if (!glusterd_is_local_brick (this, voliter, brickinfo)) + continue; + xl = volgen_graph_build_client (graph, voliter, + brickinfo->hostname, + brickinfo->path, + brickinfo->brick_id, transt, + set_dict); + if (!xl) { + ret = -1; + goto out; + } + + count++; + } + } + + bitd_xl = volgen_graph_add_nolink (graph, br_args[0], br_args[1]); + if (!bitd_xl) { + ret = -1; + goto out; + } + + txl = first_of (graph); + for (trav = txl; count; trav = trav->next) + count--; + + for (; trav != txl; trav = trav->prev) { + ret = volgen_xlator_link (bitd_xl, trav); + if (ret) + goto out; + } + + ret = 0; + +out: + if (set_dict) + dict_unref (set_dict); + + gf_log(this->name, GF_LOG_DEBUG, "Returning %d", ret); + + return ret; +} + +int +build_scrub_graph (volgen_graph_t *graph, dict_t *mod_dict) +{ + volgen_graph_t cgraph = {0}; + glusterd_volinfo_t *voliter = NULL; + xlator_t *this = NULL; + glusterd_conf_t *priv = NULL; + dict_t *set_dict = NULL; + int ret = 0; + xlator_t *bitd_xl = NULL; + xlator_t *xl = NULL; + xlator_t *trav = NULL; + xlator_t *txl = NULL; + char *skey = NULL; + char transt[16] = {0,}; + glusterd_brickinfo_t *brickinfo = NULL; + char *br_args[] = {"features/bit-rot", + "bit-rot"}; + int32_t count = 0; + + this = THIS; + GF_ASSERT (this); + + priv = this->private; + GF_ASSERT (priv); + + set_dict = dict_new (); + if (!set_dict) { + ret = -ENOMEM; + goto out; + } + + if (mod_dict) + dict_copy (mod_dict, set_dict); + + list_for_each_entry (voliter, &priv->volumes, vol_list) { + if (voliter->status != GLUSTERD_STATUS_STARTED) + continue; + memset (transt, '\0', 16); get_transport_type (voliter, set_dict, transt, _gf_false); @@ -4787,6 +4879,10 @@ build_bitd_graph (volgen_graph_t *graph, dict_t *mod_dict) goto out; } + ret = xlator_set_option (bitd_xl, "scrubber", "true"); + if (ret) + goto out; + txl = first_of (graph); for (trav = txl; count; trav = trav->next) count--; diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.h b/xlators/mgmt/glusterd/src/glusterd-volgen.h index 93381fd03eb..02f8df0cf7d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.h +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.h @@ -34,6 +34,7 @@ #define VKEY_FEATURES_QUOTA "features.quota" #define VKEY_FEATURES_TRASH "features.trash" #define VKEY_FEATURES_BITROT "features.bitrot" +#define VKEY_FEATURES_SCRUB "features.scrub" #define AUTH_ALLOW_MAP_KEY "auth.allow" #define AUTH_REJECT_MAP_KEY "auth.reject" @@ -185,6 +186,9 @@ int build_bitd_graph (volgen_graph_t *graph, dict_t *mod_dict); int +build_scrub_graph (volgen_graph_t *graph, dict_t *mod_dict); + +int glusterd_delete_volfile (glusterd_volinfo_t *volinfo, glusterd_brickinfo_t *brickinfo); int diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index 223ee98d0a4..6f37338ee09 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -42,6 +42,7 @@ #include "glusterd-shd-svc.h" #include "glusterd-nfs-svc.h" #include "glusterd-bitd-svc.h" +#include "glusterd-scrub-svc.h" #include "glusterd-quotad-svc.h" #include "glusterd-snapd-svc.h" #include "common-utils.h" @@ -1228,6 +1229,13 @@ glusterd_svc_init_all () } gf_log (THIS->name, GF_LOG_DEBUG, "BitD service initialized"); + ret = glusterd_scrubsvc_init (&(priv->scrub_svc)); + if (ret) { + gf_log (THIS->name, GF_LOG_ERROR, "Failed to initialized scrub " + "service"); + goto out; + } + gf_log (THIS->name, GF_LOG_DEBUG, "scrub service initialized"); out: return ret; @@ -1397,6 +1405,15 @@ init (xlator_t *this) exit (1); } + snprintf (storedir, PATH_MAX, "%s/scrub", workdir); + ret = mkdir (storedir, 0777); + if ((-1 == ret) && (errno != EEXIST)) { + gf_log (this->name, GF_LOG_CRITICAL, + "Unable to create scrub directory %s" + " ,errno = %d", storedir, errno); + exit (1); + } + snprintf (storedir, PATH_MAX, "%s/glustershd", workdir); ret = mkdir (storedir, 0777); if ((-1 == ret) && (errno != EEXIST)) { diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index e7a4a13d3ec..0de34474cb8 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -135,6 +135,7 @@ typedef struct { glusterd_svc_t shd_svc; glusterd_svc_t nfs_svc; glusterd_svc_t bitd_svc; + glusterd_svc_t scrub_svc; glusterd_svc_t quotad_svc; struct pmap_registry *pmap; struct cds_list_head volumes; @@ -1099,4 +1100,7 @@ glusterd_add_brick_status_to_dict (dict_t *dict, glusterd_volinfo_t *volinfo, int32_t glusterd_handle_snap_limit (dict_t *dict, dict_t *rsp_dict); +gf_boolean_t +glusterd_all_volumes_with_bitrot_stopped (); + #endif |