int main (int argc, char *argv[]) { glfs_t *fs = NULL; glfs_t *fs2 = NULL; glfs_t *fs_tmp = NULL; glfs_t *fs_tmp2 = NULL; int ret = 0, i; glfs_fd_t *fd = NULL; glfs_fd_t *fd2 = NULL; glfs_fd_t *fd_tmp = NULL; glfs_fd_t *fd_tmp2 = NULL; char readbuf[32]; char *filename = "file_tmp"; char *writebuf = NULL; char *vol_id = NULL; unsigned int cnt = 1; struct glfs_upcall *cbk = NULL; char *logfile = NULL; char *volname = NULL; char *hostname = NULL; if (argc != 4) { fprintf (stderr, "Invalid argument\n"); exit(1); } hostname = argv[1]; volname = argv[2]; logfile = argv[3]; fs = glfs_new (volname); if (!fs) { fprintf (stderr, "glfs_new: returned NULL\n"); return -1; } ret = glfs_set_volfile_server (fs, "tcp", hostname, 24007); LOG_ERR("glfs_set_volfile_server", ret); ret = glfs_set_logging (fs, logfile, 7); LOG_ERR("glfs_set_logging", ret); 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); fs2 = glfs_new (volname); if (!fs2) { fprintf (stderr, "glfs_new fs2: returned NULL\n"); return 1; } ret = glfs_set_volfile_server (fs2, "tcp", hostname, 24007); LOG_ERR("glfs_set_volfile_server-fs2", ret); ret = glfs_set_logging (fs2, logfile, 7); LOG_ERR("glfs_set_logging-fs2", ret); ret = glfs_init (fs2); LOG_ERR("glfs_init-fs2", ret); fd = glfs_creat(fs, filename, O_RDWR|O_SYNC, 0644); if (fd <= 0) { ret = -1; LOG_ERR ("glfs_creat", ret); } fprintf (stderr, "glfs-create fd - %d\n", fd); fd2 = glfs_open(fs2, filename, O_SYNC|O_RDWR|O_CREAT); if (fd2 <= 0) { ret = -1; LOG_ERR ("glfs_open-fs2", ret); } fprintf (stderr, "glfs-open fd2 - %d\n", fd2); do { if (cnt%2) { fd_tmp = fd; fs_tmp = fs; fd_tmp2 = fd2; fs_tmp2 = fs2; } else { fd_tmp = fd2; fs_tmp = fs2; fd_tmp2 = fd; fs_tmp2 = fs; } /* WRITE on fd_tmp */ writebuf = malloc(10); if (writebuf) { memcpy (writebuf, "abcd", 4); ret = glfs_write (fd_tmp, writebuf, 4, 0); if (ret <= 0) { ret = -1; LOG_ERR ("glfs_write", ret); } else { fprintf (stderr, "glfs_write suceeded\n"); } free(writebuf); } else { fprintf (stderr, "Could not allocate writebuf\n"); return -1; } /* READ on fd_tmp2 */ ret = glfs_lseek (fd_tmp2, 0, SEEK_SET); LOG_ERR ("glfs_lseek", ret); memset (readbuf, 0, sizeof(readbuf)); ret = glfs_pread (fd_tmp2, readbuf, 4, 0, 0, NULL); if (ret <= 0) { ret = -1; LOG_ERR ("glfs_pread", ret); } else { fprintf (stderr, "glfs_read: %s\n", readbuf); } /* Open() fops seem to be not performed on server side until * there are I/Os on that fd */ if (cnt > 2) { struct glfs_upcall_inode *in_arg = NULL; enum glfs_upcall_reason reason = 0; struct glfs_object *object = NULL; uint64_t flags = 0; uint64_t expire = 0; ret = glfs_h_poll_upcall(fs_tmp, &cbk); LOG_ERR ("glfs_h_poll_upcall", ret); reason = glfs_upcall_get_reason (cbk); /* Expect 'GLFS_INODE_INVALIDATE' upcall event. */ if (reason == GLFS_UPCALL_INODE_INVALIDATE) { in_arg = glfs_upcall_get_event (cbk); object = glfs_upcall_inode_get_object (in_arg); flags = glfs_upcall_inode_get_flags (in_arg); expire = glfs_upcall_inode_get_expire (in_arg); fprintf (stderr, " upcall event type - %d," " object(%p), flags(%d), " " expire_time_attr(%d)\n" , reason, object, flags, expire); } else { fprintf (stderr, "Didnt receive upcall notify event"); ret = -1; goto err; } glfs_free (cbk); } sleep(5); } while (++cnt < 5); err: glfs_close(fd); LOG_ERR ("glfs_close", ret); glfs_close(fd2); LOG_ERR ("glfs_close-fd2", ret); out: if (fs) { ret = glfs_fini(fs); fprintf (stderr, "glfs_fini(fs) returned %d \n", ret); } if (fs2) { ret = glfs_fini(fs2); fprintf (stderr, "glfs_fini(fs2) returned %d \n", ret); } if (ret) exit(1); exit(0); }
int main(int argc, char *argv[]) { glfs_t *fs = NULL; glfs_t *fs2 = NULL; int ret = 0, i; glfs_fd_t *fd = NULL; char *filename = "/a1"; char *filename2 = "/a2"; struct stat sb = { 0, }; char *logfile = NULL; char *volname = NULL; char *hostname = NULL; int cnt = 1; int upcall_received = 0; struct glfs_upcall *cbk = NULL; struct glfs_object *root = NULL, *leaf = NULL; unsigned char globjhdl[GFAPI_HANDLE_LENGTH]; unsigned char globjhdl2[GFAPI_HANDLE_LENGTH]; fprintf(stderr, "Starting libgfapi_fini\n"); if (argc != 4) { fprintf(stderr, "Invalid argument\n"); exit(1); } hostname = argv[1]; volname = argv[2]; logfile = argv[3]; fs = glfs_new(volname); if (!fs) { fprintf(stderr, "glfs_new: returned NULL\n"); return 1; } ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007); LOG_ERR("glfs_set_volfile_server", ret); ret = glfs_set_logging(fs, logfile, 7); LOG_ERR("glfs_set_logging", ret); 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); fs2 = glfs_new(volname); if (!fs) { fprintf(stderr, "glfs_new: returned NULL\n"); return 1; } ret = glfs_set_volfile_server(fs2, "tcp", hostname, 24007); LOG_ERR("glfs_set_volfile_server", ret); ret = glfs_set_logging(fs2, logfile, 7); LOG_ERR("glfs_set_logging", ret); ret = glfs_init(fs2); LOG_ERR("glfs_init", ret); sleep(2); root = glfs_h_lookupat(fs, NULL, "/", &sb, 0); if (!root) { ret = -1; LOG_ERR("glfs_h_lookupat root", ret); } leaf = glfs_h_lookupat(fs, root, filename, &sb, 0); if (!leaf) { ret = -1; LOG_IF_NO_ERR("glfs_h_lookupat leaf", ret); } root = glfs_h_lookupat(fs2, NULL, "/", &sb, 0); if (!root) { ret = -1; LOG_ERR("glfs_h_lookupat root", ret); } leaf = glfs_h_creat(fs2, root, filename, O_RDWR, 0644, &sb); if (!leaf) { ret = -1; LOG_ERR("glfs_h_lookupat leaf", ret); } fprintf(stderr, "glfs_h_create leaf - %p\n", leaf); while (cnt++ < 5 && !upcall_received) { enum glfs_upcall_reason reason = 0; struct glfs_upcall_inode *in_arg = NULL; ret = glfs_h_poll_upcall(fs, &cbk); LOG_ERR("glfs_h_poll_upcall", ret); if (ret) goto retry; reason = glfs_upcall_get_reason(cbk); fprintf(stderr, "Upcall received(%d)\n", reason); if (reason == GLFS_UPCALL_INODE_INVALIDATE) { struct glfs_object *object = NULL; in_arg = glfs_upcall_get_event(cbk); object = glfs_upcall_inode_get_object(in_arg); ret = glfs_h_extract_handle(root, globjhdl + GLAPI_UUID_LENGTH, GFAPI_HANDLE_LENGTH); LOG_ERR("glfs_h_extract_handle", (ret != 16)); ret = glfs_h_extract_handle(object, globjhdl2 + GLAPI_UUID_LENGTH, GFAPI_HANDLE_LENGTH); LOG_ERR("glfs_h_extract_handle", (ret != 16)); if (memcmp(globjhdl + GLAPI_UUID_LENGTH, globjhdl2 + GLAPI_UUID_LENGTH, 16)) { fprintf(stderr, "Error: gfid mismatch\n"); exit(1); } upcall_received = 1; } retry: if (!upcall_received) sleep(1); /* glfs_h_poll_upcall() does not block */ if (!ret) { glfs_free(cbk); cbk = NULL; } } if (!upcall_received) { fprintf(stderr, "Error: Upcall not received\n"); exit(1); } ret = glfs_fini(fs); LOG_ERR("glfs_fini", ret); fprintf(stderr, "End of libgfapi_fini\n"); exit(0); }