// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #ifndef CEPH_LIBRBD_JOURNAL_PROMOTE_REQUEST_H #define CEPH_LIBRBD_JOURNAL_PROMOTE_REQUEST_H #include "include/int_types.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 PromoteRequest { public: static PromoteRequest* create(ImageCtxT *image_ctx, bool force, Context *on_finish) { return new PromoteRequest(image_ctx, force, on_finish); } PromoteRequest(ImageCtxT *image_ctx, bool force, Context *on_finish); void send(); private: /** * @verbatim * * * | * v * OPEN * * * * * * * * * * * | * * v * * ALLOCATE_TAG * * * * * * * | * * v * * APPEND_EVENT * * * * * | * * * v * * * COMMIT_EVENT * * * | * * * v * * * STOP_APPEND <* * * * * | * * v * * SHUT_DOWN <* * * * * * * * | * v * * * @endverbatim */ typedef typename TypeTraits::Journaler Journaler; typedef typename TypeTraits::Future Future; ImageCtxT *m_image_ctx; bool m_force; 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 send_open(); void handle_open(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(); void handle_shut_down(int r); void finish(int r); }; } // namespace journal } // namespace librbd extern template class librbd::journal::PromoteRequest; #endif // CEPH_LIBRBD_JOURNAL_PROMOTE_REQUEST_H