diff options
-rw-r--r-- | api/src/glfs-fops.c | 3 | ||||
-rw-r--r-- | api/src/glfs-handleops.c | 4 | ||||
-rw-r--r-- | api/src/glfs-internal.h | 1 | ||||
-rw-r--r-- | tests/basic/gfapi/bug1291259.c | 9 | ||||
-rw-r--r-- | tests/basic/gfapi/upcall-cache-invalidate.c | 9 |
5 files changed, 21 insertions, 5 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index 18bac8195d0..9c31502d725 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -4325,7 +4325,8 @@ priv_glfs_process_upcall_event (struct glfs *fs, void *data) { ctx = fs->ctx; - if (ctx->cleanup_started) { + /* if we're not interested in upcalls (anymore), skip them */ + if (ctx->cleanup_started || !fs->cache_upcalls) { pthread_mutex_unlock (&fs->mutex); goto out; } diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c index 7623b29f0cb..47bdbcbec52 100644 --- a/api/src/glfs-handleops.c +++ b/api/src/glfs-handleops.c @@ -2026,6 +2026,10 @@ pub_glfs_h_poll_upcall (struct glfs *fs, struct glfs_callback_arg *up_arg) } fs->pin_refcnt++; + + /* once we call this function, the applications seems to be + * interested in events, enable caching them */ + fs->cache_upcalls = _gf_true; } pthread_mutex_unlock (&fs->mutex); diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h index dc4c3f7c18e..471fa5fffc1 100644 --- a/api/src/glfs-internal.h +++ b/api/src/glfs-internal.h @@ -210,6 +210,7 @@ struct glfs { gf_boolean_t migration_in_progress; + gf_boolean_t cache_upcalls; /* add upcalls to the upcall_list? */ struct list_head upcall_list; pthread_mutex_t upcall_list_mutex; /* mutex for upcall entry list */ diff --git a/tests/basic/gfapi/bug1291259.c b/tests/basic/gfapi/bug1291259.c index 98e3b13c63d..9fbe02ba34d 100644 --- a/tests/basic/gfapi/bug1291259.c +++ b/tests/basic/gfapi/bug1291259.c @@ -51,8 +51,6 @@ main (int argc, char *argv[]) unsigned char globjhdl[GFAPI_HANDLE_LENGTH]; unsigned char globjhdl2[GFAPI_HANDLE_LENGTH]; - cbk.reason = 0; - fprintf (stderr, "Starting libgfapi_fini\n"); if (argc != 4) { fprintf (stderr, "Invalid argument\n"); @@ -79,6 +77,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, &cbk); + LOG_ERR ("glfs_h_poll_upcall", ret); + cbk.reason = 0; + fs2 = glfs_new (volname); if (!fs) { fprintf (stderr, "glfs_new: returned NULL\n"); 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"); |