You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
8.5 KiB
200 lines
8.5 KiB
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 |
|
|
|
|