// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #ifndef CEPH_RBD_MIRROR_H #define CEPH_RBD_MIRROR_H #include "common/ceph_context.h" #include "common/Mutex.h" #include "include/rados/librados.hpp" #include "ClusterWatcher.h" #include "PoolReplayer.h" #include "ImageDeleter.h" #include "types.h" #include #include #include #include namespace librbd { struct ImageCtx; } namespace rbd { namespace mirror { template struct ServiceDaemon; template struct Threads; class MirrorAdminSocketHook; /** * Contains the main loop and overall state for rbd-mirror. * * Sets up mirroring, and coordinates between noticing config * changes and applying them. */ class Mirror { public: Mirror(CephContext *cct, const std::vector &args); Mirror(const Mirror&) = delete; Mirror& operator=(const Mirror&) = delete; ~Mirror(); int init(); void run(); void handle_signal(int signum); void print_status(Formatter *f, stringstream *ss); void start(); void stop(); void restart(); void flush(); void release_leader(); private: typedef ClusterWatcher::PoolPeers PoolPeers; typedef std::pair PoolPeer; void update_pool_replayers(const PoolPeers &pool_peers); CephContext *m_cct; std::vector m_args; Threads *m_threads = nullptr; Mutex m_lock; Cond m_cond; RadosRef m_local; std::unique_ptr> m_service_daemon; // monitor local cluster for config changes in peers std::unique_ptr m_local_cluster_watcher; std::unique_ptr> m_image_deleter; std::map > m_pool_replayers; std::atomic m_stopping = { false }; bool m_manual_stop = false; MirrorAdminSocketHook *m_asok_hook; }; } // namespace mirror } // namespace rbd #endif // CEPH_RBD_MIRROR_H