]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/tools/rbd_mirror/InstanceReplayer.h
import 15.2.0 Octopus source
[ceph.git] / ceph / src / tools / rbd_mirror / InstanceReplayer.h
index 0321d78c5afb34faa872a8487569835446ddeee7..ec500fd5cb30a235038123d0c9b76d57829936e7 100644 (file)
@@ -9,9 +9,11 @@
 
 #include "common/AsyncOpTracker.h"
 #include "common/Formatter.h"
-#include "common/Mutex.h"
+#include "common/ceph_mutex.h"
 #include "tools/rbd_mirror/Types.h"
 
+namespace journal { struct CacheManagerHandler; }
+
 namespace librbd { class ImageCtx; }
 
 namespace rbd {
@@ -19,6 +21,8 @@ namespace mirror {
 
 template <typename> class ImageReplayer;
 template <typename> class InstanceWatcher;
+template <typename> class MirrorStatusUpdater;
+struct PoolMetaCache;
 template <typename> class ServiceDaemon;
 template <typename> struct Threads;
 
@@ -26,30 +30,37 @@ template <typename ImageCtxT = librbd::ImageCtx>
 class InstanceReplayer {
 public:
   static InstanceReplayer* create(
-      Threads<ImageCtxT> *threads,
-      ServiceDaemon<ImageCtxT>* service_daemon,
-      RadosRef local_rados, const std::string &local_mirror_uuid,
-      int64_t local_pool_id) {
-    return new InstanceReplayer(threads, service_daemon, local_rados,
-                                local_mirror_uuid, local_pool_id);
+      librados::IoCtx &local_io_ctx, const std::string &local_mirror_uuid,
+      Threads<ImageCtxT> *threads, ServiceDaemon<ImageCtxT> *service_daemon,
+      MirrorStatusUpdater<ImageCtxT>* local_status_updater,
+      journal::CacheManagerHandler *cache_manager_handler,
+      PoolMetaCache* pool_meta_cache) {
+    return new InstanceReplayer(local_io_ctx, local_mirror_uuid, threads,
+                                service_daemon, local_status_updater,
+                                cache_manager_handler, pool_meta_cache);
   }
   void destroy() {
     delete this;
   }
 
-  InstanceReplayer(Threads<ImageCtxT> *threads,
-                   ServiceDaemon<ImageCtxT>* service_daemon,
-                  RadosRef local_rados, const std::string &local_mirror_uuid,
-                  int64_t local_pool_id);
+  InstanceReplayer(librados::IoCtx &local_io_ctx,
+                   const std::string &local_mirror_uuid,
+                   Threads<ImageCtxT> *threads,
+                   ServiceDaemon<ImageCtxT> *service_daemon,
+                   MirrorStatusUpdater<ImageCtxT>* local_status_updater,
+                   journal::CacheManagerHandler *cache_manager_handler,
+                   PoolMetaCache* pool_meta_cache);
   ~InstanceReplayer();
 
+  bool is_blacklisted() const;
+
   int init();
   void shut_down();
 
   void init(Context *on_finish);
   void shut_down(Context *on_finish);
 
-  void add_peer(std::string peer_uuid, librados::IoCtx io_ctx);
+  void add_peer(const Peer<ImageCtxT>& peer);
 
   void acquire_image(InstanceWatcher<ImageCtxT> *instance_watcher,
                      const std::string &global_image_id, Context *on_finish);
@@ -60,12 +71,14 @@ public:
 
   void release_all(Context *on_finish);
 
-  void print_status(Formatter *f, stringstream *ss);
+  void print_status(Formatter *f);
   void start();
   void stop();
   void restart();
   void flush();
 
+  void stop(Context *on_finish);
+
 private:
   /**
    * @verbatim
@@ -81,19 +94,24 @@ private:
    * @endverbatim
    */
 
-  Threads<ImageCtxT> *m_threads;
-  ServiceDaemon<ImageCtxT>* m_service_daemon;
-  RadosRef m_local_rados;
+  typedef std::set<Peer<ImageCtxT>> Peers;
+
+  librados::IoCtx &m_local_io_ctx;
   std::string m_local_mirror_uuid;
-  int64_t m_local_pool_id;
+  Threads<ImageCtxT> *m_threads;
+  ServiceDaemon<ImageCtxT> *m_service_daemon;
+  MirrorStatusUpdater<ImageCtxT>* m_local_status_updater;
+  journal::CacheManagerHandler *m_cache_manager_handler;
+  PoolMetaCache* m_pool_meta_cache;
 
-  Mutex m_lock;
+  mutable ceph::mutex m_lock;
   AsyncOpTracker m_async_op_tracker;
   std::map<std::string, ImageReplayer<ImageCtxT> *> m_image_replayers;
   Peers m_peers;
   Context *m_image_state_check_task = nullptr;
   Context *m_on_shut_down = nullptr;
   bool m_manual_stop = false;
+  bool m_blacklisted = false;
 
   void wait_for_ops();
   void handle_wait_for_ops(int r);