X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=engines%2Fglusterfs.c;h=0fd1e6d743c9c660c534e658404016e312e1697e;hb=a7c386f47d4e939935bf0894b3c7790460eb9cb1;hp=a89aeb859438bf9e1e2aa7166b1823a0214bda6f;hpb=6e7d7dfb8fda611bc4c27b4738e05787a215d259;p=fio.git diff --git a/engines/glusterfs.c b/engines/glusterfs.c index a89aeb85..0fd1e6d7 100644 --- a/engines/glusterfs.c +++ b/engines/glusterfs.c @@ -6,7 +6,7 @@ */ #include - +#include #include "../fio.h" struct gf_options { @@ -19,27 +19,28 @@ struct gf_data { glfs_t *fs; glfs_fd_t *fd; }; + static struct fio_option options[] = { { - .name = "volume", - .lname = "Glusterfs volume", - .type = FIO_OPT_STR_STORE, - .help = "Name of the Glusterfs volume", - .off1 = offsetof(struct gf_options, gf_vol), - .category = FIO_OPT_C_ENGINE, - .group = FIO_OPT_G_GFAPI, + .name = "volume", + .lname = "Glusterfs volume", + .type = FIO_OPT_STR_STORE, + .help = "Name of the Glusterfs volume", + .off1 = offsetof(struct gf_options, gf_vol), + .category = FIO_OPT_C_ENGINE, + .group = FIO_OPT_G_GFAPI, }, { - .name = "brick", - .lname = "Glusterfs brick name", - .type = FIO_OPT_STR_STORE, - .help = "Name of the Glusterfs brick to connect", - .off1 = offsetof(struct gf_options, gf_brick), - .category = FIO_OPT_C_ENGINE, - .group = FIO_OPT_G_GFAPI, + .name = "brick", + .lname = "Glusterfs brick name", + .type = FIO_OPT_STR_STORE, + .help = "Name of the Glusterfs brick to connect", + .off1 = offsetof(struct gf_options, gf_brick), + .category = FIO_OPT_C_ENGINE, + .group = FIO_OPT_G_GFAPI, }, { - .name = NULL, + .name = NULL, }, }; @@ -48,6 +49,9 @@ static int fio_gf_setup(struct thread_data *td) int r = 0; struct gf_data *g = NULL; struct gf_options *opt = td->eo; + struct stat sb = {0, }; + + dprint(FD_IO, "fio setup\n"); if (td->io_ops->data) return 0; @@ -64,41 +68,40 @@ static int fio_gf_setup(struct thread_data *td) log_err("glfs_new failed.\n"); goto cleanup; } - + glfs_set_logging (g->fs, "/tmp/fio_gfapi.log", 7); /* default to tcp */ - r = glfs_set_volfile_server(g->fs, "tcp", opt->gf_brick, 24007); + r = glfs_set_volfile_server(g->fs, "tcp", opt->gf_brick, 0); if (r){ log_err("glfs_set_volfile_server failed.\n"); goto cleanup; } r = glfs_init(g->fs); if (r){ - log_err("glfs_init failed.\n"); + log_err("glfs_init failed. Is glusterd running on brick?\n"); goto cleanup; } - glfs_set_logging (g->fs, "/dev/stderr", 7); - + sleep(2); + r = glfs_lstat (g->fs, ".", &sb); + if (r){ + log_err("glfs_lstat failed.\n"); + goto cleanup; + } + dprint(FD_FILE, "fio setup %p\n", g->fs); td->io_ops->data = g; cleanup: - if (g){ - if (g->fs){ - glfs_fini(g->fs); + if (r){ + if (g){ + if (g->fs){ + glfs_fini(g->fs); + } + free(g); } - free(g); } return r; } static void fio_gf_cleanup(struct thread_data *td) { - struct gf_data *g = td->io_ops->data; - - if (g){ - if (g->fs){ - glfs_fini(g->fs); - } - free(g); - } } static int fio_gf_get_file_size(struct thread_data *td, struct fio_file *f) @@ -107,12 +110,20 @@ static int fio_gf_get_file_size(struct thread_data *td, struct fio_file *f) int ret; struct gf_data *g = td->io_ops->data; + dprint(FD_FILE, "get file size %s\n", f->file_name); + + if (!g || !g->fs) + { + return 0; + } if (fio_file_size_known(f)) - return 0; + return 0; ret = glfs_lstat (g->fs, f->file_name, &buf); - if (ret < 0) - return ret; + if (ret < 0){ + log_err("glfs_lstat failed.\n"); + return ret; + } f->real_file_size = buf.st_size; fio_file_set_size_known(f); @@ -123,26 +134,42 @@ static int fio_gf_get_file_size(struct thread_data *td, struct fio_file *f) static int fio_gf_open_file(struct thread_data *td, struct fio_file *f) { - struct gf_data *g = td->io_ops->data; - int flags = 0; - dprint(FD_FILE, "fd open %s\n", f->file_name); + int flags = 0; + int ret = 0; + struct gf_data *g = td->io_ops->data; + struct stat sb = {0, }; if (td_write(td)) { - if (!read_only) - flags = O_RDWR; + if (!read_only) + flags = O_RDWR; } else if (td_read(td)) { - if (!read_only) - flags = O_RDWR; - else - flags = O_RDONLY; + if (!read_only) + flags = O_RDWR; + else + flags = O_RDONLY; + } + dprint(FD_FILE, "fio file %s open mode %s td rw %s\n", f->file_name, + flags == O_RDONLY? "ro":"rw", td_read(td)? "read":"write"); + g->fd = glfs_creat(g->fs, f->file_name, flags, 0644); + if (!g->fd){ + log_err("glfs_creat failed.\n"); + ret = errno; + } + /* file for read doesn't exist, create one */ + if (td_read(td) && glfs_lstat (g->fs, "f->file_name", &sb)){ + dprint(FD_FILE, "fio extend file %s to %ld\n", f->file_name, f->real_file_size); + ret = glfs_ftruncate (g->fd, f->real_file_size); + if (ret){ + log_err("failed fio extend file %s to %ld\n", f->file_name, f->real_file_size); + } } - if (td->o.create_on_open) - flags |= O_CREAT; - g->fd = glfs_open(g->fs, f->file_name, flags); + dprint(FD_FILE, "fio %p created %s\n", g->fs, f->file_name); f->fd = -1; - return 0; + f->shadow_fd = -1; + + return ret; } static int fio_gf_close_file(struct thread_data *td, struct fio_file *f) @@ -152,10 +179,15 @@ static int fio_gf_close_file(struct thread_data *td, struct fio_file *f) dprint(FD_FILE, "fd close %s\n", f->file_name); - if (!g->fd && glfs_close(g->fd) < 0) - ret = errno; + if (g->fd && glfs_close(g->fd) < 0) + ret = errno; + + if (g->fs) + glfs_fini(g->fs); g->fd = NULL; + free(g); + td->io_ops->data = NULL; f->engine_data = 0; return ret; @@ -167,6 +199,8 @@ static int fio_gf_prep(struct thread_data *td, struct io_u *io_u) struct fio_file *f = io_u->file; struct gf_data *g = td->io_ops->data; + dprint(FD_FILE, "fio prep\n"); + if (!ddir_rw(io_u->ddir)) return 0; @@ -186,30 +220,34 @@ static int fio_gf_queue(struct thread_data *td, struct io_u *io_u) struct gf_data *g = td->io_ops->data; int ret = 0; + dprint(FD_FILE, "fio queue len %lu\n", io_u->xfer_buflen); fio_ro_check(td, io_u); if (io_u->ddir == DDIR_READ) - ret = glfs_read(g->fd, io_u->xfer_buf, io_u->xfer_buflen, 0); + ret = glfs_read(g->fd, io_u->xfer_buf, io_u->xfer_buflen, 0); else if (io_u->ddir == DDIR_WRITE) - ret = glfs_write(g->fd, io_u->xfer_buf, io_u->xfer_buflen, 0); + ret = glfs_write(g->fd, io_u->xfer_buf, io_u->xfer_buflen, 0); else { - log_err("unsupported operation.\n"); - return -EINVAL; + log_err("unsupported operation.\n"); + return -EINVAL; } + dprint(FD_FILE, "fio len %lu ret %d\n", io_u->xfer_buflen, ret); if (io_u->file && ret >= 0 && ddir_rw(io_u->ddir)) - LAST_POS(io_u->file) = io_u->offset + ret; + LAST_POS(io_u->file) = io_u->offset + ret; if (ret != (int) io_u->xfer_buflen) { - if (ret >= 0) { - io_u->resid = io_u->xfer_buflen - ret; - io_u->error = 0; - return FIO_Q_COMPLETED; - } else - io_u->error = errno; + if (ret >= 0) { + io_u->resid = io_u->xfer_buflen - ret; + io_u->error = 0; + return FIO_Q_COMPLETED; + } else + io_u->error = errno; } - if (io_u->error) - td_verror(td, io_u->error, "xfer"); + if (io_u->error){ + log_err("IO failed.\n"); + td_verror(td, io_u->error, "xfer"); + } return FIO_Q_COMPLETED; @@ -218,16 +256,16 @@ static int fio_gf_queue(struct thread_data *td, struct io_u *io_u) static struct ioengine_ops ioengine = { .name = "gfapi", .version = FIO_IOOPS_VERSION, - .setup = fio_gf_setup, - .cleanup = fio_gf_cleanup, + .init = fio_gf_setup, + .cleanup = fio_gf_cleanup, .prep = fio_gf_prep, .queue = fio_gf_queue, .open_file = fio_gf_open_file, .close_file = fio_gf_close_file, - .get_file_size = fio_gf_get_file_size, - .options = options, + .get_file_size = fio_gf_get_file_size, + .options = options, .option_struct_size = sizeof(struct gf_options), - .flags = FIO_SYNCIO, + .flags = FIO_SYNCIO | FIO_DISKLESSIO, }; static void fio_init fio_gf_register(void)