Make rbd engine use aio flush
[fio.git] / engines / rbd.c
index dc6e7db674ba38c6252a61fde337f061938f0555..32ce60cfed4fb30239b6750bd91bd8b27bfaa2ee 100644 (file)
@@ -195,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;
@@ -281,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);
@@ -404,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;
@@ -426,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)