1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_RBD_MIRROR_IMAGE_DELETE_TRASH_WATCHER_H
5 #define CEPH_RBD_MIRROR_IMAGE_DELETE_TRASH_WATCHER_H
7 #include "include/rados/librados.hpp"
8 #include "common/AsyncOpTracker.h"
9 #include "common/ceph_mutex.h"
10 #include "librbd/TrashWatcher.h"
15 namespace librbd
{ struct ImageCtx
; }
20 template <typename
> struct Threads
;
22 namespace image_deleter
{
26 template <typename ImageCtxT
= librbd::ImageCtx
>
27 class TrashWatcher
: public librbd::TrashWatcher
<ImageCtxT
> {
29 static TrashWatcher
* create(librados::IoCtx
&io_ctx
,
30 Threads
<ImageCtxT
> *threads
,
31 TrashListener
& trash_listener
) {
32 return new TrashWatcher(io_ctx
, threads
, trash_listener
);
35 TrashWatcher(librados::IoCtx
&io_ctx
, Threads
<ImageCtxT
> *threads
,
36 TrashListener
& trash_listener
);
37 TrashWatcher(const TrashWatcher
&) = delete;
38 TrashWatcher
& operator=(const TrashWatcher
&) = delete;
40 void init(Context
*on_finish
);
41 void shut_down(Context
*on_finish
);
44 void handle_image_added(const std::string
&image_id
,
45 const cls::rbd::TrashImageSpec
& spec
) override
;
47 void handle_image_removed(const std::string
&image_id
) override
;
49 void handle_rewatch_complete(int r
) override
;
66 * |/--------------------------------\
73 * |/----------------------------\ |
78 * | |\---> IMAGE_ADDED -----/ |
80 * | \----> WATCH_ERROR ---------/
93 librados::IoCtx m_io_ctx
;
94 Threads
<ImageCtxT
> *m_threads
;
95 TrashListener
& m_trash_listener
;
97 std::string m_last_image_id
;
100 mutable ceph::mutex m_lock
;
102 Context
*m_on_init_finish
= nullptr;
103 Context
*m_timer_ctx
= nullptr;
105 AsyncOpTracker m_async_op_tracker
;
106 bool m_trash_list_in_progress
= false;
107 bool m_deferred_trash_list
= false;
108 bool m_shutting_down
= false;
110 void register_watcher();
111 void handle_register_watcher(int r
);
114 void handle_create_trash(int r
);
116 void unregister_watcher(Context
* on_finish
);
117 void handle_unregister_watcher(int r
, Context
* on_finish
);
119 void trash_list(bool initial_request
);
120 void handle_trash_list(int r
);
122 void schedule_trash_list(double interval
);
123 void process_trash_list();
125 void get_mirror_uuid();
126 void handle_get_mirror_uuid(int r
);
128 void add_image(const std::string
& image_id
,
129 const cls::rbd::TrashImageSpec
& spec
);
133 } // namespace image_deleter
134 } // namespace mirror
137 extern template class rbd::mirror::image_deleter::TrashWatcher
<librbd::ImageCtx
>;
139 #endif // CEPH_RBD_MIRROR_IMAGE_DELETE_TRASH_WATCHER_H