diff options
author | Ravishankar N <ravishankar@redhat.com> | 2019-11-28 07:19:13 +0000 |
---|---|---|
committer | Ravishankar N <ravishankar@redhat.com> | 2019-11-28 08:12:08 +0000 |
commit | 3a8969b852a70bc05887c764474039279ceb23ff (patch) | |
tree | a37ed704a35fdf9f8517cddedc28558c7635aa9e /xlators | |
parent | fce5f68bc72d448490a0d41be494ac54a9181b3c (diff) |
Revert "afr: make heal info lockless"
This reverts commit fce5f68bc72d448490a0d41be494ac54a9181b3c.
I merged the wrong patch by mistake! Hence reverting it.
updates: bz#1774011
Change-Id: Id7d6ed1d727efc02467c8a9aea3374331261ebd5
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 203 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 40 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal.h | 3 | ||||
-rw-r--r-- | xlators/features/locks/src/common.h | 4 | ||||
-rw-r--r-- | xlators/features/locks/src/locks.h | 8 | ||||
-rw-r--r-- | xlators/features/locks/src/posix.c | 104 |
6 files changed, 82 insertions, 280 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 7913dfe58bf..bc34a023d2f 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -6882,6 +6882,68 @@ out: return ret; } +int +afr_selfheal_locked_inspect(call_frame_t *frame, xlator_t *this, uuid_t gfid, + inode_t **inode, gf_boolean_t *entry_selfheal, + gf_boolean_t *data_selfheal, + gf_boolean_t *metadata_selfheal, + unsigned char *pending) + +{ + int ret = -1; + fd_t *fd = NULL; + gf_boolean_t dsh = _gf_false; + gf_boolean_t msh = _gf_false; + gf_boolean_t esh = _gf_false; + + ret = afr_selfheal_unlocked_inspect(frame, this, gfid, inode, &dsh, &msh, + &esh); + if (ret) + goto out; + + /* For every heal type hold locks and check if it indeed needs heal */ + + /* Heal-info does an open() on the file being examined so that the + * current eager-lock holding client, if present, at some point sees + * open-fd count being > 1 and releases the eager-lock so that heal-info + * doesn't remain blocked forever until IO completes. + */ + if ((*inode)->ia_type == IA_IFREG) { + ret = afr_selfheal_data_open(this, *inode, &fd); + if (ret < 0) { + gf_msg_debug(this->name, -ret, "%s: Failed to open", + uuid_utoa((*inode)->gfid)); + goto out; + } + } + + if (msh) { + ret = afr_selfheal_locked_metadata_inspect(frame, this, *inode, &msh, + pending); + if (ret == -EIO) + goto out; + } + + if (dsh) { + ret = afr_selfheal_locked_data_inspect(frame, this, fd, &dsh, pending); + if (ret == -EIO || (ret == -EAGAIN)) + goto out; + } + + if (esh) { + ret = afr_selfheal_locked_entry_inspect(frame, this, *inode, &esh, + pending); + } + +out: + *data_selfheal = dsh; + *entry_selfheal = esh; + *metadata_selfheal = msh; + if (fd) + fd_unref(fd); + return ret; +} + static dict_t * afr_set_heal_info(char *status) { @@ -6913,132 +6975,6 @@ out: return dict; } -static int -afr_update_heal_status(xlator_t *this, struct afr_reply *replies, - char *index_vgfid, gf_boolean_t *esh, gf_boolean_t *dsh, - gf_boolean_t *msh) -{ - int ret = -1; - int i = 0; - int io_domain_lk_count = 0; - int shd_domain_lk_count = 0; - afr_private_t *priv = NULL; - char *key1 = NULL; - char *key2 = NULL; - - priv = this->private; - key1 = alloca0(strlen(GLUSTERFS_INODELK_DOM_PREFIX) + 2 + - strlen(priv->sh_domain)); - key2 = alloca0(strlen(GLUSTERFS_INODELK_DOM_PREFIX) + 2 + - strlen(priv->sh_domain)); - sprintf(key1, "%s:%s", GLUSTERFS_INODELK_DOM_PREFIX, this->name); - sprintf(key2, "%s:%s", GLUSTERFS_INODELK_DOM_PREFIX, priv->sh_domain); - - for (i = 0; i < priv->child_count; i++) { - if ((replies[i].valid != 1) || (replies[i].op_ret != 0)) - continue; - if (!io_domain_lk_count) { - ret = dict_get_int32(replies[i].xdata, key1, &io_domain_lk_count); - } - if (!shd_domain_lk_count) { - ret = dict_get_int32(replies[i].xdata, key2, &shd_domain_lk_count); - } - } - - if (!strcmp(index_vgfid, GF_XATTROP_INDEX_GFID)) { - if (shd_domain_lk_count) { - ret = -EAGAIN; /*For 'possibly-healing'. */ - } else { - ret = 0; /*needs heal. Just set a non -ve value so that it is - assumed as the source index.*/ - } - } else if (!strcmp(index_vgfid, GF_XATTROP_DIRTY_GFID)) { - if ((!shd_domain_lk_count && !io_domain_lk_count) || - (!io_domain_lk_count && shd_domain_lk_count)) { - /* Needs heal. */ - ret = 0; - } else { - GF_ASSERT(io_domain_lk_count && !shd_domain_lk_count); - /* No heal needed. */ - *dsh = *esh = *msh = 0; - } - } - return ret; -} - -/*return EIO, EAGAIN or pending*/ -int -afr_lockless_inspect(call_frame_t *frame, xlator_t *this, uuid_t gfid, - inode_t **inode, char *index_vgfid, - gf_boolean_t *entry_selfheal, gf_boolean_t *data_selfheal, - gf_boolean_t *metadata_selfheal, unsigned char *pending) -{ - int ret = -1; - int i = 0; - afr_private_t *priv = NULL; - struct afr_reply *replies = NULL; - gf_boolean_t dsh = _gf_false; - gf_boolean_t msh = _gf_false; - gf_boolean_t esh = _gf_false; - unsigned char *sources = NULL; - unsigned char *sinks = NULL; - unsigned char *valid_on = NULL; - uint64_t *witness = NULL; - - priv = this->private; - replies = alloca0(sizeof(*replies) * priv->child_count); - sources = alloca0(sizeof(*sources) * priv->child_count); - sinks = alloca0(sizeof(*sinks) * priv->child_count); - witness = alloca0(sizeof(*witness) * priv->child_count); - valid_on = alloca0(sizeof(*valid_on) * priv->child_count); - - ret = afr_selfheal_unlocked_inspect(frame, this, gfid, inode, &dsh, &msh, - &esh, replies); - if (ret) - goto out; - for (i = 0; i < priv->child_count; i++) { - if (replies[i].valid && replies[i].op_ret == 0) { - valid_on[i] = 1; - } - } - if (msh) { - ret = afr_selfheal_find_direction(frame, this, replies, - AFR_METADATA_TRANSACTION, valid_on, - sources, sinks, witness, pending); - if (*pending & PFLAG_SBRAIN) - ret = -EIO; - if (ret) - goto out; - } - if (dsh) { - ret = afr_selfheal_find_direction(frame, this, replies, - AFR_DATA_TRANSACTION, valid_on, - sources, sinks, witness, pending); - if (*pending & PFLAG_SBRAIN) - ret = -EIO; - if (ret) - goto out; - } - if (esh) { - ret = afr_selfheal_find_direction(frame, this, replies, - AFR_ENTRY_TRANSACTION, valid_on, - sources, sinks, witness, pending); - if (*pending & PFLAG_SBRAIN) - ret = -EIO; - if (ret) - goto out; - } - - ret = afr_update_heal_status(this, replies, index_vgfid, &esh, &dsh, &msh); -out: - *data_selfheal = dsh; - *entry_selfheal = esh; - *metadata_selfheal = msh; - if (replies) - afr_replies_wipe(replies, priv->child_count); - return ret; -} - int afr_get_heal_info(call_frame_t *frame, xlator_t *this, loc_t *loc) { @@ -7054,14 +6990,6 @@ afr_get_heal_info(call_frame_t *frame, xlator_t *this, loc_t *loc) char *status = NULL; call_frame_t *heal_frame = NULL; afr_local_t *heal_local = NULL; - afr_local_t *local = NULL; - char *index_vgfid = NULL; - - local = frame->local; - if (dict_get_str(local->xdata_req, "index-vgfid", &index_vgfid)) { - ret = -1; - goto out; - } /*Use frame with lk-owner set*/ heal_frame = afr_frame_create(frame->this, &op_errno); @@ -7071,10 +6999,9 @@ afr_get_heal_info(call_frame_t *frame, xlator_t *this, loc_t *loc) } heal_local = heal_frame->local; heal_frame->local = frame->local; - - ret = afr_lockless_inspect(heal_frame, this, loc->gfid, &inode, index_vgfid, - &entry_selfheal, &data_selfheal, - &metadata_selfheal, &pending); + ret = afr_selfheal_locked_inspect(heal_frame, this, loc->gfid, &inode, + &entry_selfheal, &data_selfheal, + &metadata_selfheal, &pending); if (ret == -ENOMEM) { ret = -1; diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 781437bf74e..f06f7e603a0 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -1831,34 +1831,6 @@ afr_selfheal_unlocked_lookup_on(call_frame_t *frame, inode_t *parent, return inode; } -static int -afr_set_multi_dom_lock_count_request(xlator_t *this, dict_t *dict) -{ - int ret = 0; - afr_private_t *priv = NULL; - char *key = NULL; - - priv = this->private; - key = alloca0(strlen(GLUSTERFS_INODELK_DOM_PREFIX) + 2 + - strlen(priv->sh_domain)); - - ret = dict_set_uint32(dict, GLUSTERFS_MULTIPLE_DOM_LK_CNT_REQUESTS, 1); - if (ret) - return ret; - - sprintf(key, "%s:%s", GLUSTERFS_INODELK_DOM_PREFIX, this->name); - ret = dict_set_uint32(dict, key, 1); - if (ret) - return ret; - - sprintf(key, "%s:%s", GLUSTERFS_INODELK_DOM_PREFIX, priv->sh_domain); - ret = dict_set_uint32(dict, key, 1); - if (ret) - return ret; - - return 0; -} - int afr_selfheal_unlocked_discover_on(call_frame_t *frame, inode_t *inode, uuid_t gfid, struct afr_reply *replies, @@ -1885,11 +1857,6 @@ afr_selfheal_unlocked_discover_on(call_frame_t *frame, inode_t *inode, return -ENOMEM; } - if (afr_set_multi_dom_lock_count_request(frame->this, xattr_req)) { - dict_unref(xattr_req); - return -1; - } - loc.inode = inode_ref(inode); gf_uuid_copy(loc.gfid, gfid); @@ -2285,8 +2252,7 @@ int afr_selfheal_unlocked_inspect(call_frame_t *frame, xlator_t *this, uuid_t gfid, inode_t **link_inode, gf_boolean_t *data_selfheal, gf_boolean_t *metadata_selfheal, - gf_boolean_t *entry_selfheal, - struct afr_reply *replies_dst) + gf_boolean_t *entry_selfheal) { afr_private_t *priv = NULL; inode_t *inode = NULL; @@ -2422,8 +2388,6 @@ afr_selfheal_unlocked_inspect(call_frame_t *frame, xlator_t *this, uuid_t gfid, ret = 0; out: - if (replies && replies_dst) - afr_replies_copy(replies_dst, replies, priv->child_count); if (inode) inode_unref(inode); if (replies) @@ -2543,7 +2507,7 @@ afr_selfheal_do(call_frame_t *frame, xlator_t *this, uuid_t gfid) ret = afr_selfheal_unlocked_inspect(frame, this, gfid, &inode, &data_selfheal, &metadata_selfheal, - &entry_selfheal, NULL); + &entry_selfheal); if (ret) goto out; diff --git a/xlators/cluster/afr/src/afr-self-heal.h b/xlators/cluster/afr/src/afr-self-heal.h index 5e7bde8689d..55d94e20cea 100644 --- a/xlators/cluster/afr/src/afr-self-heal.h +++ b/xlators/cluster/afr/src/afr-self-heal.h @@ -325,8 +325,7 @@ int afr_selfheal_unlocked_inspect(call_frame_t *frame, xlator_t *this, uuid_t gfid, inode_t **link_inode, gf_boolean_t *data_selfheal, gf_boolean_t *metadata_selfheal, - gf_boolean_t *entry_selfheal, - struct afr_reply *replies); + gf_boolean_t *entry_selfheal); int afr_selfheal_do(call_frame_t *frame, xlator_t *this, uuid_t gfid); diff --git a/xlators/features/locks/src/common.h b/xlators/features/locks/src/common.h index 0916c299e84..4006062606e 100644 --- a/xlators/features/locks/src/common.h +++ b/xlators/features/locks/src/common.h @@ -44,10 +44,6 @@ fd_unref(__local->fd); \ if (__local->inode) \ inode_unref(__local->inode); \ - if (__local->xdata) { \ - dict_unref(__local->xdata); \ - __local->xdata = NULL; \ - } \ mem_put(__local); \ } \ } while (0) diff --git a/xlators/features/locks/src/locks.h b/xlators/features/locks/src/locks.h index 3305350afb1..0ab2aa6cbae 100644 --- a/xlators/features/locks/src/locks.h +++ b/xlators/features/locks/src/locks.h @@ -240,7 +240,6 @@ typedef struct { gf_boolean_t inodelk_count_req; gf_boolean_t posixlk_count_req; gf_boolean_t parent_entrylk_req; - gf_boolean_t multiple_dom_lk_requests; int update_mlock_enforced_flag; } pl_local_t; @@ -262,13 +261,6 @@ typedef struct _locks_ctx { struct list_head metalk_list; } pl_ctx_t; -typedef struct _multi_dom_lk_data { - xlator_t *this; - inode_t *inode; - dict_t *xdata_rsp; - gf_boolean_t keep_max; -} multi_dom_lk_data; - typedef enum { DECREMENT, INCREMENT } pl_count_op_t; pl_ctx_t * diff --git a/xlators/features/locks/src/posix.c b/xlators/features/locks/src/posix.c index e03a6063128..d2f5db5116b 100644 --- a/xlators/features/locks/src/posix.c +++ b/xlators/features/locks/src/posix.c @@ -151,20 +151,13 @@ fetch_pathinfo(xlator_t *, inode_t *, int32_t *, char **); gf_boolean_t pl_has_xdata_requests(dict_t *xdata) { - static char *reqs[] = {GLUSTERFS_ENTRYLK_COUNT, - GLUSTERFS_INODELK_COUNT, - GLUSTERFS_INODELK_DOM_COUNT, - GLUSTERFS_POSIXLK_COUNT, - GLUSTERFS_PARENT_ENTRYLK, - GLUSTERFS_MULTIPLE_DOM_LK_CNT_REQUESTS, - NULL}; - static int reqs_size[] = {SLEN(GLUSTERFS_ENTRYLK_COUNT), - SLEN(GLUSTERFS_INODELK_COUNT), - SLEN(GLUSTERFS_INODELK_DOM_COUNT), - SLEN(GLUSTERFS_POSIXLK_COUNT), - SLEN(GLUSTERFS_PARENT_ENTRYLK), - SLEN(GLUSTERFS_MULTIPLE_DOM_LK_CNT_REQUESTS), - 0}; + static char *reqs[] = {GLUSTERFS_ENTRYLK_COUNT, GLUSTERFS_INODELK_COUNT, + GLUSTERFS_INODELK_DOM_COUNT, GLUSTERFS_POSIXLK_COUNT, + GLUSTERFS_PARENT_ENTRYLK, NULL}; + static int reqs_size[] = { + SLEN(GLUSTERFS_ENTRYLK_COUNT), SLEN(GLUSTERFS_INODELK_COUNT), + SLEN(GLUSTERFS_INODELK_DOM_COUNT), SLEN(GLUSTERFS_POSIXLK_COUNT), + SLEN(GLUSTERFS_PARENT_ENTRYLK), 0}; int i = 0; if (!xdata) @@ -183,9 +176,6 @@ pl_get_xdata_requests(pl_local_t *local, dict_t *xdata) if (!local || !xdata) return; - GF_ASSERT(local->xdata == NULL); - local->xdata = dict_ref(xdata); - if (dict_get_sizen(xdata, GLUSTERFS_ENTRYLK_COUNT)) { local->entrylk_count_req = 1; dict_del_sizen(xdata, GLUSTERFS_ENTRYLK_COUNT); @@ -194,10 +184,6 @@ pl_get_xdata_requests(pl_local_t *local, dict_t *xdata) local->inodelk_count_req = 1; dict_del_sizen(xdata, GLUSTERFS_INODELK_COUNT); } - if (dict_get_sizen(xdata, GLUSTERFS_MULTIPLE_DOM_LK_CNT_REQUESTS)) { - local->multiple_dom_lk_requests = 1; - dict_del_sizen(xdata, GLUSTERFS_MULTIPLE_DOM_LK_CNT_REQUESTS); - } local->inodelk_dom_count_req = dict_get_sizen(xdata, GLUSTERFS_INODELK_DOM_COUNT); @@ -225,7 +211,7 @@ pl_needs_xdata_response(pl_local_t *local) if (local->parent_entrylk_req || local->entrylk_count_req || local->inodelk_dom_count_req || local->inodelk_count_req || - local->posixlk_count_req || local->multiple_dom_lk_requests) + local->posixlk_count_req) return _gf_true; return _gf_false; @@ -425,71 +411,6 @@ pl_posixlk_xattr_fill(xlator_t *this, inode_t *inode, dict_t *dict, } void -pl_inodelk_xattr_fill_each(xlator_t *this, inode_t *inode, dict_t *dict, - char *domname, gf_boolean_t keep_max, char *key) -{ - int32_t count = 0; - int32_t maxcount = -1; - int ret = -1; - - if (keep_max) { - ret = dict_get_int32(dict, key, &maxcount); - if (ret < 0) - gf_msg_debug(this->name, 0, " Failed to fetch the value for key %s", - GLUSTERFS_INODELK_COUNT); - } - count = get_inodelk_count(this, inode, domname); - if (maxcount >= count) - return; - - ret = dict_set_int32(dict, key, count); - if (ret < 0) { - gf_msg_debug(this->name, 0, - "Failed to set count for " - "key %s", - key); - } - - return; -} - -static int -pl_inodelk_xattr_fill_multiple(dict_t *this, char *key, data_t *value, - void *data) -{ - multi_dom_lk_data *d = data; - char *tmp_key = NULL; - char *save_ptr = NULL; - - tmp_key = gf_strdup(key); - strtok_r(tmp_key, ":", &save_ptr); - GF_ASSERT(*save_ptr); // Should contain the domain string. - - pl_inodelk_xattr_fill_each(d->this, d->inode, d->xdata_rsp, save_ptr, - d->keep_max, key); - if (tmp_key) - GF_FREE(tmp_key); - - return 0; -} - -void -pl_fill_multiple_dom_lk_requests(xlator_t *this, pl_local_t *local, - inode_t *inode, dict_t *dict, - gf_boolean_t keep_max) -{ - multi_dom_lk_data data; - - data.this = this; - data.inode = inode; - data.xdata_rsp = dict; - data.keep_max = keep_max; - - dict_foreach_fnmatch(local->xdata, GLUSTERFS_INODELK_DOM_PREFIX "*", - pl_inodelk_xattr_fill_multiple, &data); -} - -void pl_set_xdata_response(xlator_t *this, pl_local_t *local, inode_t *parent, inode_t *inode, char *name, dict_t *xdata, gf_boolean_t max_lock) @@ -516,9 +437,6 @@ pl_set_xdata_response(xlator_t *this, pl_local_t *local, inode_t *parent, if (local->posixlk_count_req) pl_posixlk_xattr_fill(this, inode, xdata, max_lock); - - if (local->multiple_dom_lk_requests) - pl_fill_multiple_dom_lk_requests(this, local, inode, xdata, max_lock); } /* Checks whether the region where fop is acting upon conflicts @@ -857,6 +775,9 @@ pl_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, { pl_local_t *local = frame->local; + if (local->xdata) + dict_unref(local->xdata); + pl_track_io_fop_count(local, this, DECREMENT); if (local->op == GF_FOP_TRUNCATE) @@ -1014,6 +935,9 @@ unwind: "ret: %d, error: %s", op_ret, strerror(op_errno)); + if (local->xdata) + dict_unref(local->xdata); + switch (local->op) { case GF_FOP_TRUNCATE: PL_STACK_UNWIND(truncate, xdata, frame, op_ret, op_errno, buf, |