fio_plugin: add proper I/O error handling
When an I/O failed to be issued, fio used to freeze entirely. From the fio perspective, that I/O was never being completed. Fio expected us to complete it during the I/O thread cleanup & shutdown. (spdk_fio_getevents, line 578) This patch makes the I/O issue callback complete the I/O immediately on any encountered error. Return codes are now properly propagated with io_u->error field. This also allows some additional error messages to be printed. Change-Id: I9fc3cb6c6a946b78fc8384701827a815103ed4c6 Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com> Reviewed-on: https://review.gerrithub.io/392534 Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Paweł Niedźwiecki <pawelx.niedzwiecki@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
parent
3d28498af9
commit
761325e2fb
@ -473,6 +473,7 @@ spdk_fio_completion_cb(struct spdk_bdev_io *bdev_io,
|
|||||||
struct spdk_fio_thread *fio_thread = td->io_ops_data;
|
struct spdk_fio_thread *fio_thread = td->io_ops_data;
|
||||||
|
|
||||||
assert(fio_thread->iocq_count < fio_thread->iocq_size);
|
assert(fio_thread->iocq_count < fio_thread->iocq_size);
|
||||||
|
fio_req->io->error = success ? 0 : EIO;
|
||||||
fio_thread->iocq[fio_thread->iocq_count++] = fio_req->io;
|
fio_thread->iocq[fio_thread->iocq_count++] = fio_req->io;
|
||||||
|
|
||||||
spdk_bdev_free_io(bdev_io);
|
spdk_bdev_free_io(bdev_io);
|
||||||
@ -489,7 +490,8 @@ spdk_fio_queue(struct thread_data *td, struct io_u *io_u)
|
|||||||
|
|
||||||
if (!target) {
|
if (!target) {
|
||||||
SPDK_ERRLOG("Unable to look up correct I/O target.\n");
|
SPDK_ERRLOG("Unable to look up correct I/O target.\n");
|
||||||
return -1;
|
fio_req->io->error = ENODEV;
|
||||||
|
return FIO_Q_COMPLETED;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (io_u->ddir) {
|
switch (io_u->ddir) {
|
||||||
@ -518,7 +520,8 @@ spdk_fio_queue(struct thread_data *td, struct io_u *io_u)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
return -abs(rc);
|
fio_req->io->error = abs(rc);
|
||||||
|
return FIO_Q_COMPLETED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FIO_Q_QUEUED;
|
return FIO_Q_QUEUED;
|
||||||
|
Loading…
Reference in New Issue
Block a user