From 218c9b033fa44eacbc27d87491abd830548b362e Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Wed, 17 Aug 2016 16:44:55 +0200 Subject: gfapi: do not cache upcalls if the application is not interested When the volume option 'features.cache-invalidation' is enabled, upcall events are sent from the brick process to the client. Even if the client is not interested in upcall events itself, md-cache or other xlators may benefit from them. By adding a new 'cache_upcalls' boolean in the 'struct glfs', we can enable the caching of upcalls when the application called glfs_h_poll_upcall(). NFS-Ganesha sets up a thread for handling upcalls in the initialization phase, and calls glfs_h_poll_upcall() before any NFS-client accesses the NFS-export. In the future there will be a more flexible registration API for enabling certain kind of upcall events. Until that is available, this should work just fine. Verificatio of this change is not trivial within our current regression test framework. The bug report contains a description on how to reliably reproduce the problem with the glusterfs-coreutils. Change-Id: I818595c92db50e6e48f7bfe287ee05103a4a30a2 BUG: 1368842 Signed-off-by: Niels de Vos Reviewed-on: http://review.gluster.org/15191 Smoke: Gluster Build System Reviewed-by: Poornima G NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: soumya k Reviewed-by: Kaleb KEITHLEY --- tests/basic/gfapi/upcall-cache-invalidate.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'tests/basic/gfapi/upcall-cache-invalidate.c') diff --git a/tests/basic/gfapi/upcall-cache-invalidate.c b/tests/basic/gfapi/upcall-cache-invalidate.c index ea1b5c4a88b..44e186955e7 100644 --- a/tests/basic/gfapi/upcall-cache-invalidate.c +++ b/tests/basic/gfapi/upcall-cache-invalidate.c @@ -43,8 +43,6 @@ main (int argc, char *argv[]) char *hostname = NULL; struct glfs_callback_inode_arg *in_arg = NULL; - cbk.reason = 0; - if (argc != 4) { fprintf (stderr, "Invalid argument\n"); exit(1); @@ -69,6 +67,13 @@ main (int argc, char *argv[]) ret = glfs_init (fs); LOG_ERR("glfs_init", ret); + /* This does not block, but enables caching of events. Real + * applications like NFS-Ganesha run this in a thread before activity + * on the fs (through this instance) happens. */ + ret = glfs_h_poll_upcall(fs_tmp, &cbk); + LOG_ERR ("glfs_h_poll_upcall", ret); + cbk.reason = 0; + fs2 = glfs_new (volname); if (!fs2) { fprintf (stderr, "glfs_new fs2: returned NULL\n"); -- cgit