]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: skeleton implementation of object snap list dispatch hooks
authorJason Dillaman <dillaman@redhat.com>
Tue, 1 Sep 2020 20:49:34 +0000 (16:49 -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>
12 files changed:
src/librbd/cache/ObjectCacherObjectDispatch.h
src/librbd/cache/ParentCacheObjectDispatch.h
src/librbd/cache/WriteAroundObjectDispatch.h
src/librbd/crypto/CryptoObjectDispatch.h
src/librbd/io/ObjectDispatch.cc
src/librbd/io/ObjectDispatch.h
src/librbd/io/ObjectDispatchInterface.h
src/librbd/io/ObjectDispatchSpec.h
src/librbd/io/ObjectDispatcher.cc
src/librbd/io/SimpleSchedulerObjectDispatch.h
src/librbd/journal/ObjectDispatch.h
src/test/librbd/mock/io/MockObjectDispatch.h

index fb8be857d9ee5f894eb2cf1e2d7ad65c105872bf..ece4a75146721e44e41b918ed6fe03f309820954 100644 (file)
@@ -85,6 +85,15 @@ public:
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
+  bool list_snaps(
+      uint64_t object_no, io::Extents&& extents, io::SnapIds&& snap_ids,
+      int list_snap_flags, const ZTracer::Trace &parent_trace,
+      io::SnapshotDelta* snapshot_delta, int* object_dispatch_flags,
+      io::DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
   bool invalidate_cache(Context* on_finish) override;
   bool reset_existence_cache(Context* on_finish) override;
 
index db5df8d0fe192f9de0f8478cbc7564b40c193d83..603ae252fdfaeecfdbd4ca44935aeaf0bc4a19fd 100644 (file)
@@ -97,6 +97,15 @@ public:
     return false;
   }
 
+  bool list_snaps(
+      uint64_t object_no, io::Extents&& extents, io::SnapIds&& snap_ids,
+      int list_snap_flags, const ZTracer::Trace &parent_trace,
+      io::SnapshotDelta* snapshot_delta, int* object_dispatch_flags,
+      io::DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
   bool invalidate_cache(Context* on_finish) {
     return false;
   }
index a89404b7b63db8d7993695d87416d0b21611c17c..73c470f6aad54bc8637e4bf1b5c2364835825551 100644 (file)
@@ -85,6 +85,15 @@ public:
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
+  bool list_snaps(
+      uint64_t object_no, io::Extents&& extents, io::SnapIds&& snap_ids,
+      int list_snap_flags, const ZTracer::Trace &parent_trace,
+      io::SnapshotDelta* snapshot_delta, int* object_dispatch_flags,
+      io::DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
   bool invalidate_cache(Context* on_finish) override {
     return false;
   }
index c02961e8fa3fa96ee21f8695e2cee6447aa53617..053be22d4ef607dda6473b6166e3d37603cf5028 100644 (file)
@@ -77,6 +77,15 @@ public:
     return false;
   }
 
+  bool list_snaps(
+      uint64_t object_no, io::Extents&& extents, io::SnapIds&& snap_ids,
+      int list_snap_flags, const ZTracer::Trace &parent_trace,
+      io::SnapshotDelta* snapshot_delta, int* object_dispatch_flags,
+      io::DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
   bool invalidate_cache(Context* on_finish) override {
     return false;
   }
index 9413a132a7b5be7de331ae0125d4dd12186e3237..af8ec04df24b0ae0346bf05707d1d3352fd732bc 100644 (file)
@@ -136,6 +136,26 @@ bool ObjectDispatch<I>::compare_and_write(
   return true;
 }
 
+template <typename I>
+bool ObjectDispatch<I>::list_snaps(
+    uint64_t object_no, io::Extents&& extents, SnapIds&& snap_ids,
+    int list_snap_flags, const ZTracer::Trace &parent_trace,
+    SnapshotDelta* snapshot_delta, int* object_dispatch_flags,
+    DispatchResult* dispatch_result, Context** on_finish,
+    Context* on_dispatched) {
+  auto cct = m_image_ctx->cct;
+  ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " "
+                 << "extents=" << extents << ", "
+                 << "snap_ids=" << snap_ids << dendl;
+
+  *dispatch_result = DISPATCH_RESULT_COMPLETE;
+  auto req = ObjectListSnapsRequest<I>::create(
+    m_image_ctx, object_no, std::move(extents), std::move(snap_ids),
+    list_snap_flags, parent_trace, snapshot_delta, on_dispatched);
+  req->send();
+  return true;
+}
+
 } // namespace io
 } // namespace librbd
 
index 5118e7bb9c3e0a5d2e356fdea632df2dbba04c2d..9bbaa5e2f65d4dabeb1b2730989430eae5b25b76 100644 (file)
@@ -78,6 +78,13 @@ public:
     return false;
   }
 
