From e57274ee2a51e100579dadae88eb3c61e4fb1642 Mon Sep 17 00:00:00 2001 From: Pan Liu Date: Wed, 6 Sep 2017 18:09:55 +0800 Subject: [PATCH] os/bluestore: report error and quit correctly when disk error happens. Signed-off-by: Pan Liu (cherry picked from commit ed3175895fa92929089f7507e7d173f557d61e27) --- src/os/bluestore/KernelDevice.cc | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/os/bluestore/KernelDevice.cc b/src/os/bluestore/KernelDevice.cc index 05e46311949a0..4dd2f9ca03e47 100644 --- a/src/os/bluestore/KernelDevice.cc +++ b/src/os/bluestore/KernelDevice.cc @@ -350,6 +350,7 @@ void KernelDevice::_aio_thread() aio, max); if (r < 0) { derr << __func__ << " got " << cpp_strerror(r) << dendl; + assert(0 == "got unexpected error from io_getevents"); } if (r > 0) { dout(30) << __func__ << " got " << r << " completed aios" << dendl; @@ -370,11 +371,21 @@ void KernelDevice::_aio_thread() io_since_flush.store(true); int r = aio[i]->get_return_value(); - dout(10) << __func__ << " finished aio " << aio[i] << " r " << r - << " ioc " << ioc - << " with " << (ioc->num_running.load() - 1) - << " aios left" << dendl; - assert(r >= 0); + if (r < 0) { + derr << __func__ << " got " << cpp_strerror(r) << dendl; + assert(0 == "got unexpected error from io_getevents"); + } + + if (aio[i]->length != (uint64_t)r) { + derr << "aio to " << aio[i]->offset << "~" << aio[i]->length + << " but returned: " << r << dendl; + assert(0 == "unexpected aio error"); + } + + dout(10) << __func__ << " finished aio " << aio[i] << " r " << r + << " ioc " << ioc + << " with " << (ioc->num_running.load() - 1) + << " aios left" << dendl; // NOTE: once num_running and we either call the callback or // call aio_wake we cannot touch ioc or aio[] as the caller -- 2.39.5