From: Jason Dillaman Date: Thu, 9 Apr 2015 00:18:50 +0000 (-0400) Subject: librbd: add new fail method to AioCompletion X-Git-Tag: v0.80.11~58^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8ec341ee8f256e8ab91a931f6005e1ebd4b1db60;p=ceph.git librbd: add new fail method to AioCompletion Helper method to handle passing fatal errors generated within librbd (not from the OSDs) back to the client. Signed-off-by: Jason Dillaman (cherry picked from commit 6d1d0c867855a96bee4c13a0c0a39a0e002ccd12) Conflicts: src/librbd/AioCompletion.cc: trivial resolution src/librbd/AioCompletion.h: trivial resolution --- diff --git a/src/librbd/AioCompletion.cc b/src/librbd/AioCompletion.cc index 86b5b504ebd..e818674babc 100644 --- a/src/librbd/AioCompletion.cc +++ b/src/librbd/AioCompletion.cc @@ -5,6 +5,7 @@ #include "common/ceph_context.h" #include "common/dout.h" +#include "common/errno.h" #include "librbd/AioRequest.h" #include "librbd/internal.h" @@ -25,7 +26,7 @@ namespace librbd { building = false; if (!pending_count) { finalize(cct, rval); - complete(); + complete(cct); } lock.Unlock(); } @@ -54,6 +55,49 @@ namespace librbd { } } + void AioCompletion::complete(CephContext *cct) { + utime_t elapsed; + assert(lock.is_locked()); + elapsed = ceph_clock_now(cct) - start_time; + switch (aio_type) { + case AIO_TYPE_READ: + ictx->perfcounter->tinc(l_librbd_aio_rd_latency, elapsed); break; + case AIO_TYPE_WRITE: + ictx->perfcounter->tinc(l_librbd_aio_wr_latency, elapsed); break; + case AIO_TYPE_DISCARD: + ictx->perfcounter->tinc(l_librbd_aio_discard_latency, elapsed); break; + case AIO_TYPE_FLUSH: + ictx->perfcounter->tinc(l_librbd_aio_flush_latency, elapsed); break; + default: + lderr(cct) << "completed invalid aio_type: " << aio_type << dendl; + break; + } + + if (ictx != NULL) { + Mutex::Locker l(ictx->aio_lock); + assert(ictx->pending_aio != 0); + --ictx->pending_aio; + ictx->pending_aio_cond.Signal(); + } + + if (complete_cb) { + complete_cb(rbd_comp, complete_arg); + } + done = true; + cond.Signal(); + } + + void AioCompletion::fail(CephContext *cct, int r) + { + lderr(cct) << "AioCompletion::fail() " << this << ": " << cpp_strerror(r) + << dendl; + lock.Lock(); + assert(pending_count == 0); + rval = r; + complete(cct); + put_unlock(); + } + void AioCompletion::complete_request(CephContext *cct, ssize_t r) { ldout(cct, 20) << "AioCompletion::complete_request() " @@ -70,7 +114,7 @@ namespace librbd { int count = --pending_count; if (!count && !building) { finalize(cct, rval); - complete(); + complete(cct); } put_unlock(); } diff --git a/src/librbd/AioCompletion.h b/src/librbd/AioCompletion.h index e28cd6a0605..4dbad521a91 100644 --- a/src/librbd/AioCompletion.h +++ b/src/librbd/AioCompletion.h @@ -101,37 +101,8 @@ namespace librbd { start_time = ceph_clock_now(ictx->cct); } - void complete() { - utime_t elapsed; - assert(lock.is_locked()); - elapsed = ceph_clock_now(ictx->cct) - start_time; - switch (aio_type) { - case AIO_TYPE_READ: - ictx->perfcounter->tinc(l_librbd_aio_rd_latency, elapsed); break; - case AIO_TYPE_WRITE: - ictx->perfcounter->tinc(l_librbd_aio_wr_latency, elapsed); break; - case AIO_TYPE_DISCARD: - ictx->perfcounter->tinc(l_librbd_aio_discard_latency, elapsed); break; - case AIO_TYPE_FLUSH: - ictx->perfcounter->tinc(l_librbd_aio_flush_latency, elapsed); break; - default: - lderr(ictx->cct) << "completed invalid aio_type: " << aio_type << dendl; - break; - } - - { - Mutex::Locker l(ictx->aio_lock); - assert(ictx->pending_aio != 0); - --ictx->pending_aio; - ictx->pending_aio_cond.Signal(); - } - - if (complete_cb) { - complete_cb(rbd_comp, complete_arg); - } - done = true; - cond.Signal(); - } + void complete(CephContext *cct); + void fail(CephContext *cct, int r); void set_complete_cb(void *cb_arg, callback_t cb) { complete_cb = cb;