From b4b20984721e169763a5ac26ffb9353d1ca3568a Mon Sep 17 00:00:00 2001 From: Vikas Gorur Date: Fri, 30 Oct 2009 05:27:50 +0000 Subject: cluster/afr: Don't try to self-heal if there are locks held If the inodelk_count or entrylk_count is positive on a file/directory, don't try to do self-heal on it. Signed-off-by: Vikas Gorur Signed-off-by: Anand V. Avati BUG: 326 ([2.0.8rc9] Spurious self-heal) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=326 --- xlators/cluster/afr/src/afr.c | 16 +++++++++++++++- xlators/cluster/afr/src/afr.h | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index c60e1b33cd7..d4f8b18654a 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -441,6 +441,9 @@ afr_lookup_cbk (call_frame_t *frame, void *cookie, int first_up_child = -1; uint32_t open_fd_count = 0; + uint32_t inodelk_count = 0; + uint32_t entrylk_count = 0; + int ret = 0; child_index = (long) cookie; @@ -484,6 +487,13 @@ afr_lookup_cbk (call_frame_t *frame, void *cookie, &open_fd_count); local->open_fd_count += open_fd_count; + ret = dict_get_uint32 (xattr, GLUSTERFS_INODELK_COUNT, + &inodelk_count); + local->inodelk_count += inodelk_count; + + ret = dict_get_uint32 (xattr, GLUSTERFS_ENTRYLK_COUNT, + &entrylk_count); + local->entrylk_count += entrylk_count; first_up_child = afr_first_up_child (priv); @@ -618,7 +628,9 @@ unlock: if ((local->need_metadata_self_heal || local->need_data_self_heal || local->need_entry_self_heal) - && (!local->open_fd_count)) { + && (!local->open_fd_count && + !local->inodelk_count && + !local->entrylk_count)) { if (!local->cont.lookup.inode->st_mode) { /* fix for RT #602 */ @@ -705,6 +717,8 @@ afr_lookup (call_frame_t *frame, xlator_t *this, } ret = dict_set_uint64 (local->xattr_req, GLUSTERFS_OPEN_FD_COUNT, 0); + ret = dict_set_uint64 (local->xattr_req, GLUSTERFS_INODELK_COUNT, 0); + ret = dict_set_uint64 (local->xattr_req, GLUSTERFS_ENTRYLK_COUNT, 0); for (i = 0; i < priv->child_count; i++) { STACK_WIND_COOKIE (frame, afr_lookup_cbk, (void *) (long) i, diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index baad63bdc39..45a1c986348 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -192,6 +192,9 @@ typedef struct _afr_local { dict_t *xattr_req; int open_fd_count; + int32_t inodelk_count; + int32_t entrylk_count; + /* This struct contains the arguments for the "continuation" (scheme-like) of fops -- cgit