+  bool list_snaps(
+      uint64_t object_no, io::Extents&& extents, SnapIds&& snap_ids,
+      int list_snap_flags, const ZTracer::Trace &parent_trace,
+      SnapshotDelta* snapshot_delta, int* object_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override;
+
   bool invalidate_cache(Context* on_finish) override {
     return false;
   }
index 492406d3bf8ce9bd776ddbd3710e29b326fe5027..a4525bee883e7d6e3a67545a504152a918ae4bdd 100644 (file)
@@ -35,10 +35,11 @@ struct ObjectDispatchInterface {
 
   virtual bool read(
       uint64_t object_no, const Extents &extents,
-      IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace,
-      ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version,
-      int* object_dispatch_flags, DispatchResult* dispatch_result,
-      Context** on_finish, Context* on_dispatched) = 0;
+      IOContext io_context, int op_flags,
+      const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
+      Extents* extent_map, uint64_t* version, int* object_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) = 0;
 
   virtual bool discard(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
@@ -76,6 +77,13 @@ struct ObjectDispatchInterface {
       uint64_t* journal_tid, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) = 0;
 
+  virtual bool list_snaps(
+      uint64_t object_no, Extents&& extents, SnapIds&& snap_ids,
+      int list_snap_flags, const ZTracer::Trace &parent_trace,
+      SnapshotDelta* snapshot_delta, int* object_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) = 0;
+
   virtual bool invalidate_cache(Context* on_finish) = 0;
   virtual bool reset_existence_cache(Context* on_finish) = 0;
 
index 50e3e204950f8c87df94ade4b0930ecf068d6901..ee0e88fed7e4f16e4542ce77395530004dbf7c2b 100644 (file)
@@ -131,12 +131,28 @@ public:
     }
   };
 
+  struct ListSnapsRequest : public RequestBase {
+    Extents extents;
+    SnapIds snap_ids;
+    int list_snaps_flags;
+    SnapshotDelta* snapshot_delta;
+
+    ListSnapsRequest(uint64_t object_no, Extents&& extents,
+                     SnapIds&& snap_ids, int list_snaps_flags,
+                     SnapshotDelta* snapshot_delta)
+      : RequestBase(object_no), extents(std::move(extents)),
+        snap_ids(std::move(snap_ids)),list_snaps_flags(list_snaps_flags),
+        snapshot_delta(snapshot_delta) {
+    }
+  };
+
   typedef boost::variant<ReadRequest,
                          DiscardRequest,
                          WriteRequest,
                          WriteSameRequest,
                          CompareAndWriteRequest,
-                         FlushRequest> Request;
+                         FlushRequest,
+                         ListSnapsRequest> Request;
 
   C_Dispatcher dispatcher_ctx;
 
@@ -243,6 +259,22 @@ public:
                                   {}, 0, parent_trace, on_finish);
   }
 
