summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
authorRavishankar N <ravishankar@redhat.com>2019-11-28 07:19:13 +0000
committerRavishankar N <ravishankar@redhat.com>2019-11-28 08:12:08 +0000
commit3a8969b852a70bc05887c764474039279ceb23ff (patch)
treea37ed704a35fdf9f8517cddedc28558c7635aa9e /xlators
parentfce5f68bc72d448490a0d41be494ac54a9181b3c (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.c203
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-common.c40
-rw-r--r--xlators/cluster/afr/src/afr-self-heal.h3
-rw-r--r--xlators/features/locks/src/common.h4
-rw-r--r--xlators/features/locks/src/locks.h8
-rw-r--r--xlators/features/locks/src/posix.c104
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,