From: Jason Dillaman Date: Tue, 1 Sep 2020 20:49:34 +0000 (-0400) Subject: librbd: skeleton implementation of object snap list dispatch hooks X-Git-Tag: v16.1.0~961^2~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cbb66534b98eb6367860113d41ad6a6765f032d3;p=ceph.git librbd: skeleton implementation of object snap list dispatch hooks Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/cache/ObjectCacherObjectDispatch.h b/src/librbd/cache/ObjectCacherObjectDispatch.h index fb8be857d9ee5..ece4a75146721 100644 --- a/src/librbd/cache/ObjectCacherObjectDispatch.h +++ b/src/librbd/cache/ObjectCacherObjectDispatch.h @@ -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; diff --git a/src/librbd/cache/ParentCacheObjectDispatch.h b/src/librbd/cache/ParentCacheObjectDispatch.h index db5df8d0fe192..603ae252fdfae 100644 --- a/src/librbd/cache/ParentCacheObjectDispatch.h +++ b/src/librbd/cache/ParentCacheObjectDispatch.h @@ -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; } diff --git a/src/librbd/cache/WriteAroundObjectDispatch.h b/src/librbd/cache/WriteAroundObjectDispatch.h index a89404b7b63db..73c470f6aad54 100644 --- a/src/librbd/cache/WriteAroundObjectDispatch.h +++ b/src/librbd/cache/WriteAroundObjectDispatch.h @@ -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; } diff --git a/src/librbd/crypto/CryptoObjectDispatch.h b/src/librbd/crypto/CryptoObjectDispatch.h index c02961e8fa3fa..053be22d4ef60 100644 --- a/src/librbd/crypto/CryptoObjectDispatch.h +++ b/src/librbd/crypto/CryptoObjectDispatch.h @@ -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; } diff --git a/src/librbd/io/ObjectDispatch.cc b/src/librbd/io/ObjectDispatch.cc index 9413a132a7b5b..af8ec04df24b0 100644 --- a/src/librbd/io/ObjectDispatch.cc +++ b/src/librbd/io/ObjectDispatch.cc @@ -136,6 +136,26 @@ bool ObjectDispatch::compare_and_write( return true; } +template +bool ObjectDispatch::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::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 diff --git a/src/librbd/io/ObjectDispatch.h b/src/librbd/io/ObjectDispatch.h index 5118e7bb9c3e0..9bbaa5e2f65d4 100644 --- a/src/librbd/io/ObjectDispatch.h +++ b/src/librbd/io/ObjectDispatch.h @@ -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; } diff --git a/src/librbd/io/ObjectDispatchInterface.h b/src/librbd/io/ObjectDispatchInterface.h index 492406d3bf8ce..a4525bee883e7 100644 --- a/src/librbd/io/ObjectDispatchInterface.h +++ b/src/librbd/io/ObjectDispatchInterface.h @@ -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; diff --git a/src/librbd/io/ObjectDispatchSpec.h b/src/librbd/io/ObjectDispatchSpec.h index 50e3e204950f8..ee0e88fed7e4f 100644 --- a/src/librbd/io/ObjectDispatchSpec.h +++ b/src/librbd/io/ObjectDispatchSpec.h @@ -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 Request; + FlushRequest, + ListSnapsRequest> Request; C_Dispatcher dispatcher_ctx; @@ -243,6 +259,22 @@ public: {}, 0, parent_trace, on_finish); } + template + 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); diff --git a/src/librbd/io/ObjectDispatcher.cc b/src/librbd/io/ObjectDispatcher.cc index 58aa989479174..380cda279d96f 100644 --- a/src/librbd/io/ObjectDispatcher.cc +++ b/src/librbd/io/ObjectDispatcher.cc @@ -173,6 +173,17 @@ struct ObjectDispatcher::SendVisitor : public boost::static_visitor { &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 diff --git a/src/librbd/io/SimpleSchedulerObjectDispatch.h b/src/librbd/io/SimpleSchedulerObjectDispatch.h index 132b4240b36f7..cc34ac9903975 100644 --- a/src/librbd/io/SimpleSchedulerObjectDispatch.h +++ b/src/librbd/io/SimpleSchedulerObjectDispatch.h @@ -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; } diff --git a/src/librbd/journal/ObjectDispatch.h b/src/librbd/journal/ObjectDispatch.h index 2342200867e56..64f0ab251d68b 100644 --- a/src/librbd/journal/ObjectDispatch.h +++ b/src/librbd/journal/ObjectDispatch.h @@ -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; } diff --git a/src/test/librbd/mock/io/MockObjectDispatch.h b/src/test/librbd/mock/io/MockObjectDispatch.h index 0b940bd86d584..b873964c21e08 100644 --- a/src/test/librbd/mock/io/MockObjectDispatch.h +++ b/src/test/librbd/mock/io/MockObjectDispatch.h @@ -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*));