summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPranith Kumar K <pkarampu@redhat.com>2016-03-17 09:32:17 +0530
committerJeff Darcy <jdarcy@redhat.com>2016-04-04 17:39:46 -0700
commitd65419677cf784599d4352d94f626823f895a18b (patch)
tree63d1ddcc864c11d151e267f490bdd13f94504a56
parentc76a1690bbd909b1c2dd2c495e2a8352d599b14b (diff)
cluster/afr: Use parallel dir scan functionality
BUG: 1221737 Change-Id: I0ed71a72f0e33bd733723e00a01cf28378c5534e Signed-off-by: Pranith Kumar K <pkarampu@redhat.com> Reviewed-on: http://review.gluster.org/13755 NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.com> Smoke: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
-rw-r--r--xlators/cluster/afr/src/afr-self-heald.c40
-rw-r--r--xlators/cluster/afr/src/afr-self-heald.h2
-rw-r--r--xlators/cluster/afr/src/afr.c29
-rw-r--r--xlators/cluster/afr/src/afr.h1
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volume-set.c11
5 files changed, 70 insertions, 13 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heald.c b/xlators/cluster/afr/src/afr-self-heald.c
index 9439bba63ff..1ae4f18e764 100644
--- a/xlators/cluster/afr/src/afr-self-heald.c
+++ b/xlators/cluster/afr/src/afr-self-heald.c
@@ -315,14 +315,18 @@ afr_shd_selfheal (struct subvol_healer *healer, int child, uuid_t gfid)
ret = afr_selfheal (this, gfid);
- if (ret == -EIO) {
- eh = shd->split_brain;
- crawl_event->split_brain_count++;
- } else if (ret < 0) {
- crawl_event->heal_failed_count++;
- } else if (ret == 0) {
- crawl_event->healed_count++;
- }
+ LOCK (&priv->lock);
+ {
+ if (ret == -EIO) {
+ eh = shd->split_brain;
+ crawl_event->split_brain_count++;
+ } else if (ret < 0) {
+ crawl_event->heal_failed_count++;
+ } else if (ret == 0) {
+ crawl_event->healed_count++;
+ }
+ }
+ UNLOCK (&priv->lock);
if (eh) {
shd_event = GF_CALLOC (1, sizeof(*shd_event),
@@ -425,6 +429,7 @@ afr_shd_index_sweep (struct subvol_healer *healer, char *vgfid)
afr_private_t *priv = NULL;
int ret = 0;
xlator_t *subvol = NULL;
+ dict_t *xdata = NULL;
priv = healer->this->private;
subvol = priv->children[healer->subvol];
@@ -434,17 +439,28 @@ afr_shd_index_sweep (struct subvol_healer *healer, char *vgfid)
gf_msg (healer->this->name, GF_LOG_WARNING,
0, AFR_MSG_INDEX_DIR_GET_FAILED,
"unable to get index-dir on %s", subvol->name);
- return -errno;
+ ret = -errno;
+ goto out;
}
- ret = syncop_dir_scan (subvol, &loc, GF_CLIENT_PID_SELF_HEALD,
- healer, afr_shd_index_heal);
+ xdata = dict_new ();
+ if (!xdata || dict_set_int32 (xdata, "get-gfid-type", 1)) {
+ ret = -ENOMEM;
+ goto out;
+ }
- loc_wipe (&loc);
+ ret = syncop_mt_dir_scan (subvol, &loc, GF_CLIENT_PID_SELF_HEALD,
+ healer, afr_shd_index_heal, xdata,
+ priv->shd.max_threads, priv->shd.wait_qlength);
if (ret == 0)
ret = healer->crawl_event.healed_count;
+out:
+ loc_wipe (&loc);
+
+ if (xdata)
+ dict_unref (xdata);
return ret;
}
diff --git a/xlators/cluster/afr/src/afr-self-heald.h b/xlators/cluster/afr/src/afr-self-heald.h
index 58b088e4cd7..f591515669c 100644
--- a/xlators/cluster/afr/src/afr-self-heald.h
+++ b/xlators/cluster/afr/src/afr-self-heald.h
@@ -56,6 +56,8 @@ typedef struct {
eh_t *split_brain;
eh_t **statistics;
+ uint32_t max_threads;
+ uint32_t wait_qlength;
} afr_self_heald_t;
diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c
index 2c7e69aae3b..6e59fd46328 100644
--- a/xlators/cluster/afr/src/afr.c
+++ b/xlators/cluster/afr/src/afr.c
@@ -217,6 +217,12 @@ reconfigure (xlator_t *this, dict_t *options)
GF_OPTION_RECONF ("consistent-metadata", priv->consistent_metadata,
options, bool, out);
+ GF_OPTION_RECONF ("shd-max-threads", priv->shd.max_threads,
+ options, uint32, out);
+
+ GF_OPTION_RECONF ("shd-wait-qlength", priv->shd.wait_qlength,
+ options, uint32, out);
+
priv->did_discovery = _gf_false;
ret = 0;
@@ -329,6 +335,11 @@ init (xlator_t *this)
fav_child->name, fav_child->name);
}
+ GF_OPTION_INIT ("shd-max-threads", priv->shd.max_threads,
+ uint32, out);
+
+ GF_OPTION_INIT ("shd-wait-qlength", priv->shd.wait_qlength,
+ uint32, out);
GF_OPTION_INIT ("background-self-heal-count",
priv->background_self_heal_count, uint32, out);
@@ -850,5 +861,23 @@ struct volume_options options[] = {
.type = GF_OPTION_TYPE_INT,
.description = "subset of child_count. Has to be 0 or 1."
},
+ { .key = {"shd-max-threads"},
+ .type = GF_OPTION_TYPE_INT,
+ .min = 1,
+ .max = 64,
+ .default_value = "1",
+ .description = "Maximum number of threads SHD can use per local "
+ "brick. This can substantially lower heal times, "
+ "but can also crush your bricks if you don't have "
+ "the storage hardware to support this."
+ },
+ { .key = {"shd-wait-qlength"},
+ .type = GF_OPTION_TYPE_INT,
+ .min = 1,
+ .max = 655536,
+ .default_value = "1024",
+ .description = "This option can be used to control number of heals"
+ " that can wait in SHD per subvolume",
+ },
{ .key = {NULL} },
};
diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h
index 56682b47a56..7a99e70c80e 100644
--- a/xlators/cluster/afr/src/afr.h
+++ b/xlators/cluster/afr/src/afr.h
@@ -139,7 +139,6 @@ typedef struct _afr_private {
/* pump dependencies */
void *pump_private;
gf_boolean_t use_afr_in_pump;
-
} afr_private_t;
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c
index 34fcde4e6ba..db29881173e 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c
@@ -2759,6 +2759,17 @@ struct volopt_map_entry glusterd_volopt_map[] = {
.flags = OPT_FLAG_XLATOR_OPT,
.type = NO_DOC,
},
+ { .key = "cluster.shd-max-threads",
+ .voltype = "cluster/replicate",
+ .op_version = GD_OP_VERSION_3_7_10,
+ .flags = OPT_FLAG_CLIENT_OPT
+ },
+ { .key = "cluster.shd-wait-qlength",
+ .voltype = "cluster/replicate",
+ .op_version = GD_OP_VERSION_3_7_10,
+ .flags = OPT_FLAG_CLIENT_OPT
+ },
+
{ .key = NULL
}
};