X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Ftools%2Frbd_mirror%2FInstanceWatcher.h;h=79c2d1c0714a295d8b28f5bb57298ba3ad04fbd4;hb=31f18b776d001752a193a7cec8bb49033c1a904c;hp=a9d287f1306295dbb15502fbca6f2e0e911a29e7;hpb=40152f1e46a80b3405e5558a442ee632198dfd24;p=ceph.git diff --git a/ceph/src/tools/rbd_mirror/InstanceWatcher.h b/ceph/src/tools/rbd_mirror/InstanceWatcher.h index a9d287f13..79c2d1c07 100644 --- a/ceph/src/tools/rbd_mirror/InstanceWatcher.h +++ b/ceph/src/tools/rbd_mirror/InstanceWatcher.h @@ -5,6 +5,7 @@ #define CEPH_RBD_MIRROR_INSTANCE_WATCHER_H #include +#include #include #include #include @@ -24,6 +25,7 @@ template class ManagedLock; namespace rbd { namespace mirror { +template class ImageSyncThrottler; template class InstanceReplayer; template struct Threads; @@ -72,8 +74,18 @@ public: const std::string &peer_image_id, bool schedule_delete, Context *on_notify_ack); + void notify_sync_request(const std::string &sync_id, Context *on_sync_start); + bool cancel_sync_request(const std::string &sync_id); + void notify_sync_complete(const std::string &sync_id); + + void print_sync_status(Formatter *f, stringstream *ss); + void cancel_notify_requests(const std::string &instance_id); + void handle_acquire_leader(); + void handle_release_leader(); + void handle_update_leader(const std::string &leader_instance_id); + private: /** * @verbatim @@ -105,6 +117,9 @@ private: */ struct C_NotifyInstanceRequest; + struct C_SyncRequest; + + typedef std::pair Id; struct HandlePayloadVisitor : public boost::static_visitor { InstanceWatcher *instance_watcher; @@ -148,11 +163,15 @@ private: Context *m_on_finish = nullptr; int m_ret_val = 0; bool m_removing = false; + std::string m_leader_instance_id; librbd::managed_lock::Locker m_instance_locker; std::set> m_notify_ops; AsyncOpTracker m_notify_op_tracker; uint64_t m_request_seq = 0; std::set m_requests; + std::set m_suspended_ops; + std::map m_inflight_sync_reqs; + ImageSyncThrottler *m_image_sync_throttler = nullptr; void register_instance(); void handle_register_instance(int r); @@ -187,8 +206,20 @@ private: void break_instance_lock(); void handle_break_instance_lock(int r); + void suspend_notify_request(C_NotifyInstanceRequest *req); + bool unsuspend_notify_request(C_NotifyInstanceRequest *req); + void unsuspend_notify_requests(); + + void handle_notify_sync_request(C_SyncRequest *sync_ctx, int r); + void handle_notify_sync_complete(C_SyncRequest *sync_ctx, int r); + + void notify_sync_start(const std::string &instance_id, + const std::string &sync_id); + Context *prepare_request(const std::string &instance_id, uint64_t request_id, C_NotifyAck *on_notify_ack); + void complete_request(const std::string &instance_id, uint64_t request_id, + int r); void handle_notify(uint64_t notify_id, uint64_t handle, uint64_t notifier_id, bufferlist &bl) override; @@ -202,12 +233,23 @@ private: const std::string &peer_image_id, bool schedule_delete, Context *on_finish); + void handle_sync_request(const std::string &instance_id, + const std::string &sync_id, Context *on_finish); + void handle_sync_start(const std::string &instance_id, + const std::string &sync_id, Context *on_finish); + void handle_payload(const std::string &instance_id, const instance_watcher::ImageAcquirePayload &payload, C_NotifyAck *on_notify_ack); void handle_payload(const std::string &instance_id, const instance_watcher::ImageReleasePayload &payload, C_NotifyAck *on_notify_ack); + void handle_payload(const std::string &instance_id, + const instance_watcher::SyncRequestPayload &payload, + C_NotifyAck *on_notify_ack); + void handle_payload(const std::string &instance_id, + const instance_watcher::SyncStartPayload &payload, + C_NotifyAck *on_notify_ack); void handle_payload(const std::string &instance_id, const instance_watcher::UnknownPayload &payload, C_NotifyAck *on_notify_ack);