]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: skeleton implementation of image snap list dispatch hooks
authorJason Dillaman <dillaman@redhat.com>
Tue, 1 Sep 2020 18:37:55 +0000 (14:37 -0400)
committerJason Dillaman <dillaman@redhat.com>
Mon, 21 Sep 2020 11:51:55 +0000 (07:51 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/exclusive_lock/ImageDispatch.h
src/librbd/io/ImageDispatch.cc
src/librbd/io/ImageDispatch.h
src/librbd/io/ImageDispatchInterface.h
src/librbd/io/ImageDispatchSpec.h
src/librbd/io/ImageDispatcher.cc
src/librbd/io/QosImageDispatch.h
src/librbd/io/QueueImageDispatch.h
src/librbd/io/RefreshImageDispatch.h
src/librbd/io/WriteBlockImageDispatch.h
src/test/librbd/mock/io/MockImageDispatch.h

index 6e65e728db27a39330023333942d1fd588cde196..1ce28a21cfc07bc50c14880083e0ab7d3568fe41 100644 (file)
@@ -89,6 +89,16 @@ public:
       io::DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
+  bool list_snaps(
+      io::AioCompletion* aio_comp, io::Extents&& image_extents,
+      io::SnapIds&& snap_ids, int list_snaps_flags,
+      io::SnapshotDelta* snapshot_delta, const ZTracer::Trace &parent_trace,
+      uint64_t tid, std::atomic<uint32_t>* image_dispatch_flags,
+      io::DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
 private:
   typedef std::list<Context*> Contexts;
   typedef std::unordered_set<uint64_t> Tids;
index 8ae0c18acbaa27cb5dd3899c5d6889313093aa0b..161dac5025602441230d95a74d8e16319af434ad 100644 (file)
@@ -145,6 +145,27 @@ bool ImageDispatch<I>::flush(
   return true;
 }
 
+template <typename I>
+bool ImageDispatch<I>::list_snaps(
+    AioCompletion* aio_comp, Extents&& image_extents, SnapIds&& snap_ids,
+    int list_snaps_flags, SnapshotDelta* snapshot_delta,
+    const ZTracer::Trace &parent_trace, uint64_t tid,
+    std::atomic<uint32_t>* image_dispatch_flags,
+    DispatchResult* dispatch_result, Context** on_finish,
+    Context* on_dispatched) {
+  auto cct = m_image_ctx->cct;
+  ldout(cct, 20) << dendl;
+
+  start_in_flight_io(aio_comp);
+
+  *dispatch_result = DISPATCH_RESULT_COMPLETE;
+  ImageListSnapsRequest<I> req(
+    *m_image_ctx, aio_comp, std::move(image_extents), std::move(snap_ids),
+    list_snaps_flags, snapshot_delta, parent_trace);
+  req.send();
+  return true;
+}
+
 } // namespace io
 } // namespace librbd
 
index 17e9724ae2e7c4561a9b5ff9f203f4e09bd2e352..d12d9e7c79d980a4ac7d6f34c1ad7b23ea9730e7 100644 (file)
@@ -73,6 +73,14 @@ public:
       DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
+  bool list_snaps(
+      AioCompletion* aio_comp, Extents&& image_extents, SnapIds&& snap_ids,
+      int list_snaps_flags, SnapshotDelta* snapshot_delta,
+      const ZTracer::Trace &parent_trace, uint64_t tid,
+      std::atomic<uint32_t>* image_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override;
+
 private:
   ImageCtxT* m_image_ctx;
 
index 0a1bc58a3510cc07a1afb688cbed73edfbc95646..973f6fe13ee1d7e4da2989ebd1042055a10ac4b5 100644 (file)
@@ -71,6 +71,14 @@ struct ImageDispatchInterface {
       DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) = 0;
 
+  virtual bool list_snaps(
+      AioCompletion* aio_comp, Extents&& image_extents, SnapIds&& snap_ids,
+      int list_snaps_flags, SnapshotDelta* snapshot_delta,
+      const ZTracer::Trace &parent_trace, uint64_t tid,
+      std::atomic<uint32_t>* image_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) = 0;
+
 };
 
 } // namespace io
index 5ea0af33934e38e1702b7166b07236e0a6ac0d44..4ed8788092f4fe0e6c4ca1cfe305d3ed182d711a 100644 (file)
@@ -85,12 +85,25 @@ public:
     }
   };
 
+  struct ListSnaps {
+    SnapIds snap_ids;
+    int list_snaps_flags;
+    SnapshotDelta* snapshot_delta;
+
+    ListSnaps(SnapIds&& snap_ids, int list_snaps_flags,
+              SnapshotDelta* snapshot_delta)
+      : snap_ids(std::move(snap_ids)), list_snaps_flags(list_snaps_flags),
+        snapshot_delta(snapshot_delta) {
+    }
+  };
+
   typedef boost::variant<Read,
                          Discard,
                          Write,
                          WriteSame,
                          CompareAndWrite,
-                         Flush> Request;
+                         Flush,
+                         ListSnaps> Request;
 
   C_Dispatcher dispatcher_ctx;
 
