#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 {
template <typename> class ImageReplayer;
template <typename> class InstanceWatcher;
+template <typename> class MirrorStatusUpdater;
+struct PoolMetaCache;
template <typename> class ServiceDaemon;
template <typename> struct Threads;
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);
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
* @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);