#include #include #include #include #include #include #define WRITE_SIZE (128 * 1024) #define READ_WRITE_LOOP 100 #define FOP_LOOP_COUNT 20 #define TEST_CASE_LOOP 20 int gfapi = 1; static int extension = 1; static int large_number_of_fops(glfs_t *fs) { int ret = 0; int i = 0; glfs_fd_t *fd = NULL; glfs_fd_t *fd1 = NULL; char *dir1 = NULL, *dir2 = NULL, *filename1 = NULL, *filename2 = NULL; char *buf = NULL; struct stat sb = { 0, }; for (i = 0; i < FOP_LOOP_COUNT; i++) { ret = asprintf(&dir1, "dir%d", extension); if (ret < 0) { fprintf(stderr, "cannot construct filename (%s)", strerror(errno)); return ret; } extension++; ret = glfs_mkdir(fs, dir1, 0755); if (ret < 0) { fprintf(stderr, "mkdir(%s): %s\n", dir1, strerror(errno)); return -1; } fd = glfs_opendir(fs, dir1); if (!fd) { fprintf(stderr, "/: %s\n", strerror(errno)); return -1; } ret = glfs_fsetxattr(fd, "user.dirfattr", "fsetxattr", 8, 0); if (ret < 0) { fprintf(stderr, "fsetxattr(%s): %d (%s)\n", dir1, ret, strerror(errno)); return -1; } ret = glfs_closedir(fd); if (ret < 0) { fprintf(stderr, "glfs_closedir failed with ret: %d (%s)\n", ret, strerror(errno)); return -1; } ret = glfs_rmdir(fs, dir1); if (ret < 0) { fprintf(stderr, "glfs_unlink failed with ret: %d (%s)\n", ret, strerror(errno)); return -1; } ret = asprintf(&filename1, "file%d", extension); if (ret < 0) { fprintf(stderr, "cannot construct filename (%s)", strerror(errno)); return ret; } ret = asprintf(&filename2, "file-%d", extension); if (ret < 0) { fprintf(stderr, "cannot construct filename (%s)", strerror(errno)); return ret; } extension++; fd = glfs_creat(fs, filename1, O_RDWR, 0644); if (!fd) { fprintf(stderr, "%s: (%p) %s\n", filename1, fd, strerror(errno)); return -1; } ret = glfs_rename(fs, filename1, filename2); if (ret < 0) { fprintf(stderr, "glfs_rename failed with ret: %d (%s)\n", ret, strerror(errno)); return -1; } ret = glfs_lstat(fs, filename2, &sb); if (ret < 0) { fprintf(stderr, "glfs_lstat failed with ret: %d (%s)\n", ret, strerror(errno)); return -1; } ret = glfs_close(fd); if (ret < 0) { fprintf(stderr, "glfs_close failed with ret: %d (%s)\n", ret, strerror(errno)); return -1; } ret = glfs_unlink(fs, filename2); if (ret < 0) { fprintf(stderr, "glfs_unlink failed with ret: %d (%s)\n", ret, strerror(errno)); return -1; } } } static int large_read_write(glfs_t *fs) { int ret = 0; int j = 0; glfs_fd_t *fd = NULL; glfs_fd_t *fd1 = NULL; char *filename = NULL; char *buf = NULL; ret = asprintf(&filename, "filerw%d", extension); if (ret < 0) { fprintf(stderr, "cannot construct filename (%s)", strerror(errno)); return ret; } extension++; fd = glfs_creat(fs, filename, O_RDWR, 0644); if (!fd) { fprintf(stderr, "%s: (%p) %s\n", filename, fd, strerror(errno)); return -1; } buf = (char *)malloc(WRITE_SIZE); memset(buf, '-', WRITE_SIZE); for (j = 0; j < READ_WRITE_LOOP; j++) { ret = glfs_write(fd, buf, WRITE_SIZE, 0); if (ret < 0) { fprintf(stderr, "Write(%s): %d (%s)\n", filename, ret, strerror(errno)); return ret; } } fd1 = glfs_open(fs, filename, O_RDWR); if (fd1 < 0) { fprintf(stderr, "Open(%s): %d (%s)\n", filename, ret, strerror(errno)); return -1; } glfs_lseek(fd1, 0, SEEK_SET); for (j = 0; j < READ_WRITE_LOOP; j++) { ret = glfs_read(fd1, buf, WRITE_SIZE, 0); if (ret < 0) { fprintf(stderr, "Read(%s): %d (%s)\n", filename, ret, strerror(errno)); return ret; } } for (j = 0; j < READ_WRITE_LOOP; j++) { ret = glfs_write(fd1, buf, WRITE_SIZE, 0); if (ret < 0) { fprintf(stderr, "Write(%s): %d (%s)\n", filename, ret, strerror(errno)); return ret; } } glfs_close(fd); glfs_close(fd1); ret = glfs_unlink(fs, filename); if (ret < 0) { fprintf(stderr, "glfs_unlink failed with ret: %d (%s)\n", ret, strerror(errno)); return -1; } free(buf); free(filename); } static int volfile_change(const char *volname) { int ret = 0; char *cmd = NULL, *cmd1 = NULL; ret = asprintf(&cmd, "gluster volume set %s stat-prefetch off", volname); if (ret < 0) { fprintf(stderr, "cannot construct cli command string (%s)", strerror(errno)); return ret; } ret = asprintf(&cmd1, "gluster volume set %s stat-prefetch on", volname); if (ret < 0) { fprintf(stderr, "cannot construct cli command string (%s)", strerror(errno)); return ret; } ret = system(cmd); if (ret < 0) { fprintf(stderr, "stat-prefetch off on (%s) failed", volname); return ret; } ret = system(cmd1); if (ret < 0) { fprintf(stderr, "stat-prefetch on on (%s) failed", volname); return ret; } free(cmd); free(cmd1); return ret; } int main(int argc, char *argv[]) { glfs_t *fs = NULL; int ret = 0; int i = 0; glfs_fd_t *fd = NULL; glfs_fd_t *fd1 = NULL; char *topdir = "topdir", *filename = "file1"; char *buf = NULL; char *logfile = NULL; char *hostname = NULL; if (argc != 4) { fprintf(stderr, "Expect following args %s \n", argv[0]); return -1; } hostname = argv[1]; logfile = argv[3]; for (i = 0; i < TEST_CASE_LOOP; i++) { fs = glfs_new(argv[2]); if (!fs) { fprintf(stderr, "glfs_new: returned NULL (%s)\n", strerror(errno)); return -1; } ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007); if (ret < 0) { fprintf(stderr, "glfs_set_volfile_server failed ret:%d (%s)\n", ret, strerror(errno)); return -1; } ret = glfs_set_logging(fs, logfile, 7); if (ret < 0) { fprintf(stderr, "glfs_set_logging failed with ret: %d (%s)\n", ret, strerror(errno)); return -1; } ret = glfs_init(fs); if (ret < 0) { fprintf(stderr, "glfs_init failed with ret: %d (%s)\n", ret, strerror(errno)); return -1; } ret = large_number_of_fops(fs); if (ret < 0) return -1; ret = large_read_write(fs); if (ret < 0) return -1; ret = volfile_change(argv[2]); if (ret < 0) return -1; ret = large_number_of_fops(fs); if (ret < 0) return -1; ret = large_read_write(fs); if (ret < 0) return -1; ret = glfs_fini(fs); if (ret < 0) { fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret, strerror(errno)); return -1; } } return 0; }