diff options
author | Sakshi Bansal <sabansal@redhat.com> | 2016-04-13 16:40:40 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2016-04-19 00:18:30 -0700 |
commit | abd47f27848c9bb2bf5bc371367c3d41f526ad50 (patch) | |
tree | 78c589643990efe27095971f50ab54fea19a0b1e /xlators/cluster | |
parent | 26d16b90ec7f8acbe07e56e8fe1baf9c9fa1519e (diff) |
quota: setting 'read-only' option in xdata to instruct DHT to not heal
When quota is enabled the quota enforcer tries to get the size of the
source directory by sending nameless lookup to quotad. But if the rename
is successful even on one subvol or the source layout has anomalies then
this nameless lookup in quotad tries to heal the directory which requires
a lock on as many subvols as it can. But src is already locked as part of
rename. For rename to proceed in brick it needs to complete a cluster-wide
lookup. But cluster-wide lookup in quotad is blocked on locks held by rename,
hence a deadlock. To avoid this quota sends an option in xdata which instructs
DHT not to heal.
Change-Id: I792f9322331def0b1f4e16e88deef55d0c9f17f0
BUG: 1252244
Signed-off-by: Sakshi Bansal <sabansal@redhat.com>
Reviewed-on: http://review.gluster.org/13988
Smoke: Gluster Build System <jenkins@build.gluster.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'xlators/cluster')
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index b14f20bcc65..3afbc6258f3 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -250,6 +250,7 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame) int heal_path = 0; int i = 0; loc_t loc = {0 }; + int8_t is_read_only = 0; local = discover_frame->local; layout = local->layout; @@ -265,6 +266,12 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame) if (!main_frame) return 0; + ret = dict_get_int8 (local->xattr_req, QUOTA_READ_ONLY_KEY, + &is_read_only); + if (ret < 0) + gf_msg_debug (this->name, 0, "key = %s not present in dict", + QUOTA_READ_ONLY_KEY); + if (local->file_count && local->dir_count) { gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_FILE_TYPE_MISMATCH, @@ -311,7 +318,8 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame) * healing layout of directory otherwise we don't heal. */ - if (local->inode && conf->randomize_by_gfid) + if (local->inode && conf->randomize_by_gfid && + !is_read_only) goto selfheal; } @@ -328,7 +336,7 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame) } } - if (IA_ISDIR (local->stbuf.ia_type)) { + if (IA_ISDIR (local->stbuf.ia_type) && !is_read_only) { for (i = 0; i < layout->cnt; i++) { if (!source && !layout->list[i].err) source = layout->list[i].xlator; |