diff options
Diffstat (limited to '0199-upcall-Avoid-sending-notifications-for-invalid-inode.patch')
-rw-r--r-- | 0199-upcall-Avoid-sending-notifications-for-invalid-inode.patch | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/0199-upcall-Avoid-sending-notifications-for-invalid-inode.patch b/0199-upcall-Avoid-sending-notifications-for-invalid-inode.patch new file mode 100644 index 0000000..161675e --- /dev/null +++ b/0199-upcall-Avoid-sending-notifications-for-invalid-inode.patch @@ -0,0 +1,80 @@ +From e41b4a45f9f5c07ffa38582d0bb4517f6a66eaa3 Mon Sep 17 00:00:00 2001 +From: Soumya Koduri <skoduri@redhat.com> +Date: Fri, 7 Jun 2019 19:33:07 +0530 +Subject: [PATCH 199/221] 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 upstream fix - +mainline: https://review.gluster.org/22840 +release-6: https://review.gluster.org/22873 + +Change-Id: I044a1737819bb40d1a049d2f53c0566e746d2a17 +fixes: bz#1717784 +Signed-off-by: Soumya Koduri <skoduri@redhat.com> +Reviewed-on: https://code.engineering.redhat.com/gerrit/173507 +Tested-by: RHGS Build Bot <nigelb@redhat.com> +Reviewed-by: Kaleb Keithley <kkeithle@redhat.com> +--- + xlators/features/upcall/src/upcall-internal.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +diff --git a/xlators/features/upcall/src/upcall-internal.c b/xlators/features/upcall/src/upcall-internal.c +index 46cf6f8..7998dd2 100644 +--- a/xlators/features/upcall/src/upcall-internal.c ++++ b/xlators/features/upcall/src/upcall-internal.c +@@ -520,6 +520,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; +@@ -532,7 +533,20 @@ upcall_cache_invalidate(call_frame_t *frame, xlator_t *this, client_t *client, + return; + } + +- if (inode) ++ /* 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) { +@@ -600,6 +614,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; + } + +-- +1.8.3.1 + |