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;
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;
}
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;
}
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;
}
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
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;
}
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,
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;
}
};
+ 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;
{}, 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);
&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>
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;
}
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;
}
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*));