diff options
Diffstat (limited to '0127-cluster-dht-Refactor-dht-lookup-functions.patch')
-rw-r--r-- | 0127-cluster-dht-Refactor-dht-lookup-functions.patch | 200 |
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 + |