@@ -181,6 +194,20 @@ public:
                                  Flush{flush_source}, {}, 0, parent_trace);
   }
 
+  template <typename ImageCtxT = ImageCtx>
+  static ImageDispatchSpec* create_list_snaps(
+      ImageCtxT &image_ctx, ImageDispatchLayer image_dispatch_layer,
+      AioCompletion *aio_comp, Extents &&image_extents, SnapIds&& snap_ids,
+      int list_snaps_flags, SnapshotDelta* snapshot_delta,
+      const ZTracer::Trace &parent_trace) {
+    return new ImageDispatchSpec(image_ctx.io_image_dispatcher,
+                                 image_dispatch_layer, aio_comp,
+                                 std::move(image_extents),
+                                 ListSnaps{std::move(snap_ids),
+                                           list_snaps_flags, snapshot_delta},
+                                 {}, 0, parent_trace);
+  }
+
   ~ImageDispatchSpec() {
     aio_comp->put();
   }
index 3c155a2454eeeef3576e2f74fd63a1afd57d4700..728baf24a08daa7d66ae883c9fb2056faaabcaab 100644 (file)
@@ -108,6 +108,18 @@ struct ImageDispatcher<I>::SendVisitor : public boost::static_visitor<bool> {
       &image_dispatch_spec->aio_comp->image_dispatcher_ctx,
       &image_dispatch_spec->dispatcher_ctx);
   }
+
+  bool operator()(ImageDispatchSpec::ListSnaps& list_snaps) const {
+    return image_dispatch->list_snaps(
+      image_dispatch_spec->aio_comp,
+      std::move(image_dispatch_spec->image_extents),
+      std::move(list_snaps.snap_ids), list_snaps.list_snaps_flags,
+      list_snaps.snapshot_delta, image_dispatch_spec->parent_trace,
+      image_dispatch_spec->tid, &image_dispatch_spec->image_dispatch_flags,
+      &image_dispatch_spec->dispatch_result,
+      &image_dispatch_spec->aio_comp->image_dispatcher_ctx,
+      &image_dispatch_spec->dispatcher_ctx);
+  }
 };
 
 template <typename I>
index 77c1aae1f892ab0c65b6ac26c4458f27a950799c..9e73ddf8ce900be802c5b0ce79fc5f84c042179e 100644 (file)
@@ -90,6 +90,16 @@ public:
       DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
+  bool list_snaps(
+      AioCompletion* aio_comp, Extents&& image_extents, SnapIds&& snap_ids,
+      int list_snaps_flags, SnapshotDelta* snapshot_delta,
+      const ZTracer::Trace &parent_trace, uint64_t tid,
+      std::atomic<uint32_t>* image_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
 private:
   ImageCtxT* m_image_ctx;
 
index d4d5ee0eed18a9add5c0aa1abbb682e2f89501ea..83a683ff2716785a43f7a8bd14b653b7296ba8f7 100644 (file)
@@ -77,6 +77,16 @@ public:
       DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
+  bool list_snaps(
+      AioCompletion* aio_comp, Extents&& image_extents, SnapIds&& snap_ids,
+      int list_snaps_flags, SnapshotDelta* snapshot_delta,
+      const ZTracer::Trace &parent_trace, uint64_t tid,
+      std::atomic<uint32_t>* image_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
 private:
   ImageCtxT* m_image_ctx;
 
index 024a3dbc8c19549acda2b20d1b53628463afd6d6..976960cc4bf9941208675c36f46a1abd34e29c2f 100644 (file)
@@ -73,6 +73,16 @@ public:
       DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
+  bool list_snaps(
+      AioCompletion* aio_comp, Extents&& image_extents, SnapIds&& snap_ids,
+      int list_snaps_flags, SnapshotDelta* snapshot_delta,
+      const ZTracer::Trace &parent_trace, uint64_t tid,
+      std::atomic<uint32_t>* image_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
 private:
   ImageCtxT* m_image_ctx;
 
index f93802728c67d3df73fbf8b475010926d39c208f..4af6e25eb14a450f0988b7e0e8bae5902c014ec7 100644 (file)
@@ -88,6 +88,16 @@ public:
       DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
+  bool list_snaps(
+      AioCompletion* aio_comp, Extents&& image_extents, SnapIds&& snap_ids,
+      int list_snaps_flags, SnapshotDelta* snapshot_delta,
+      const ZTracer::Trace &parent_trace, uint64_t tid,
+      std::atomic<uint32_t>* image_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
 private:
   struct C_BlockedWrites;
 
index 4b9b78d05354fd5673b44010fdc5e2631339024b..40804d2431ca02254d89e6125dd1d1a3c010834a 100644 (file)
@@ -77,6 +77,16 @@ public:
     return false;
   }
 
+  bool list_snaps(
+      AioCompletion* aio_comp, Extents&& image_extents, SnapIds&& snap_ids,
+      int list_snaps_flags, SnapshotDelta* snapshot_delta,
+      const ZTracer::Trace &parent_trace, uint64_t tid,
+      std::atomic<uint32_t>* image_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
 };
 
 } // namespace io