]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: initial integration of ImageWriteback to AioImageRequest
authorJason Dillaman <dillaman@redhat.com>
Fri, 26 Aug 2016 14:33:39 +0000 (10:33 -0400)
committerJason Dillaman <dillaman@redhat.com>
Sat, 27 Aug 2016 23:37:37 +0000 (19:37 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/AioImageRequest.cc
src/librbd/AioImageRequest.h
src/librbd/cache/ImageWriteback.cc

index 4604741feb9906b8141786fa330954fa04d923ba..b41430cf573d1d02d5e085192699557c8c11a99e 100644 (file)
@@ -197,7 +197,11 @@ void AioImageRequest<I>::send() {
                  << "completion=" << aio_comp <<  dendl;
 
   aio_comp->get();
-  send_request();
+  if (m_bypass_image_cache || true) { // TODO
+    send_request();
+  } else {
+    send_image_cache_request();
+  }
 }
 
 template <typename I>
@@ -289,6 +293,11 @@ void AioImageRead<I>::send_request() {
   image_ctx.perfcounter->inc(l_librbd_rd_bytes, buffer_ofs);
 }
 
+template <typename I>
+void AioImageRead<I>::send_image_cache_request() {
+  // TODO
+}
+
 template <typename I>
 void AbstractAioImageWrite<I>::send_request() {
   I &image_ctx = this->m_image_ctx;
@@ -425,6 +434,11 @@ uint64_t AioImageWrite<I>::append_journal_event(
   return tid;
 }
 
+template <typename I>
+void AioImageWrite<I>::send_image_cache_request() {
+  // TODO
+}
+
 template <typename I>
 void AioImageWrite<I>::send_cache_requests(const ObjectExtents &object_extents,
                                         uint64_t journal_tid) {
@@ -525,6 +539,11 @@ uint32_t AioImageDiscard<I>::get_cache_request_count(bool journaling) const {
   return (image_ctx.object_cacher != nullptr && journaling ? 1 : 0);
 }
 
+template <typename I>
+void AioImageDiscard<I>::send_image_cache_request() {
+  // TODO
+}
+
 template <typename I>
 void AioImageDiscard<I>::send_cache_requests(const ObjectExtents &object_extents,
                                           uint64_t journal_tid) {
@@ -616,6 +635,11 @@ void AioImageFlush<I>::send_request() {
   image_ctx.perfcounter->inc(l_librbd_aio_flush);
 }
 
+template <typename I>
+void AioImageFlush<I>::send_image_cache_request() {
+  // TODO
+}
+
 } // namespace librbd
 
 template class librbd::AioImageRequest<librbd::ImageCtx>;
index 3d57cd408a85a0cec80929686e8c1a5cdd5bdcd9..f4dc57d2f2af53a736220603823384de7a44f81c 100644 (file)
@@ -48,12 +48,17 @@ public:
   void send();
   void fail(int r);
 
+  void set_bypass_image_cache() {
+    m_bypass_image_cache = true;
+  }
+
 protected:
   typedef std::list<AioObjectRequestHandle *> AioObjectRequests;
 
   ImageCtxT &m_image_ctx;
   AioCompletion *m_aio_comp;
   Extents m_image_extents;
+  bool m_bypass_image_cache = false;
 
   AioImageRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
                   Extents &&image_extents)
@@ -62,6 +67,8 @@ protected:
   }
 
   virtual void send_request() = 0;
+  virtual void send_image_cache_request() = 0;
+
   virtual aio_type_t get_aio_type() const = 0;
   virtual const char *get_request_type() const = 0;
 };
@@ -79,7 +86,9 @@ public:
   }
 
 protected:
-  virtual void send_request();
+  virtual void send_request() override;
+  virtual void send_image_cache_request() override;
+
   virtual aio_type_t get_aio_type() const {
     return AIO_TYPE_READ;
   }
