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
);
74 bool is_blocklisted(const std::scoped_lock
<ceph::mutex
> &locker
) const {
75 bool blocklisted
= false;
76 if (m_instance_watcher
) {
77 blocklisted
= m_instance_watcher
->is_blocklisted();
79 if (m_mirror_watcher
) {
80 blocklisted
|= m_mirror_watcher
->is_blocklisted();
86 struct SnapListener
: public InstanceWatcher::Listener
{
89 SnapListener(FSMirror
*fs_mirror
)
90 : fs_mirror(fs_mirror
) {
93 void acquire_directory(string_view dir_path
) override
{
94 fs_mirror
->handle_acquire_directory(dir_path
);
97 void release_directory(string_view dir_path
) override
{
98 fs_mirror
->handle_release_directory(dir_path
);
103 Filesystem m_filesystem
;
105 ServiceDaemon
*m_service_daemon
;
106 std::vector
<const char *> m_args
;
107 ContextWQ
*m_work_queue
;
109 ceph::mutex m_lock
= ceph::make_mutex("cephfs::mirror::fs_mirror");
110 SnapListener m_snap_listener
;
111 std::set
<std::string
, std::less
<>> m_directories
;
113 std::map
<Peer
, std::unique_ptr
<PeerReplayer
>> m_peer_replayers
;
117 librados::IoCtx m_ioctx
;
118 InstanceWatcher
*m_instance_watcher
= nullptr;
119 MirrorWatcher
*m_mirror_watcher
= nullptr;
122 bool m_stopping
= false;
123 bool m_init_failed
= false;
124 Context
*m_on_init_finish
= nullptr;
125 Context
*m_on_shutdown_finish
= nullptr;
127 MirrorAdminSocketHook
*m_asok_hook
= nullptr;
131 int init_replayer(PeerReplayer
*peer_replayer
);
132 void shutdown_replayer(PeerReplayer
*peer_replayer
);
135 void init_instance_watcher(Context
*on_finish
);
136 void handle_init_instance_watcher(int r
);
138 void init_mirror_watcher();
139 void handle_init_mirror_watcher(int r
);
141 void shutdown_peer_replayers();
143 void shutdown_mirror_watcher();
144 void handle_shutdown_mirror_watcher(int r
);
146 void shutdown_instance_watcher();
147 void handle_shutdown_instance_watcher(int r
);
149 void handle_acquire_directory(string_view dir_path
);
150 void handle_release_directory(string_view dir_path
);
153 } // namespace mirror
154 } // namespace cephfs
156 #endif // CEPHFS_MIRROR_FS_MIRROR_H