From: chenh Date: Fri, 28 Mar 2014 19:01:42 +0000 (-0400) Subject: make glfs call per thread based X-Git-Tag: fio-2.1.10~13^2~8 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=6aa56500061cdb130705640d5c1cce9c9f26c7ff make glfs call per thread based --- diff --git a/engines/glusterfs.c b/engines/glusterfs.c index a89aeb85..b5c2d690 100644 --- a/engines/glusterfs.c +++ b/engines/glusterfs.c @@ -6,7 +6,7 @@ */ #include - +#include #include "../fio.h" struct gf_options { @@ -19,6 +19,7 @@ struct gf_data { glfs_t *fs; glfs_fd_t *fd; }; + static struct fio_option options[] = { { .name = "volume", @@ -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; + } + sleep(2); + r = glfs_lstat (g->fs, ".", &sb); + if (r){ + log_err("glfs_lstat failed.\n"); goto cleanup; } - glfs_set_logging (g->fs, "/dev/stderr", 7); - + 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,21 @@ 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) + { + f->real_file_size = 0; + fio_file_set_size_known(f); + } if (fio_file_size_known(f)) return 0; ret = glfs_lstat (g->fs, f->file_name, &buf); - if (ret < 0) + 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,11 +135,12 @@ 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; + dprint(FD_FILE, "fio open %s\n", f->file_name); if (td_write(td)) { if (!read_only) flags = O_RDWR; @@ -137,12 +150,16 @@ static int fio_gf_open_file(struct thread_data *td, struct fio_file *f) else flags = O_RDONLY; } - if (td->o.create_on_open) - flags |= O_CREAT; - - g->fd = glfs_open(g->fs, f->file_name, flags); + g->fd = glfs_creat(g->fs, f->file_name, flags, 0644); + if (!g->fd){ + log_err("glfs_creat failed.\n"); + ret = errno; + } + 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 +169,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 +189,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,6 +210,7 @@ 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) @@ -196,6 +221,7 @@ static int fio_gf_queue(struct thread_data *td, struct io_u *io_u) log_err("unsupported operation.\n"); return -EINVAL; } + if (io_u->file && ret >= 0 && ddir_rw(io_u->ddir)) LAST_POS(io_u->file) = io_u->offset + ret; @@ -208,8 +234,10 @@ static int fio_gf_queue(struct thread_data *td, struct io_u *io_u) io_u->error = errno; } - if (io_u->error) + if (io_u->error){ + log_err("IO failed.\n"); td_verror(td, io_u->error, "xfer"); + } return FIO_Q_COMPLETED; @@ -218,7 +246,7 @@ 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, + .init = fio_gf_setup, .cleanup = fio_gf_cleanup, .prep = fio_gf_prep, .queue = fio_gf_queue, @@ -227,7 +255,7 @@ static struct ioengine_ops ioengine = { .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)