@@ -171,6 +180,8 @@ protected:
 
   void assemble_extent(const ObjectExtent &object_extent, bufferlist *bl);
 
+  virtual void send_image_cache_request() override;
+
   virtual void send_cache_requests(const ObjectExtents &object_extents,
                                    uint64_t journal_tid);
 
@@ -209,6 +220,9 @@ protected:
   }
 
   virtual void prune_object_extents(ObjectExtents &object_extents) override;
+
+  virtual void send_image_cache_request() override;
+
   virtual uint32_t get_cache_request_count(bool journaling) const override;
   virtual void send_cache_requests(const ObjectExtents &object_extents,
                                    uint64_t journal_tid);
@@ -237,6 +251,8 @@ protected:
   using typename AioImageRequest<ImageCtxT>::AioObjectRequests;
 
   virtual void send_request();
+  virtual void send_image_cache_request() override;
+
   virtual aio_type_t get_aio_type() const {
     return AIO_TYPE_FLUSH;
   }
index 2bef71418e1dcbefe3c5a3fb1441c4b30b69f4e3..a787f89472f70760fe0b6ea7a8b60e3517189d82 100644 (file)
@@ -4,6 +4,7 @@
 #include "ImageWriteback.h"
 #include "include/buffer.h"
 #include "common/dout.h"
+#include "librbd/AioCompletion.h"
 #include "librbd/AioImageRequest.h"
 #include "librbd/ImageCtx.h"
 
@@ -25,7 +26,13 @@ void ImageWriteback<I>::aio_read(Extents &&image_extents, bufferlist *bl,
   ldout(cct, 20) << "image_extents=" << image_extents << ", "
                  << "on_finish=" << on_finish << dendl;
 
-  // TODO
+  AioCompletion *aio_comp = AioCompletion::create_and_start(on_finish,
+                                                            &m_image_ctx,
+                                                            AIO_TYPE_READ);
+  AioImageRead<I> req(m_image_ctx, aio_comp, std::move(image_extents), nullptr,
+                      bl, fadvise_flags);
+  req.set_bypass_image_cache();
+  req.send();
 }
 
 template <typename I>
@@ -36,7 +43,13 @@ void ImageWriteback<I>::aio_write(Extents &&image_extents,
   ldout(cct, 20) << "image_extents=" << image_extents << ", "
                  << "on_finish=" << on_finish << dendl;
 
-  // TODO
+  AioCompletion *aio_comp = AioCompletion::create_and_start(on_finish,
+                                                            &m_image_ctx,
+                                                            AIO_TYPE_WRITE);
+  AioImageWrite<I> req(m_image_ctx, aio_comp, std::move(image_extents),
+                       std::move(bl), fadvise_flags);
+  req.set_bypass_image_cache();
+  req.send();
 }
 
 template <typename I>
@@ -47,7 +60,12 @@ void ImageWriteback<I>::aio_discard(uint64_t offset, uint64_t length,
                  << "length=" << length << ", "
                 << "on_finish=" << on_finish << dendl;
 
-  // TODO
+  AioCompletion *aio_comp = AioCompletion::create_and_start(on_finish,
+                                                            &m_image_ctx,
+                                                            AIO_TYPE_DISCARD);
+  AioImageDiscard<I> req(m_image_ctx, aio_comp, offset, length);
+  req.set_bypass_image_cache();
+  req.send();
 }
 
 template <typename I>
@@ -55,7 +73,12 @@ void ImageWriteback<I>::aio_flush(Context *on_finish) {
   CephContext *cct = m_image_ctx.cct;
   ldout(cct, 20) << "on_finish=" << on_finish << dendl;
 
-  // TODO
+  AioCompletion *aio_comp = AioCompletion::create_and_start(on_finish,
+                                                            &m_image_ctx,
+                                                            AIO_TYPE_FLUSH);
+  AioImageFlush<I> req(m_image_ctx, aio_comp);
+  req.set_bypass_image_cache();
+  req.send();
 }
 
 } // namespace cache