// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #ifndef CEPH_LIBRBD_EXCLUSIVE_LOCK_H #define CEPH_LIBRBD_EXCLUSIVE_LOCK_H #include "librbd/ManagedLock.h" #include "common/AsyncOpTracker.h" namespace librbd { template class ExclusiveLock : public ManagedLock { public: static ExclusiveLock *create(ImageCtxT &image_ctx) { return new ExclusiveLock(image_ctx); } ExclusiveLock(ImageCtxT &image_ctx); bool accept_requests(int *ret_val = nullptr) const; bool accept_ops() const; void block_requests(int r); void unblock_requests(); void init(uint64_t features, Context *on_init); void shut_down(Context *on_shutdown); void handle_peer_notification(int r); Context *start_op(); protected: void shutdown_handler(int r, Context *on_finish) override; void pre_acquire_lock_handler(Context *on_finish) override; void post_acquire_lock_handler(int r, Context *on_finish) override; void pre_release_lock_handler(bool shutting_down, Context *on_finish) override; void post_release_lock_handler(bool shutting_down, int r, Context *on_finish) override; void post_reacquire_lock_handler(int r, Context *on_finish) override; private: /** * @verbatim * * * * > WAITING_FOR_REGISTER --------\ * | * (watch not registered) | * | * | * | * * > WAITING_FOR_PEER ------------\ * | * (request_lock busy) | * | * | * | * * * * * * * * * * * * * * | * | * | * v (init) (try_lock/request_lock) * | * UNINITIALIZED -------> UNLOCKED ------------------------> ACQUIRING <--/ * ^ | * | v * RELEASING POST_ACQUIRING * | | * | | * | (release_lock) v * PRE_RELEASING <------------------------ LOCKED * * * | * v * REACQUIRING -------------------------------------> * . ^ * . | * . . . > ---> ---/ * * * | * | * v * PRE_SHUTTING_DOWN ---> SHUTTING_DOWN ---> SHUTDOWN ---> * * @endverbatim */ struct C_InitComplete; ImageCtxT& m_image_ctx; Context *m_pre_post_callback = nullptr; AsyncOpTracker m_async_op_tracker; uint32_t m_request_blocked_count = 0; int m_request_blocked_ret_val = 0; int m_acquire_lock_peer_ret_val = 0; bool accept_ops(const Mutex &lock) const; void handle_init_complete(uint64_t features); void handle_post_acquiring_lock(int r); void handle_post_acquired_lock(int r); }; } // namespace librbd #endif // CEPH_LIBRBD_EXCLUSIVE_LOCK_H