1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPHFS_MIRROR_FS_MIRROR_H
5 #define CEPHFS_MIRROR_FS_MIRROR_H
7 #include "common/Formatter.h"
8 #include "common/Thread.h"
11 #include "InstanceWatcher.h"
12 #include "MirrorWatcher.h"
19 class MirrorAdminSocketHook
;
23 // handle mirroring for a filesystem to a set of peers
27 FSMirror(CephContext
*cct
, const Filesystem
&filesystem
, uint64_t pool_id
,
28 ServiceDaemon
*service_daemon
, std::vector
<const char*> args
,
29 ContextWQ
*work_queue
);
32 void init(Context
*on_finish
);
33 void shutdown(Context
*on_finish
);
35 void add_peer(const Peer
&peer
);
36 void remove_peer(const Peer
&peer
);
39 std::scoped_lock
locker(m_lock
);
43 bool is_init_failed() {
44 std::scoped_lock
locker(m_lock
);
49 std::scoped_lock
locker(m_lock
);
50 return m_init_failed
||
51 m_instance_watcher
->is_failed() ||
52 m_mirror_watcher
->is_failed();
55 bool is_blocklisted() {
56 std::scoped_lock
locker(m_lock
);
57 return is_blocklisted(locker
);
61 std::scoped_lock
locker(m_lock
);
65 std::string
get_instance_addr() {
66 std::scoped_lock
locker(m_lock
);
70 // admin socket helpers
71 void mirror_status(Formatter
*f
);
76 bool is_blocklisted(const std::scoped_lock
<ceph::mutex
> &locker
) const {
77 bool blocklisted
= false;
78 if (m_instance_watcher
) {
79 blocklisted
= m_instance_watcher
->is_blocklisted();
81 if (m_mirror_watcher
) {
82 blocklisted
|= m_mirror_watcher
->is_blocklisted();
88 struct SnapListener
: public InstanceWatcher::Listener
{
91 SnapListener(FSMirror
*fs_mirror
)
92 : fs_mirror(fs_mirror
) {
95 void acquire_directory(string_view dir_path
) override
{
96 fs_mirror
->handle_acquire_directory(dir_path
);
99 void release_directory(string_view dir_path
) override
{
100 fs_mirror
->handle_release_directory(dir_path
);
105 Filesystem m_filesystem
;
107 ServiceDaemon
*m_service_daemon
;
108 std::vector
<const char *> m_args
;
109 ContextWQ
*m_work_queue
;
111 ceph::mutex m_lock
= ceph::make_mutex("cephfs::mirror::fs_mirror");
112 SnapListener m_snap_listener
;
113 std::set
<std::string
, std::less
<>> m_directories
;
115 std::map
<Peer
, std::unique_ptr
<PeerReplayer
>> m_peer_replayers
;
119 librados::IoCtx m_ioctx
;
120 InstanceWatcher
*m_instance_watcher
= nullptr;
121 MirrorWatcher
*m_mirror_watcher
= nullptr;
124 bool m_stopping
= false;
125 bool m_init_failed
= false;
126 Context
*m_on_init_finish
= nullptr;
127 Context
*m_on_shutdown_finish
= nullptr;
129 MirrorAdminSocketHook
*m_asok_hook
= nullptr;
133 int init_replayer(PeerReplayer
*peer_replayer
);
134 void shutdown_replayer(PeerReplayer
*peer_replayer
);
137 void init_instance_watcher(Context
*on_finish
);
138 void handle_init_instance_watcher(int r
);
140 void init_mirror_watcher();
141 void handle_init_mirror_watcher(int r
);
143 void shutdown_peer_replayers();
145 void shutdown_mirror_watcher();
146 void handle_shutdown_mirror_watcher(int r
);
148 void shutdown_instance_watcher();
149 void handle_shutdown_instance_watcher(int r
);
151 void handle_acquire_directory(string_view dir_path
);
152 void handle_release_directory(string_view dir_path
);
155 } // namespace mirror
156 } // namespace cephfs
158 #endif // CEPHFS_MIRROR_FS_MIRROR_H