summaryrefslogtreecommitdiff
path: root/0199-upcall-Avoid-sending-notifications-for-invalid-inode.patch
diff options
context:
space:
mode:
Diffstat (limited to '0199-upcall-Avoid-sending-notifications-for-invalid-inode.patch')
-rw-r--r--0199-upcall-Avoid-sending-notifications-for-invalid-inode.patch80
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
+