1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_RBD_MIRROR_INSTANCES_H
5 #define CEPH_RBD_MIRROR_INSTANCES_H
10 #include "include/buffer.h"
11 #include "common/AsyncOpTracker.h"
12 #include "common/Mutex.h"
13 #include "librbd/Watcher.h"
15 namespace librados { class IoCtx; }
16 namespace librbd { class ImageCtx; }
21 template <typename> struct Threads;
23 template <typename ImageCtxT = librbd::ImageCtx>
26 static Instances *create(Threads<ImageCtxT> *threads,
27 librados::IoCtx &ioctx) {
28 return new Instances(threads, ioctx);
34 Instances(Threads<ImageCtxT> *threads, librados::IoCtx &ioctx);
37 void init(Context *on_finish);
38 void shut_down(Context *on_finish);
40 void notify(const std::string &instance_id);
41 void list(std::vector<std::string> *instance_ids);
47 * <uninitialized> <---------------------\
50 * GET_INSTANCES * * * * * WAIT_FOR_OPS
53 * <initialized> ------------------------/
64 Context *timer_task = nullptr;
66 Instance(const std::string &instance_id) : id(instance_id) {
70 struct C_Notify : Context {
72 std::string instance_id;
74 C_Notify(Instances *instances, const std::string &instance_id)
75 : instances(instances), instance_id(instance_id) {
76 instances->m_async_op_tracker.start_op();
79 void finish(int r) override {
80 instances->handle_notify(instance_id);
81 instances->m_async_op_tracker.finish_op();
85 Threads<ImageCtxT> *m_threads;
86 librados::IoCtx &m_ioctx;
90 std::vector<std::string> m_instance_ids;
91 std::map<std::string, Instance> m_instances;
92 Context *m_on_finish = nullptr;
93 AsyncOpTracker m_async_op_tracker;
95 void handle_notify(const std::string &instance_id);
98 void handle_get_instances(int r);
101 void handle_wait_for_ops(int r);
103 void remove_instance(Instance &instance);
104 void handle_remove_instance(int r);
106 void cancel_remove_task(Instance &instance);
107 void schedule_remove_task(Instance &instance);
110 } // namespace mirror
113 #endif // CEPH_RBD_MIRROR_INSTANCES_H