From 46920e3bd38d9ae7c1910d0bd83eff309ab20c66 Mon Sep 17 00:00:00 2001 From: Ashish Pandey Date: Fri, 4 Mar 2016 13:05:09 +0530 Subject: cluster/ec: Provide an option to enable/disable eager lock Problem: If a fop takes lock, and completes its operation, it waits for 1 second before releasing the lock. However, If ec find any lock contention within this time period, it release the lock immediately before time expires. As we take lock on first brick, for few operations, like read, it might happen that discovery of lock contention might take long time and can degrades the performance. Solution: Provide an option to enable/disable eager lock. If eager lock is disabled, lock will be released as soon as fop completes. gluster v set disperse.eager-lock on gluster v set disperse.eager-lock off master- http://review.gluster.org/13605 Change-Id: I000985a787eba3c190fdcd5981dfbf04e64af166 BUG: 1318965 Signed-off-by: Ashish Pandey Reviewed-on: http://review.gluster.org/13773 Smoke: Gluster Build System CentOS-regression: Gluster Build System NetBSD-regression: NetBSD Build System Reviewed-by: Pranith Kumar Karampuri --- xlators/cluster/ec/src/ec-common.c | 9 ++++++--- xlators/cluster/ec/src/ec.c | 9 +++++++++ xlators/cluster/ec/src/ec.h | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) (limited to 'xlators/cluster/ec') diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c index 8c6ff78c27e..de0e597d124 100644 --- a/xlators/cluster/ec/src/ec-common.c +++ b/xlators/cluster/ec/src/ec-common.c @@ -2034,11 +2034,13 @@ void ec_flush_size_version(ec_fop_data_t *fop) void ec_lock_reuse(ec_fop_data_t *fop) { ec_cbk_data_t *cbk; + ec_t *ec = NULL; int32_t i, count; gf_boolean_t release = _gf_false; - + ec = fop->xl->private; cbk = fop->answer; - if (cbk != NULL) { + + if (ec->eager_lock && cbk != NULL) { if (cbk->xdata != NULL) { if ((dict_get_int32(cbk->xdata, GLUSTERFS_INODELK_COUNT, &count) == 0) && (count > 1)) { @@ -2050,7 +2052,8 @@ void ec_lock_reuse(ec_fop_data_t *fop) } } } else { - /* If we haven't get an answer with enough quorum, we always release + /* If eager lock is disabled or If we haven't get + * an answer with enough quorum, we always release * the lock. */ release = _gf_true; } diff --git a/xlators/cluster/ec/src/ec.c b/xlators/cluster/ec/src/ec.c index e8acc2303b9..3133962cb4f 100644 --- a/xlators/cluster/ec/src/ec.c +++ b/xlators/cluster/ec/src/ec.c @@ -261,6 +261,8 @@ reconfigure (xlator_t *this, dict_t *options) failed); GF_OPTION_RECONF ("iam-self-heal-daemon", ec->shd.iamshd, options, bool, failed); + GF_OPTION_RECONF ("eager-lock", ec->eager_lock, options, + bool, failed); GF_OPTION_RECONF ("background-heals", background_heals, options, uint32, failed); GF_OPTION_RECONF ("heal-wait-qlength", heal_wait_qlen, options, @@ -599,6 +601,7 @@ init (xlator_t *this) ec_method_initialize(); GF_OPTION_INIT ("self-heal-daemon", ec->shd.enabled, bool, failed); GF_OPTION_INIT ("iam-self-heal-daemon", ec->shd.iamshd, bool, failed); + GF_OPTION_INIT ("eager-lock", ec->eager_lock, bool, failed); GF_OPTION_INIT ("background-heals", ec->background_heals, uint32, failed); GF_OPTION_INIT ("heal-wait-qlength", ec->heal_wait_qlen, uint32, failed); ec_configure_background_heal_opts (ec, ec->background_heals, @@ -1309,6 +1312,12 @@ struct volume_options options[] = "translator is running as part of self-heal-daemon " "or not." }, + { .key = {"eager-lock"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = "on", + .description = "This option will enable/diable eager lock for" + "disperse volume " + }, { .key = {"background-heals"}, .type = GF_OPTION_TYPE_INT, .min = 0,/*Disabling background heals*/ diff --git a/xlators/cluster/ec/src/ec.h b/xlators/cluster/ec/src/ec.h index 480125e35d3..49af5c2daf2 100644 --- a/xlators/cluster/ec/src/ec.h +++ b/xlators/cluster/ec/src/ec.h @@ -54,6 +54,7 @@ struct _ec gf_lock_t lock; gf_timer_t * timer; gf_boolean_t shutdown; + gf_boolean_t eager_lock; uint32_t background_heals; uint32_t heal_wait_qlen; struct list_head pending_fops; -- cgit