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;
}
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;
}
} 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);
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;
}
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)