X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=engines%2Frbd.c;h=32ce60cfed4fb30239b6750bd91bd8b27bfaa2ee;hp=9d64efd233cab1dfd4188f8ada16351d649c8f5e;hb=82340a9fb6da0c4cc6a213bfc575c69bfa702712;hpb=c0c4b1d42e39c2ea4cb2d58e5a17aec4b00263d9 diff --git a/engines/rbd.c b/engines/rbd.c index 9d64efd2..32ce60cf 100644 --- a/engines/rbd.c +++ b/engines/rbd.c @@ -131,8 +131,10 @@ static int _fio_rbd_connect(struct thread_data *td) failed_open: rados_ioctx_destroy(rbd_data->io_ctx); + rbd_data->io_ctx = NULL; failed_shutdown: rados_shutdown(rbd_data->cluster); + rbd_data->cluster = NULL; failed_early: return 1; } @@ -193,6 +195,23 @@ static void _fio_rbd_finish_read_aiocb(rbd_completion_t comp, void *data) return; } +static void _fio_rbd_finish_sync_aiocb(rbd_completion_t comp, void *data) +{ + struct io_u *io_u = (struct io_u *)data; + struct fio_rbd_iou *fio_rbd_iou = + (struct fio_rbd_iou *)io_u->engine_data; + + fio_rbd_iou->io_complete = 1; + + /* if sync needs to be verified - we should not release comp here + without fetching the result */ + rbd_aio_release(comp); + + /* TODO handle error */ + + return; +} + static struct io_u *fio_rbd_event(struct thread_data *td, int event) { struct rbd_data *rbd_data = td->io_ops->data; @@ -279,13 +298,22 @@ static int fio_rbd_queue(struct thread_data *td, struct io_u *io_u) } } else if (io_u->ddir == DDIR_SYNC) { - r = rbd_flush(rbd_data->image); + r = rbd_aio_create_completion(io_u, + (rbd_callback_t) + _fio_rbd_finish_sync_aiocb, + &comp); + if (r < 0) { + log_err + ("rbd_aio_create_completion for DDIR_SYNC failed.\n"); + goto failed; + } + + r = rbd_aio_flush(rbd_data->image, comp); if (r < 0) { log_err("rbd_flush failed.\n"); goto failed; } - return FIO_Q_COMPLETED; } else { dprint(FD_IO, "%s: Warning: unhandled ddir: %d\n", __func__, io_u->ddir); @@ -379,6 +407,7 @@ static int fio_rbd_setup(struct thread_data *td) if (!td->files_index) { add_file(td, td->o.filename ? : "rbd", 0, 0); td->o.nr_files = td->o.nr_files ? : 1; + td->o.open_files++; } f = td->files[0]; f->real_file_size = info.size; @@ -401,6 +430,11 @@ static int fio_rbd_open(struct thread_data *td, struct fio_file *f) return 0; } +static int fio_rbd_invalidate(struct thread_data *td, struct fio_file *f) +{ + return 0; +} + static void fio_rbd_io_u_free(struct thread_data *td, struct io_u *io_u) { struct fio_rbd_iou *o = io_u->engine_data; @@ -423,19 +457,20 @@ static int fio_rbd_io_u_init(struct thread_data *td, struct io_u *io_u) } static struct ioengine_ops ioengine = { - .name = "rbd", - .version = FIO_IOOPS_VERSION, - .setup = fio_rbd_setup, - .init = fio_rbd_init, - .queue = fio_rbd_queue, - .getevents = fio_rbd_getevents, - .event = fio_rbd_event, - .cleanup = fio_rbd_cleanup, - .open_file = fio_rbd_open, - .options = options, - .io_u_init = fio_rbd_io_u_init, - .io_u_free = fio_rbd_io_u_free, - .option_struct_size = sizeof(struct rbd_options), + .name = "rbd", + .version = FIO_IOOPS_VERSION, + .setup = fio_rbd_setup, + .init = fio_rbd_init, + .queue = fio_rbd_queue, + .getevents = fio_rbd_getevents, + .event = fio_rbd_event, + .cleanup = fio_rbd_cleanup, + .open_file = fio_rbd_open, + .invalidate = fio_rbd_invalidate, + .options = options, + .io_u_init = fio_rbd_io_u_init, + .io_u_free = fio_rbd_io_u_free, + .option_struct_size = sizeof(struct rbd_options), }; static void fio_init fio_rbd_register(void)