// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #ifndef CEPH_LIBRBD_IMAGE_PRE_REMOVE_REQUEST_H #define CEPH_LIBRBD_IMAGE_PRE_REMOVE_REQUEST_H #include "include/rados/librados.hpp" #include "include/buffer.h" #include "librbd/ImageCtx.h" #include #include class Context; namespace librbd { namespace image { template class PreRemoveRequest { public: static PreRemoveRequest *create(ImageCtxT *image_ctx, bool force, Context *on_finish) { return new PreRemoveRequest(image_ctx, force, on_finish); } PreRemoveRequest(ImageCtxT *image_ctx, bool force, Context *on_finish) : m_image_ctx(image_ctx), m_force(force), m_on_finish(on_finish) { } void send(); private: /** * @verbatim * * * | (skip if * v not needed) (error) * ACQUIRE EXCLUSIVE LOCK * * * * * * > SHUT DOWN EXCLUSIVE LOCK * | | * v | * CHECK IMAGE WATCHERS <------------------/ * | * v * CHECK GROUP * | * | /------\ * | | | * v v | * REMOVE SNAPS ----/ * | * v * * * @endverbatim */ ImageCtxT* m_image_ctx; bool m_force; Context* m_on_finish; decltype(m_image_ctx->exclusive_lock) m_exclusive_lock = nullptr; bufferlist m_out_bl; std::list m_watchers; std::map m_snap_infos; int m_ret_val = 0; void acquire_exclusive_lock(); void handle_exclusive_lock(int r); void shut_down_exclusive_lock(); void handle_shut_down_exclusive_lock(int r); void validate_image_removal(); void check_image_snaps(); void list_image_watchers(); void handle_list_image_watchers(int r); void check_image_watchers(); void check_group(); void handle_check_group(int r); void remove_snapshot(); void handle_remove_snapshot(int r); void finish(int r); }; } // namespace image } // namespace librbd extern template class librbd::image::PreRemoveRequest; #endif // CEPH_LIBRBD_IMAGE_PRE_REMOVE_REQUEST_H