// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #ifndef CEPH_LIBRBD_JOURNAL_DEMOTE_REQUEST_H #define CEPH_LIBRBD_JOURNAL_DEMOTE_REQUEST_H #include "common/Mutex.h" #include "cls/journal/cls_journal_types.h" #include "journal/Future.h" #include "librbd/journal/Types.h" #include "librbd/journal/TypeTraits.h" struct Context; namespace librbd { struct ImageCtx; namespace journal { template class DemoteRequest { public: static DemoteRequest *create(ImageCtxT &image_ctx, Context *on_finish) { return new DemoteRequest(image_ctx, on_finish); } DemoteRequest(ImageCtxT &image_ctx, Context *on_finish); ~DemoteRequest(); void send(); private: /** * @verbatim * * * | * v * OPEN_JOURNALER * * * * * * | * * v * * ALLOCATE_TAG * * * * * * * | * * v * * APPEND_EVENT * * * * * | * * * v * * * COMMIT_EVENT * * * | * * * v * * * STOP_APPEND <* * * * * | * * v * * SHUT_DOWN_JOURNALER <* * * | * v * * * @endverbatim */ typedef typename TypeTraits::Journaler Journaler; typedef typename TypeTraits::Future Future; ImageCtxT &m_image_ctx; Context *m_on_finish; Journaler *m_journaler = nullptr; int m_ret_val = 0; Mutex m_lock; ImageClientMeta m_client_meta; uint64_t m_tag_tid = 0; TagData m_tag_data; cls::journal::Tag m_tag; Future m_future; void open_journaler(); void handle_open_journaler(int r); void allocate_tag(); void handle_allocate_tag(int r); void append_event(); void handle_append_event(int r); void commit_event(); void handle_commit_event(int r); void stop_append(); void handle_stop_append(int r); void shut_down_journaler(); void handle_shut_down_journaler(int r); void finish(int r); }; } // namespace journal } // namespace librbd extern template class librbd::journal::DemoteRequest; #endif // CEPH_LIBRBD_JOURNAL_DEMOTE_REQUEST_H