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_POOL_REPLAYER_H
5 #define CEPH_RBD_MIRROR_POOL_REPLAYER_H
7 #include "common/AsyncOpTracker.h"
8 #include "common/Cond.h"
9 #include "common/Mutex.h"
10 #include "common/WorkQueue.h"
11 #include "include/rados/librados.hpp"
13 #include "ClusterWatcher.h"
14 #include "LeaderWatcher.h"
15 #include "PoolWatcher.h"
16 #include "ImageDeleter.h"
25 class AdminSocketHook
;
27 namespace librbd
{ class ImageCtx
; }
32 template <typename
> struct Threads
;
33 template <typename
> class InstanceReplayer
;
34 template <typename
> class InstanceWatcher
;
37 * Controls mirroring for a single remote cluster.
41 PoolReplayer(Threads
<librbd::ImageCtx
> *threads
,
42 std::shared_ptr
<ImageDeleter
> image_deleter
,
43 int64_t local_pool_id
, const peer_t
&peer
,
44 const std::vector
<const char*> &args
);
46 PoolReplayer(const PoolReplayer
&) = delete;
47 PoolReplayer
& operator=(const PoolReplayer
&) = delete;
49 bool is_blacklisted() const;
50 bool is_leader() const;
55 void print_status(Formatter
*f
, stringstream
*ss
);
57 void stop(bool manual
);
60 void release_leader();
63 struct PoolWatcherListener
: public PoolWatcher
<>::Listener
{
64 PoolReplayer
*pool_replayer
;
67 PoolWatcherListener(PoolReplayer
*pool_replayer
, bool local
)
68 : pool_replayer(pool_replayer
), local(local
) {
71 void handle_update(const std::string
&mirror_uuid
,
72 ImageIds
&&added_image_ids
,
73 ImageIds
&&removed_image_ids
) override
{
74 pool_replayer
->handle_update((local
? "" : mirror_uuid
),
75 std::move(added_image_ids
),
76 std::move(removed_image_ids
));
80 void handle_update(const std::string
&mirror_uuid
,
81 ImageIds
&&added_image_ids
,
82 ImageIds
&&removed_image_ids
);
84 int init_rados(const std::string
&cluster_name
,
85 const std::string
&client_name
,
86 const std::string
&description
, RadosRef
*rados_ref
);
88 void handle_post_acquire_leader(Context
*on_finish
);
89 void handle_pre_release_leader(Context
*on_finish
);
91 void init_local_pool_watcher(Context
*on_finish
);
92 void handle_init_local_pool_watcher(int r
, Context
*on_finish
);
94 void init_remote_pool_watcher(Context
*on_finish
);
96 void shut_down_pool_watchers(Context
*on_finish
);
97 void handle_shut_down_pool_watchers(int r
, Context
*on_finish
);
99 void wait_for_update_ops(Context
*on_finish
);
100 void handle_wait_for_update_ops(int r
, Context
*on_finish
);
102 void handle_update_leader(const std::string
&leader_instance_id
);
104 Threads
<librbd::ImageCtx
> *m_threads
;
105 std::shared_ptr
<ImageDeleter
> m_image_deleter
;
106 mutable Mutex m_lock
;
108 std::atomic
<bool> m_stopping
= { false };
109 bool m_manual_stop
= false;
110 bool m_blacklisted
= false;
113 std::vector
<const char*> m_args
;
114 RadosRef m_local_rados
;
115 RadosRef m_remote_rados
;
117 librados::IoCtx m_local_io_ctx
;
118 librados::IoCtx m_remote_io_ctx
;
120 int64_t m_local_pool_id
= -1;
122 PoolWatcherListener m_local_pool_watcher_listener
;
123 std::unique_ptr
<PoolWatcher
<> > m_local_pool_watcher
;
125 PoolWatcherListener m_remote_pool_watcher_listener
;
126 std::unique_ptr
<PoolWatcher
<> > m_remote_pool_watcher
;
128 std::unique_ptr
<InstanceReplayer
<librbd::ImageCtx
>> m_instance_replayer
;
130 std::string m_asok_hook_name
;
131 AdminSocketHook
*m_asok_hook
;
133 std::map
<std::string
, ImageIds
> m_initial_mirror_image_ids
;
135 class PoolReplayerThread
: public Thread
{
136 PoolReplayer
*m_pool_replayer
;
138 PoolReplayerThread(PoolReplayer
*pool_replayer
)
139 : m_pool_replayer(pool_replayer
) {
141 void *entry() override
{
142 m_pool_replayer
->run();
145 } m_pool_replayer_thread
;
147 class LeaderListener
: public LeaderWatcher
<>::Listener
{
149 LeaderListener(PoolReplayer
*pool_replayer
)
150 : m_pool_replayer(pool_replayer
) {
154 void post_acquire_handler(Context
*on_finish
) override
{
155 m_pool_replayer
->handle_post_acquire_leader(on_finish
);
158 void pre_release_handler(Context
*on_finish
) override
{
159 m_pool_replayer
->handle_pre_release_leader(on_finish
);
162 void update_leader_handler(
163 const std::string
&leader_instance_id
) override
{
164 m_pool_replayer
->handle_update_leader(leader_instance_id
);
168 PoolReplayer
*m_pool_replayer
;
171 std::unique_ptr
<LeaderWatcher
<> > m_leader_watcher
;
172 std::unique_ptr
<InstanceWatcher
<librbd::ImageCtx
> > m_instance_watcher
;
173 AsyncOpTracker m_update_op_tracker
;
176 } // namespace mirror
179 #endif // CEPH_RBD_MIRROR_POOL_REPLAYER_H