1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_LIBRBD_IO_OBJECT_DISPATCHER_H
5 #define CEPH_LIBRBD_IO_OBJECT_DISPATCHER_H
7 #include "include/int_types.h"
8 #include "common/ceph_mutex.h"
9 #include "librbd/io/Types.h"
12 struct AsyncOpTracker
;
21 struct ObjectDispatchInterface
;
22 struct ObjectDispatchSpec
;
24 struct ObjectDispatcherInterface
{
26 virtual ~ObjectDispatcherInterface() {
30 friend class ObjectDispatchSpec
;
32 virtual void send(ObjectDispatchSpec
* object_dispatch_spec
) = 0;
35 template <typename ImageCtxT
= ImageCtx
>
36 class ObjectDispatcher
: public ObjectDispatcherInterface
{
38 ObjectDispatcher(ImageCtxT
* image_ctx
);
41 void shut_down(Context
* on_finish
);
43 void register_object_dispatch(ObjectDispatchInterface
* object_dispatch
);
44 void shut_down_object_dispatch(ObjectDispatchLayer object_dispatch_layer
,
47 void invalidate_cache(Context
* on_finish
);
48 void reset_existence_cache(Context
* on_finish
);
50 void extent_overwritten(
51 uint64_t object_no
, uint64_t object_off
, uint64_t object_len
,
52 uint64_t journal_tid
, uint64_t new_journal_tid
);
55 struct ObjectDispatchMeta
{
56 ObjectDispatchInterface
* object_dispatch
= nullptr;
57 AsyncOpTracker
* async_op_tracker
= nullptr;
59 ObjectDispatchMeta() {
61 ObjectDispatchMeta(ObjectDispatchInterface
* object_dispatch
,
62 AsyncOpTracker
* async_op_tracker
)
63 : object_dispatch(object_dispatch
), async_op_tracker(async_op_tracker
) {
67 struct C_LayerIterator
;
68 struct C_InvalidateCache
;
69 struct C_ResetExistenceCache
;
72 ImageCtxT
* m_image_ctx
;
74 ceph::shared_mutex m_lock
;
75 std::map
<ObjectDispatchLayer
, ObjectDispatchMeta
> m_object_dispatches
;
77 void send(ObjectDispatchSpec
* object_dispatch_spec
);
79 void shut_down_object_dispatch(ObjectDispatchMeta
& object_dispatch_meta
,
87 extern template class librbd::io::ObjectDispatcher
<librbd::ImageCtx
>;
89 #endif // CEPH_LIBRBD_IO_OBJECT_DISPATCHER_H