From: Jason Dillaman Date: Fri, 31 Jan 2020 04:48:41 +0000 (-0500) Subject: rbd-mirror: stub snapshot replayer state machine X-Git-Tag: v15.1.1~472^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=c3c580647a14c731368eec9928c3d5679d123a16;p=ceph-ci.git rbd-mirror: stub snapshot replayer state machine Signed-off-by: Jason Dillaman --- diff --git a/src/tools/rbd_mirror/CMakeLists.txt b/src/tools/rbd_mirror/CMakeLists.txt index 5ab5d6c588f..6140e3e62ee 100644 --- a/src/tools/rbd_mirror/CMakeLists.txt +++ b/src/tools/rbd_mirror/CMakeLists.txt @@ -53,6 +53,7 @@ set(rbd_mirror_internal image_replayer/journal/SyncPointHandler.cc image_replayer/snapshot/CreateLocalImageRequest.cc image_replayer/snapshot/PrepareReplayRequest.cc + image_replayer/snapshot/Replayer.cc image_replayer/snapshot/StateBuilder.cc image_sync/SyncPointCreateRequest.cc image_sync/SyncPointPruneRequest.cc diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc new file mode 100644 index 00000000000..d58e78f4d20 --- /dev/null +++ b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc @@ -0,0 +1,95 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "Replayer.h" +#include "common/debug.h" +#include "common/errno.h" +#include "common/Timer.h" +#include "common/WorkQueue.h" +#include "librbd/Journal.h" +#include "librbd/Utils.h" +#include "tools/rbd_mirror/Threads.h" +#include "tools/rbd_mirror/Types.h" +#include "tools/rbd_mirror/image_replayer/CloseImageRequest.h" +#include "tools/rbd_mirror/image_replayer/ReplayerListener.h" +#include "tools/rbd_mirror/image_replayer/Utils.h" +#include "tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h" + +#define dout_context g_ceph_context +#define dout_subsys ceph_subsys_rbd_mirror +#undef dout_prefix +#define dout_prefix *_dout << "rbd::mirror::image_replayer::snapshot::" \ + << "Replayer: " << this << " " << __func__ << ": " + +extern PerfCounters *g_perf_counters; + +namespace rbd { +namespace mirror { +namespace image_replayer { +namespace snapshot { + +using librbd::util::create_async_context_callback; +using librbd::util::create_context_callback; + +template +Replayer::Replayer( + Threads* threads, + const std::string& local_mirror_uuid, + StateBuilder* state_builder, + ReplayerListener* replayer_listener) + : m_threads(threads), + m_local_mirror_uuid(local_mirror_uuid), + m_state_builder(state_builder), + m_replayer_listener(replayer_listener), + m_lock(ceph::make_mutex(librbd::util::unique_lock_name( + "rbd::mirror::image_replayer::snapshot::Replayer", this))) { + dout(10) << dendl; +} + +template +Replayer::~Replayer() { + dout(10) << dendl; +} + +template +void Replayer::init(Context* on_finish) { + dout(10) << dendl; + + // TODO + m_state = STATE_REPLAYING; + m_threads->work_queue->queue(on_finish, 0); +} + +template +void Replayer::shut_down(Context* on_finish) { + dout(10) << dendl; + + // TODO + m_state = STATE_COMPLETE; + m_threads->work_queue->queue(on_finish, 0); +} + +template +void Replayer::flush(Context* on_finish) { + dout(10) << dendl; + + // TODO + m_threads->work_queue->queue(on_finish, 0); +} + +template +bool Replayer::get_replay_status(std::string* description, + Context* on_finish) { + dout(10) << dendl; + + *description = "NOT IMPLEMENTED"; + on_finish->complete(-EEXIST); + return true; +} + +} // namespace snapshot +} // namespace image_replayer +} // namespace mirror +} // namespace rbd + +template class rbd::mirror::image_replayer::snapshot::Replayer; diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h new file mode 100644 index 00000000000..718f78c6113 --- /dev/null +++ b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h @@ -0,0 +1,123 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#ifndef RBD_MIRROR_IMAGE_REPLAYER_SNAPSHOT_REPLAYER_H +#define RBD_MIRROR_IMAGE_REPLAYER_SNAPSHOT_REPLAYER_H + +#include "tools/rbd_mirror/image_replayer/Replayer.h" +#include "common/ceph_mutex.h" +#include +#include + +namespace librbd { + +struct ImageCtx; +namespace snapshot { template class Replay; } + +} // namespace librbd + +namespace rbd { +namespace mirror { + +template struct Threads; + +namespace image_replayer { + +struct ReplayerListener; + +namespace snapshot { + +template class EventPreprocessor; +template class ReplayStatusFormatter; +template class StateBuilder; + +template +class Replayer : public image_replayer::Replayer { +public: + static Replayer* create( + Threads* threads, + const std::string& local_mirror_uuid, + StateBuilder* state_builder, + ReplayerListener* replayer_listener) { + return new Replayer(threads, local_mirror_uuid, state_builder, + replayer_listener); + } + + Replayer( + Threads* threads, + const std::string& local_mirror_uuid, + StateBuilder* state_builder, + ReplayerListener* replayer_listener); + ~Replayer(); + + void destroy() override { + delete this; + } + + void init(Context* on_finish) override; + void shut_down(Context* on_finish) override; + + void flush(Context* on_finish) override; + + bool get_replay_status(std::string* description, Context* on_finish) override; + + bool is_replaying() const override { + std::unique_lock locker{m_lock}; + return (m_state == STATE_REPLAYING); + } + + bool is_resync_requested() const override { + std::unique_lock locker(m_lock); + // TODO + return false; + } + + int get_error_code() const override { + std::unique_lock locker(m_lock); + // TODO + return 0; + } + + std::string get_error_description() const override { + std::unique_lock locker(m_lock); + // TODO + return ""; + } + +private: + // TODO + /** + * @verbatim + * + * + * | + * v + * + * + * @endverbatim + */ + + enum State { + STATE_INIT, + STATE_REPLAYING, + STATE_COMPLETE + }; + + Threads* m_threads; + std::string m_local_mirror_uuid; + StateBuilder* m_state_builder; + ReplayerListener* m_replayer_listener; + + mutable ceph::mutex m_lock; + + State m_state = STATE_INIT; +}; + +} // namespace snapshot +} // namespace image_replayer +} // namespace mirror +} // namespace rbd + +extern template class rbd::mirror::image_replayer::snapshot::Replayer; + +#endif // RBD_MIRROR_IMAGE_REPLAYER_SNAPSHOT_REPLAYER_H diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc b/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc index c52d3a611a1..78fe861b4a1 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc +++ b/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc @@ -9,6 +9,7 @@ #include "librbd/ImageCtx.h" #include "tools/rbd_mirror/image_replayer/snapshot/CreateLocalImageRequest.h" #include "tools/rbd_mirror/image_replayer/snapshot/PrepareReplayRequest.h" +#include "tools/rbd_mirror/image_replayer/snapshot/Replayer.h" #define dout_context g_ceph_context #define dout_subsys ceph_subsys_rbd_mirror @@ -94,9 +95,8 @@ image_replayer::Replayer* StateBuilder::create_replayer( Threads* threads, const std::string& local_mirror_uuid, ReplayerListener* replayer_listener) { - // TODO - ceph_assert(false); - return nullptr; + return Replayer::create( + threads, local_mirror_uuid, this, replayer_listener); } } // namespace snapshot