summaryrefslogtreecommitdiff
path: root/0127-cluster-dht-Refactor-dht-lookup-functions.patch
diff options
context:
space:
mode:
Diffstat (limited to '0127-cluster-dht-Refactor-dht-lookup-functions.patch')
-rw-r--r--0127-cluster-dht-Refactor-dht-lookup-functions.patch200
1 files changed, 200 insertions, 0 deletions
diff --git a/0127-cluster-dht-Refactor-dht-lookup-functions.patch b/0127-cluster-dht-Refactor-dht-lookup-functions.patch
new file mode 100644
index 0000000..0d0fdb3
--- /dev/null
+++ b/0127-cluster-dht-Refactor-dht-lookup-functions.patch
@@ -0,0 +1,200 @@
+From 884ba13ee47888b5de9b6d6acaf051e895f55053 Mon Sep 17 00:00:00 2001
+From: N Balachandran <nbalacha@redhat.com>
+Date: Wed, 10 Apr 2019 14:28:55 +0530
+Subject: [PATCH 127/141] cluster/dht: Refactor dht lookup functions
+
+Part 2: Modify dht_revalidate_cbk to call
+dht_selfheal_directory instead of separate calls
+to heal attrs and xattrs.
+
+upstream: https://review.gluster.org/#/c/glusterfs/+/22542/
+
+> Change-Id: Id41ac6c4220c2c35484812bbfc6157fc3c86b142
+> updates: bz#1590385
+
+Change-Id: Id53962306dd142efc741de838b585fa5c78f9b1f
+BUG:1703897
+Signed-off-by: N Balachandran <nbalacha@redhat.com>
+Reviewed-on: https://code.engineering.redhat.com/gerrit/169038
+Tested-by: RHGS Build Bot <nigelb@redhat.com>
+Reviewed-by: Susant Palai <spalai@redhat.com>
+Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
+---
+ xlators/cluster/dht/src/dht-common.c | 104 ++++++++++-------------------------
+ 1 file changed, 30 insertions(+), 74 deletions(-)
+
+diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
+index d3e900c..183872f 100644
+--- a/xlators/cluster/dht/src/dht-common.c
++++ b/xlators/cluster/dht/src/dht-common.c
+@@ -1365,7 +1365,6 @@ dht_lookup_dir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
+ if (local->inode == NULL)
+ local->inode = inode_ref(inode);
+
+- /* This could be a problem */
+ dht_iatt_merge(this, &local->stbuf, stbuf);
+ dht_iatt_merge(this, &local->postparent, postparent);
+
+@@ -1509,8 +1508,6 @@ dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
+ int is_dir = 0;
+ int is_linkfile = 0;
+ int follow_link = 0;
+- call_frame_t *copy = NULL;
+- dht_local_t *copy_local = NULL;
+ char gfid[GF_UUID_BUF_SIZE] = {0};
+ uint32_t vol_commit_hash = 0;
+ xlator_t *subvol = NULL;
+@@ -1538,17 +1535,16 @@ dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
+
+ gf_uuid_unparse(local->loc.gfid, gfid);
+
++ gf_msg_debug(this->name, op_errno,
++ "%s: revalidate lookup on %s returned op_ret %d",
++ local->loc.path, prev->name, op_ret);
++
+ LOCK(&frame->lock);
+ {
+ if (gf_uuid_is_null(local->gfid)) {
+ memcpy(local->gfid, local->loc.gfid, 16);
+ }
+
+- gf_msg_debug(this->name, op_errno,
+- "revalidate lookup of %s "
+- "returned with op_ret %d",
+- local->loc.path, op_ret);
+-
+ if (op_ret == -1) {
+ local->op_errno = op_errno;
+
+@@ -1580,6 +1576,8 @@ dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
+ local->loc.path);
+
+ local->need_lookup_everywhere = 1;
++ } else if (IA_ISDIR(local->loc.inode->ia_type)) {
++ local->need_selfheal = 1;
+ }
+ }
+
+@@ -1638,15 +1636,16 @@ dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
+ (local->stbuf.ia_uid != stbuf->ia_uid) ||
+ is_permission_different(&local->stbuf.ia_prot,
+ &stbuf->ia_prot)) {
+- local->need_selfheal = 1;
++ local->need_attrheal = 1;
+ }
+ }
+
+ if (!dict_get(xattr, conf->mds_xattr_key)) {
+ gf_msg_debug(this->name, 0,
+- "internal xattr %s is not present"
+- " on path %s gfid is %s ",
+- conf->mds_xattr_key, local->loc.path, gfid);
++ "%s: internal xattr %s is not present"
++ " on subvol %s(gfid is %s)",
++ local->loc.path, conf->mds_xattr_key, prev->name,
++ gfid);
+ } else {
+ check_mds = dht_dict_get_array(xattr, conf->mds_xattr_key,
+ mds_xattr_val, 1, &errst);
+@@ -1734,71 +1733,28 @@ unlock:
+ local->need_xattr_heal = 0;
+
+ if (IA_ISDIR(local->stbuf.ia_type)) {
+- /* Code to update all extended attributed from hashed
+- subvol to local->xattr and call heal code to heal
+- custom xattr from hashed subvol to non-hashed subvol
+- */
+- if (local->need_xattr_heal && (local->mds_xattr)) {
+- dht_dir_set_heal_xattr(this, local, local->xattr,
+- local->mds_xattr, NULL, NULL);
+- dict_unref(local->mds_xattr);
+- local->mds_xattr = NULL;
+- local->need_xattr_heal = 0;
+- ret = dht_dir_xattr_heal(this, local);
+- if (ret)
+- gf_msg(this->name, GF_LOG_ERROR, ret,
+- DHT_MSG_DIR_XATTR_HEAL_FAILED,
+- "xattr heal failed for directory %s "
+- " gfid %s ",
+- local->loc.path, gfid);
+- } else {
+- /* Call function to save hashed subvol on inode
+- ctx if internal mds xattr is not present and
+- all subvols are up
+- */
+- if (inode && !__is_root_gfid(inode->gfid) && (!local->op_ret))
+- (void)dht_common_mark_mdsxattr(frame, NULL, 1);
+- }
+- }
+- if (local->need_selfheal) {
+- local->need_selfheal = 0;
+- if (!__is_root_gfid(inode->gfid)) {
+- gf_uuid_copy(local->gfid, local->mds_stbuf.ia_gfid);
+- local->stbuf.ia_gid = local->mds_stbuf.ia_gid;
+- local->stbuf.ia_uid = local->mds_stbuf.ia_uid;
+- local->stbuf.ia_prot = local->mds_stbuf.ia_prot;
+- } else {
+- gf_uuid_copy(local->gfid, local->stbuf.ia_gfid);
+- local->stbuf.ia_gid = local->prebuf.ia_gid;
+- local->stbuf.ia_uid = local->prebuf.ia_uid;
+- local->stbuf.ia_prot = local->prebuf.ia_prot;
+- }
++ if (!__is_root_gfid(local->loc.inode->gfid) &&
++ (!dict_get(local->xattr, conf->mds_xattr_key)))
++ local->need_selfheal = 1;
+
+- copy = create_frame(this, this->ctx->pool);
+- if (copy) {
+- copy_local = dht_local_init(copy, &local->loc, NULL, 0);
+- if (!copy_local) {
+- DHT_STACK_DESTROY(copy);
+- goto cont;
+- }
+- copy_local->stbuf = local->stbuf;
+- copy_local->mds_stbuf = local->mds_stbuf;
+- copy_local->mds_subvol = local->mds_subvol;
+- copy->local = copy_local;
+- FRAME_SU_DO(copy, dht_local_t);
+- ret = synctask_new(this->ctx->env, dht_dir_attr_heal,
+- dht_dir_attr_heal_done, copy, copy);
+- if (ret) {
+- gf_msg(this->name, GF_LOG_ERROR, ENOMEM,
+- DHT_MSG_DIR_ATTR_HEAL_FAILED,
+- "Synctask creation failed to heal attr "
+- "for path %s gfid %s ",
+- local->loc.path, local->gfid);
+- DHT_STACK_DESTROY(copy);
++ if (dht_needs_selfheal(frame, this)) {
++ if (!__is_root_gfid(local->loc.inode->gfid)) {
++ local->stbuf.ia_gid = local->mds_stbuf.ia_gid;
++ local->stbuf.ia_uid = local->mds_stbuf.ia_uid;
++ local->stbuf.ia_prot = local->mds_stbuf.ia_prot;
++ } else {
++ local->stbuf.ia_gid = local->prebuf.ia_gid;
++ local->stbuf.ia_uid = local->prebuf.ia_uid;
++ local->stbuf.ia_prot = local->prebuf.ia_prot;
+ }
++
++ layout = local->layout;
++ dht_selfheal_directory(frame, dht_lookup_selfheal_cbk,
++ &local->loc, layout);
++ return 0;
+ }
+ }
+- cont:
++
+ if (local->layout_mismatch) {
+ /* Found layout mismatch in the directory, need to
+ fix this in the inode context */
+@@ -1814,7 +1770,7 @@ unlock:
+ dht_layout_unref(this, local->layout);
+ local->layout = NULL;
+
+- /* We know that current cached subvol is no more
++ /* We know that current cached subvol is no longer
+ valid, get the new one */
+ local->cached_subvol = NULL;
+ if (local->xattr_req) {
+--
+1.8.3.1
+