]> git.proxmox.com Git - ceph.git/blob - ceph/src/tools/rbd_mirror/Mirror.h
import ceph quincy 17.2.4
[ceph.git] / ceph / src / tools / rbd_mirror / Mirror.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #ifndef CEPH_RBD_MIRROR_H
5 #define CEPH_RBD_MIRROR_H
6
7 #include "common/ceph_context.h"
8 #include "common/ceph_mutex.h"
9 #include "include/rados/librados.hpp"
10 #include "include/utime.h"
11 #include "ClusterWatcher.h"
12 #include "PoolReplayer.h"
13 #include "tools/rbd_mirror/Types.h"
14
15 #include <set>
16 #include <map>
17 #include <memory>
18 #include <atomic>
19
20 namespace journal { class CacheManagerHandler; }
21
22 namespace librbd { struct ImageCtx; }
23
24 namespace rbd {
25 namespace mirror {
26
27 template <typename> struct ServiceDaemon;
28 template <typename> struct Threads;
29 class CacheManagerHandler;
30 class MirrorAdminSocketHook;
31 class PoolMetaCache;
32
33 /**
34 * Contains the main loop and overall state for rbd-mirror.
35 *
36 * Sets up mirroring, and coordinates between noticing config
37 * changes and applying them.
38 */
39 class Mirror {
40 public:
41 Mirror(CephContext *cct, const std::vector<const char*> &args);
42 Mirror(const Mirror&) = delete;
43 Mirror& operator=(const Mirror&) = delete;
44 ~Mirror();
45
46 int init();
47 void run();
48 void handle_signal(int signum);
49
50 void print_status(Formatter *f);
51 void start();
52 void stop();
53 void restart();
54 void flush();
55 void release_leader();
56
57 private:
58 typedef ClusterWatcher::PoolPeers PoolPeers;
59 typedef std::pair<int64_t, PeerSpec> PoolPeer;
60
61 void update_pool_replayers(const PoolPeers &pool_peers,
62 const std::string& site_name);
63
64 void create_cache_manager();
65 void run_cache_manager(utime_t *next_run_interval);
66
67 CephContext *m_cct;
68 std::vector<const char*> m_args;
69 Threads<librbd::ImageCtx> *m_threads = nullptr;
70 ceph::mutex m_lock = ceph::make_mutex("rbd::mirror::Mirror");
71 ceph::condition_variable m_cond;
72 RadosRef m_local;
73 std::unique_ptr<ServiceDaemon<librbd::ImageCtx>> m_service_daemon;
74
75 // monitor local cluster for config changes in peers
76 std::unique_ptr<ClusterWatcher> m_local_cluster_watcher;
77 std::unique_ptr<CacheManagerHandler> m_cache_manager_handler;
78 std::unique_ptr<PoolMetaCache> m_pool_meta_cache;
79 std::map<PoolPeer, std::unique_ptr<PoolReplayer<>>> m_pool_replayers;
80 std::atomic<bool> m_stopping = { false };
81 bool m_manual_stop = false;
82 MirrorAdminSocketHook *m_asok_hook;
83 std::string m_site_name;
84 };
85
86 } // namespace mirror
87 } // namespace rbd
88
89 #endif // CEPH_RBD_MIRROR_H