From 54a5c58f6595ff5342df5b7c4c16a26db2fa02da Mon Sep 17 00:00:00 2001 From: Soumya Koduri Date: Fri, 7 Jun 2019 19:33:07 +0530 Subject: upcall: Avoid sending notifications for invalid inodes For nameless LOOKUPs, server creates a new inode which shall remain invalid until the fop is successfully processed post which it is linked to the inode table. But incase if there is an already linked inode for that entry, it discards that newly created inode which results in upcall notification. This may result in client being bombarded with unnecessary upcalls affecting performance if the data set is huge. This issue can be avoided by looking up and storing the upcall context in the original linked inode (if exists), thus saving up on those extra callbacks. This is backport of below mainline fix - https://review.gluster.org/22840 Change-Id: I044a1737819bb40d1a049d2f53c0566e746d2a17 fixes: bz#1729221 Signed-off-by: Soumya Koduri --- xlators/features/upcall/src/upcall-internal.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'xlators') diff --git a/xlators/features/upcall/src/upcall-internal.c b/xlators/features/upcall/src/upcall-internal.c index d8131a9f2ab..f9d8113b74a 100644 --- a/xlators/features/upcall/src/upcall-internal.c +++ b/xlators/features/upcall/src/upcall-internal.c @@ -545,6 +545,7 @@ upcall_cache_invalidate (call_frame_t *frame, xlator_t *this, client_t *client, upcall_client_t *tmp = NULL; upcall_inode_ctx_t *up_inode_ctx = NULL; gf_boolean_t found = _gf_false; + inode_t *linked_inode = NULL; if (!is_upcall_enabled(this)) return; @@ -557,8 +558,21 @@ upcall_cache_invalidate (call_frame_t *frame, xlator_t *this, client_t *client, return; } - if (inode) - up_inode_ctx = upcall_inode_ctx_get (inode, this); + /* For nameless LOOKUPs, inode created shall always be + * invalid. Hence check if there is any already linked inode. + * If yes, update the inode_ctx of that valid inode + */ + if (inode && (inode->ia_type == IA_INVAL) && stbuf) { + linked_inode = inode_find(inode->table, stbuf->ia_gfid); + if (linked_inode) { + gf_log("upcall", GF_LOG_DEBUG, + "upcall_inode_ctx_get of linked inode (%p)", inode); + up_inode_ctx = upcall_inode_ctx_get(linked_inode, this); + } + } + + if (inode && !up_inode_ctx) + up_inode_ctx = upcall_inode_ctx_get(inode, this); if (!up_inode_ctx) { gf_msg ("upcall", GF_LOG_WARNING, 0, @@ -633,6 +647,9 @@ upcall_cache_invalidate (call_frame_t *frame, xlator_t *this, client_t *client, } pthread_mutex_unlock (&up_inode_ctx->client_list_lock); out: + /* release the ref from inode_find */ + if (linked_inode) + inode_unref(linked_inode); return; } -- cgit