From: Jason Dillaman Date: Thu, 19 Oct 2017 14:35:31 +0000 (-0400) Subject: librbd: sync flush should re-use existing async flush logic X-Git-Tag: v13.0.1~464^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a878eca9d89ac716fdb0f09a700025fd9004884a;p=ceph.git librbd: sync flush should re-use existing async flush logic Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 3918a76818190..4fbae675cc0df 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -374,8 +374,7 @@ struct C_InvalidateCache : public Context { plb.add_u64_counter(l_librbd_discard_bytes, "discard_bytes", "Discarded data"); plb.add_time_avg(l_librbd_discard_latency, "discard_latency", "Discard latency"); plb.add_u64_counter(l_librbd_flush, "flush", "Flushes"); - plb.add_u64_counter(l_librbd_aio_flush, "aio_flush", "Async flushes"); - plb.add_time_avg(l_librbd_aio_flush_latency, "aio_flush_latency", "Latency of async flushes"); + plb.add_time_avg(l_librbd_flush_latency, "flush_latency", "Latency of flushes"); plb.add_u64_counter(l_librbd_ws, "ws", "WriteSames"); plb.add_u64_counter(l_librbd_ws_bytes, "ws_bytes", "WriteSame data"); plb.add_time_avg(l_librbd_ws_latency, "ws_latency", "WriteSame latency"); diff --git a/src/librbd/LibrbdAdminSocketHook.cc b/src/librbd/LibrbdAdminSocketHook.cc index bda734ca948ea..02c4fb58f296b 100644 --- a/src/librbd/LibrbdAdminSocketHook.cc +++ b/src/librbd/LibrbdAdminSocketHook.cc @@ -6,6 +6,7 @@ #include "librbd/ImageCtx.h" #include "librbd/LibrbdAdminSocketHook.h" #include "librbd/internal.h" +#include "librbd/io/ImageRequestWQ.h" #define dout_subsys ceph_subsys_rbd #undef dout_prefix @@ -24,7 +25,7 @@ public: explicit FlushCacheCommand(ImageCtx *ictx) : ictx(ictx) {} bool call(stringstream *ss) override { - int r = flush(ictx); + int r = ictx->io_work_queue->flush(); if (r < 0) { *ss << "flush: " << cpp_strerror(r); return false; diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 9b322997014dc..6903fe8d83655 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -2221,28 +2221,6 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) { return 0; } - int flush(ImageCtx *ictx) - { - CephContext *cct = ictx->cct; - ldout(cct, 20) << "flush " << ictx << dendl; - - int r = ictx->state->refresh_if_required(); - if (r < 0) { - return r; - } - - ictx->user_flushed(); - C_SaferCond ctx; - { - RWLock::RLocker owner_locker(ictx->owner_lock); - ictx->flush(&ctx); - } - r = ctx.wait(); - - ictx->perfcounter->inc(l_librbd_flush); - return r; - } - int invalidate_cache(ImageCtx *ictx) { CephContext *cct = ictx->cct; diff --git a/src/librbd/internal.h b/src/librbd/internal.h index 72633f592ca3b..daedaa42e2fa9 100644 --- a/src/librbd/internal.h +++ b/src/librbd/internal.h @@ -30,9 +30,7 @@ enum { l_librbd_discard_bytes, l_librbd_discard_latency, l_librbd_flush, - - l_librbd_aio_flush, - l_librbd_aio_flush_latency, + l_librbd_flush_latency, l_librbd_ws, l_librbd_ws_bytes, l_librbd_ws_latency, @@ -205,7 +203,6 @@ namespace librbd { void readahead(ImageCtx *ictx, const vector >& image_extents); - int flush(ImageCtx *ictx); int invalidate_cache(ImageCtx *ictx); int poll_io_events(ImageCtx *ictx, io::AioCompletion **comps, int numcomp); int metadata_list(ImageCtx *ictx, const string &last, uint64_t max, map *pairs); diff --git a/src/librbd/io/AioCompletion.cc b/src/librbd/io/AioCompletion.cc index 8fa067e1b63a5..e668ecd9cc709 100644 --- a/src/librbd/io/AioCompletion.cc +++ b/src/librbd/io/AioCompletion.cc @@ -71,7 +71,7 @@ void AioCompletion::complete() { case AIO_TYPE_DISCARD: ictx->perfcounter->tinc(l_librbd_discard_latency, elapsed); break; case AIO_TYPE_FLUSH: - ictx->perfcounter->tinc(l_librbd_aio_flush_latency, elapsed); break; + ictx->perfcounter->tinc(l_librbd_flush_latency, elapsed); break; case AIO_TYPE_WRITESAME: ictx->perfcounter->tinc(l_librbd_ws_latency, elapsed); break; case AIO_TYPE_COMPARE_AND_WRITE: diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index cd87d92e07479..e1d1692da1678 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -750,7 +750,7 @@ void ImageFlushRequest::send_request() { aio_comp->put(); } - image_ctx.perfcounter->inc(l_librbd_aio_flush); + image_ctx.perfcounter->inc(l_librbd_flush); } template diff --git a/src/librbd/io/ImageRequestWQ.cc b/src/librbd/io/ImageRequestWQ.cc index 81800cc4ae73c..7f479f45e96cb 100644 --- a/src/librbd/io/ImageRequestWQ.cc +++ b/src/librbd/io/ImageRequestWQ.cc @@ -194,6 +194,23 @@ ssize_t ImageRequestWQ::compare_and_write(uint64_t off, uint64_t len, return len; } +template +int ImageRequestWQ::flush() { + CephContext *cct = m_image_ctx.cct; + ldout(cct, 20) << "ictx=" << &m_image_ctx << dendl; + + C_SaferCond cond; + AioCompletion *c = AioCompletion::create(&cond); + aio_flush(c, false); + + int r = cond.wait(); + if (r < 0) { + return r; + } + + return 0; +} + template void ImageRequestWQ::aio_read(AioCompletion *c, uint64_t off, uint64_t len, ReadResult &&read_result, int op_flags, diff --git a/src/librbd/io/ImageRequestWQ.h b/src/librbd/io/ImageRequestWQ.h index ad51b0f2c9f64..5c5fc911c0f74 100644 --- a/src/librbd/io/ImageRequestWQ.h +++ b/src/librbd/io/ImageRequestWQ.h @@ -37,6 +37,7 @@ public: ssize_t compare_and_write(uint64_t off, uint64_t len, bufferlist &&cmp_bl, bufferlist &&bl, uint64_t *mismatch_off, int op_flags); + int flush(); void aio_read(AioCompletion *c, uint64_t off, uint64_t len, ReadResult &&read_result, int op_flags, bool native_async=true); diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 999ac25233aa0..e65330c2580de 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -1729,7 +1729,7 @@ namespace librbd { { ImageCtx *ictx = (ImageCtx *)ctx; tracepoint(librbd, flush_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only); - int r = librbd::flush(ictx); + int r = ictx->io_work_queue->flush(); tracepoint(librbd, flush_exit, r); return r; } @@ -3771,7 +3771,7 @@ extern "C" int rbd_flush(rbd_image_t image) { librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; tracepoint(librbd, flush_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only); - int r = librbd::flush(ictx); + int r = ictx->io_work_queue->flush(); tracepoint(librbd, flush_exit, r); return r; } diff --git a/src/test/librbd/test_internal.cc b/src/test/librbd/test_internal.cc index f3c5d28b0d213..d9cc73458cfe7 100644 --- a/src/test/librbd/test_internal.cc +++ b/src/test/librbd/test_internal.cc @@ -905,7 +905,7 @@ TEST_F(TestInternal, WriteFullCopyup) { bl.append(std::string(1 << ictx->order, '1')); ASSERT_EQ((ssize_t)bl.length(), ictx->io_work_queue->write(0, bl.length(), bufferlist{bl}, 0)); - ASSERT_EQ(0, librbd::flush(ictx)); + ASSERT_EQ(0, ictx->io_work_queue->flush()); ASSERT_EQ(0, create_snapshot("snap1", true));