From 0c1e8f3cefd94b064921312849e19405f345368e Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 26 Aug 2016 13:48:23 -0400 Subject: [PATCH] librbd: integrate image cache hooks into IO path Signed-off-by: Jason Dillaman --- src/librbd/AioImageRequest.cc | 41 +++++++++++++++++--- src/librbd/ImageCtx.h | 2 + src/test/librbd/mock/MockImageCtx.h | 4 +- src/test/librbd/mock/cache/MockImageCache.h | 38 ++++++++++++++++++ src/test/librbd/test_mock_AioImageRequest.cc | 1 + 5 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 src/test/librbd/mock/cache/MockImageCache.h diff --git a/src/librbd/AioImageRequest.cc b/src/librbd/AioImageRequest.cc index 984e6c69c7e2bd..72abba52a83d9f 100644 --- a/src/librbd/AioImageRequest.cc +++ b/src/librbd/AioImageRequest.cc @@ -8,6 +8,7 @@ #include "librbd/internal.h" #include "librbd/Journal.h" #include "librbd/Utils.h" +#include "librbd/cache/ImageCache.h" #include "librbd/journal/Types.h" #include "include/rados/librados.hpp" #include "common/WorkQueue.h" @@ -241,7 +242,7 @@ void AioImageRequest::send() { return; } - if (m_bypass_image_cache || true) { // TODO + if (m_bypass_image_cache || m_image_ctx.image_cache == nullptr) { send_request(); } else { send_image_cache_request(); @@ -349,7 +350,16 @@ void AioImageRead::send_request() { template void AioImageRead::send_image_cache_request() { - // TODO + I &image_ctx = this->m_image_ctx; + assert(image_ctx.image_cache != nullptr); + + AioCompletion *aio_comp = this->m_aio_comp; + aio_comp->set_request_count(1); + C_ImageCacheRead *req_comp = new C_ImageCacheRead( + aio_comp, this->m_image_extents); + image_ctx.image_cache->aio_read(std::move(this->m_image_extents), + &req_comp->get_data(), m_op_flags, + req_comp); } template @@ -483,7 +493,14 @@ uint64_t AioImageWrite::append_journal_event( template void AioImageWrite::send_image_cache_request() { - // TODO + I &image_ctx = this->m_image_ctx; + assert(image_ctx.image_cache != nullptr); + + AioCompletion *aio_comp = this->m_aio_comp; + aio_comp->set_request_count(1); + C_AioRequest *req_comp = new C_AioRequest(aio_comp); + image_ctx.image_cache->aio_write(std::move(this->m_image_extents), + std::move(m_bl), m_op_flags, req_comp); } template @@ -588,7 +605,15 @@ uint32_t AioImageDiscard::get_object_cache_request_count(bool journaling) con template void AioImageDiscard::send_image_cache_request() { - // TODO + I &image_ctx = this->m_image_ctx; + assert(image_ctx.image_cache != nullptr); + + AioCompletion *aio_comp = this->m_aio_comp; + aio_comp->set_request_count(this->m_image_extents.size()); + for (auto &extent : this->m_image_extents) { + C_AioRequest *req_comp = new C_AioRequest(aio_comp); + image_ctx.image_cache->aio_discard(extent.first, extent.second, req_comp); + } } template @@ -684,7 +709,13 @@ void AioImageFlush::send_request() { template void AioImageFlush::send_image_cache_request() { - // TODO + I &image_ctx = this->m_image_ctx; + assert(image_ctx.image_cache != nullptr); + + AioCompletion *aio_comp = this->m_aio_comp; + aio_comp->set_request_count(1); + C_AioRequest *req_comp = new C_AioRequest(aio_comp); + image_ctx.image_cache->aio_flush(req_comp); } } // namespace librbd diff --git a/src/librbd/ImageCtx.h b/src/librbd/ImageCtx.h index 6c79f80ea74bab..b7a7eeae027421 100644 --- a/src/librbd/ImageCtx.h +++ b/src/librbd/ImageCtx.h @@ -51,6 +51,7 @@ namespace librbd { template class Operations; class LibrbdWriteback; + namespace cache { struct ImageCache; } namespace exclusive_lock { struct Policy; } namespace journal { struct Policy; } @@ -127,6 +128,7 @@ namespace librbd { file_layout_t layout; + cache::ImageCache *image_cache = nullptr; ObjectCacher *object_cacher; LibrbdWriteback *writeback_handler; ObjectCacher::ObjectSet *object_set; diff --git a/src/test/librbd/mock/MockImageCtx.h b/src/test/librbd/mock/MockImageCtx.h index bf1ee539e09720..e762fe6fba93cc 100644 --- a/src/test/librbd/mock/MockImageCtx.h +++ b/src/test/librbd/mock/MockImageCtx.h @@ -22,6 +22,7 @@ namespace librbd { +namespace cache { class MockImageCache; } namespace operation { template class ResizeRequest; } @@ -231,10 +232,11 @@ struct MockImageCtx { xlist*> async_requests; std::list async_requests_waiters; - MockAioImageRequestWQ *aio_work_queue; MockContextWQ *op_work_queue; + cache::MockImageCache *image_cache = nullptr; + MockReadahead readahead; uint64_t readahead_max_bytes; diff --git a/src/test/librbd/mock/cache/MockImageCache.h b/src/test/librbd/mock/cache/MockImageCache.h new file mode 100644 index 00000000000000..4969c035009f78 --- /dev/null +++ b/src/test/librbd/mock/cache/MockImageCache.h @@ -0,0 +1,38 @@ +// -*- mode:C; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#ifndef CEPH_TEST_LIBRBD_CACHE_MOCK_IMAGE_CACHE_H +#define CEPH_TEST_LIBRBD_CACHE_MOCK_IMAGE_CACHE_H + +#include "gmock/gmock.h" +#include + +namespace librbd { +namespace cache { + +struct MockImageCache { + typedef std::vector > Extents; + + MOCK_METHOD4(aio_read_mock, void(const Extents &, ceph::bufferlist*, int, + Context *)); + void aio_read(Extents&& image_extents, ceph::bufferlist* bl, + int fadvise_flags, Context *on_finish) { + aio_read_mock(image_extents, bl, fadvise_flags, on_finish); + } + + + MOCK_METHOD4(aio_write_mock, void(const Extents &, const ceph::bufferlist &, + int, Context *)); + void aio_write(Extents&& image_extents, ceph::bufferlist&& bl, + int fadvise_flags, Context *on_finish) { + aio_write_mock(image_extents, bl, fadvise_flags, on_finish); + } + + MOCK_METHOD3(aio_discard, void(uint64_t, uint64_t, Context *)); + MOCK_METHOD1(aio_flush, void(Context *)); +}; + +} // namespace cache +} // namespace librbd + +#endif // CEPH_TEST_LIBRBD_CACHE_MOCK_IMAGE_CACHE_H diff --git a/src/test/librbd/test_mock_AioImageRequest.cc b/src/test/librbd/test_mock_AioImageRequest.cc index dd64b5f28a8865..8e91b72a15d2d1 100644 --- a/src/test/librbd/test_mock_AioImageRequest.cc +++ b/src/test/librbd/test_mock_AioImageRequest.cc @@ -5,6 +5,7 @@ #include "test/librbd/test_support.h" #include "test/librbd/mock/MockImageCtx.h" #include "test/librbd/mock/MockJournal.h" +#include "test/librbd/mock/cache/MockImageCache.h" #include "librbd/AioImageRequest.h" #include "librbd/AioObjectRequest.h"