+  template <typename ImageCtxT>
+  static ObjectDispatchSpec* create_list_snaps(
+      ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer,
+      uint64_t object_no, Extents&& extents, SnapIds&& snap_ids,
+      int list_snaps_flags, const ZTracer::Trace &parent_trace,
+      SnapshotDelta* snapshot_delta, Context* on_finish) {
+    return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
+                                  object_dispatch_layer,
+                                  ListSnapsRequest{object_no,
+                                                   std::move(extents),
+                                                   std::move(snap_ids),
+                                                   list_snaps_flags,
+                                                   snapshot_delta},
+                                  {}, 0, parent_trace, on_finish);
+  }
+
   void send();
   void fail(int r);
 
index 58aa989479174539634331cab1443c9cbc66fb08..380cda279d96f75117fb410fa74a327cfa6a40bc 100644 (file)
@@ -173,6 +173,17 @@ struct ObjectDispatcher<I>::SendVisitor : public boost::static_visitor<bool> {
       &object_dispatch_spec->dispatcher_ctx.on_finish,
       &object_dispatch_spec->dispatcher_ctx);
   }
+
+  bool operator()(ObjectDispatchSpec::ListSnapsRequest& list_snaps) const {
+    return object_dispatch->list_snaps(
+      list_snaps.object_no, std::move(list_snaps.extents),
+      std::move(list_snaps.snap_ids), list_snaps.list_snaps_flags,
+      object_dispatch_spec->parent_trace, list_snaps.snapshot_delta,
+      &object_dispatch_spec->object_dispatch_flags,
+      &object_dispatch_spec->dispatch_result,
+      &object_dispatch_spec->dispatcher_ctx.on_finish,
+      &object_dispatch_spec->dispatcher_ctx);
+  }
 };
 
 template <typename I>
index 132b4240b36f7aa7b810150dcfb2a18c5525d58f..cc34ac9903975f170d1a733ef0ad54fedec1fa8d 100644 (file)
@@ -92,6 +92,15 @@ public:
       uint64_t* journal_tid, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
+  bool list_snaps(
+      uint64_t object_no, io::Extents&& extents, SnapIds&& snap_ids,
+      int list_snap_flags, const ZTracer::Trace &parent_trace,
+      SnapshotDelta* snapshot_delta, int* object_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
   bool invalidate_cache(Context* on_finish) override {
     return false;
   }
index 2342200867e565c856f4ab20c70071bcc52c6718..64f0ab251d68b2e911d58f62543b75f80860c26e 100644 (file)
@@ -82,6 +82,15 @@ public:
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
+  bool list_snaps(
+      uint64_t object_no, io::Extents&& extents, io::SnapIds&& snap_ids,
+      int list_snap_flags, const ZTracer::Trace &parent_trace,
+      io::SnapshotDelta* snapshot_delta, int* object_dispatch_flags,
+      io::DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return false;
+  }
+
   bool invalidate_cache(Context* on_finish) override {
     return false;
   }
index 0b940bd86d584f7939102a9beca9e5ef0cca9302..b873964c21e081f4f01ce2df993d30d24bc28102 100644 (file)
@@ -111,6 +111,19 @@ public:
                          on_dispatched);
   }
 
+  MOCK_METHOD7(execute_list_snaps, bool(uint64_t, const Extents&,
+                                        const SnapIds&, int, SnapshotDelta*,
+                                        DispatchResult*, Context*));
+  bool list_snaps(
+      uint64_t object_no, io::Extents&& extents, SnapIds&& snap_ids,
+      int list_snaps_flags, const ZTracer::Trace &parent_trace,
+      SnapshotDelta* snapshot_delta, int* object_dispatch_flags,
+      DispatchResult* dispatch_result, Context** on_finish,
+      Context* on_dispatched) override {
+    return execute_list_snaps(object_no, extents, snap_ids, list_snaps_flags,
+                              snapshot_delta, dispatch_result, on_dispatched);
+  }
+
   MOCK_METHOD1(invalidate_cache, bool(Context*));
   MOCK_METHOD1(reset_existence_cache, bool(Context*));