summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/src/glfs-fops.c3
-rw-r--r--api/src/glfs-handleops.c4
-rw-r--r--api/src/glfs-internal.h1
-rw-r--r--tests/basic/gfapi/bug1291259.c9
-rw-r--r--tests/basic/gfapi/upcall-cache-invalidate.c9
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");