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.

Change-Id: Id41ac6c4220c2c35484812bbfc6157fc3c86b142
fixes: bz#1707393
Signed-off-by: N Balachandran <nbalacha@redhat.com>
This commit is contained in:
N Balachandran 2019-04-10 14:28:55 +05:30
parent 7f780f30e5
commit ab296b5be7

View File

@ -1364,7 +1364,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);
@ -1508,8 +1507,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;
@ -1537,17 +1534,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;
@ -1579,6 +1575,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;
}
}
@ -1637,15 +1635,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);
@ -1733,71 +1732,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 */
@ -1813,7 +1769,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) {