81 lines
2.9 KiB
Diff
81 lines
2.9 KiB
Diff
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
|
|
|