// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab /* * Ceph - scalable distributed file system * * Copyright (C) 2014 Adam Crume * * This is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software * Foundation. See file COPYING. * */ #ifndef _INCLUDED_RBD_REPLAY_IOS_HPP #define _INCLUDED_RBD_REPLAY_IOS_HPP // This code assumes that IO IDs and timestamps are related monotonically. // In other words, (a.id < b.id) == (a.timestamp < b.timestamp) for all IOs a and b. #include "include/buffer_fwd.h" #include #include #include #include #include #include #include "actions.hpp" namespace rbd_replay { class IO; typedef std::set > io_set_t; typedef std::map > io_map_t; /** Used by rbd-replay-prep for processing the raw trace. Corresponds to the Action class, except that Actions are executed by rbd-replay, and IOs are used by rbd-replay-prep for processing the raw trace. */ class IO : public boost::enable_shared_from_this { public: typedef boost::shared_ptr ptr; typedef std::vector ptrs; /** @param ionum ID of this %IO @param start_time time the %IO started, in nanoseconds @param thread_id ID of the thread that issued the %IO */ IO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps) : m_ionum(ionum), m_start_time(start_time), m_dependencies(deps), m_thread_id(thread_id), m_completed(false) { } virtual ~IO() { } uint64_t start_time() const { return m_start_time; } io_set_t& dependencies() { return m_dependencies; } const io_set_t& dependencies() const { return m_dependencies; } virtual void encode(bufferlist &bl) const = 0; void set_ionum(action_id_t ionum) { m_ionum = ionum; } action_id_t ionum() const { return m_ionum; } thread_id_t thread_id() const { return m_thread_id; } virtual void write_debug(std::ostream& out) const = 0; protected: void write_debug_base(std::ostream& out, std::string iotype) const; private: action_id_t m_ionum; uint64_t m_start_time; io_set_t m_dependencies; thread_id_t m_thread_id; bool m_completed; }; /// Used for dumping debug info. /// @related IO std::ostream& operator<<(std::ostream &out, const IO::ptr &io); class StartThreadIO : public IO { public: StartThreadIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id) : IO(ionum, start_time, thread_id, io_set_t()) { } void encode(bufferlist &bl) const override; void write_debug(std::ostream& out) const override; }; class StopThreadIO : public IO { public: StopThreadIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps) : IO(ionum, start_time, thread_id, deps) { } void encode(bufferlist &bl) const override; void write_debug(std::ostream& out) const override; }; class ReadIO : public IO { public: ReadIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps, imagectx_id_t imagectx, uint64_t offset, uint64_t length) : IO(ionum, start_time, thread_id, deps), m_imagectx(imagectx), m_offset(offset), m_length(length) { } void encode(bufferlist &bl) const override; void write_debug(std::ostream& out) const override; private: imagectx_id_t m_imagectx; uint64_t m_offset; uint64_t m_length; }; class WriteIO : public IO { public: WriteIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps, imagectx_id_t imagectx, uint64_t offset, uint64_t length) : IO(ionum, start_time, thread_id, deps), m_imagectx(imagectx), m_offset(offset), m_length(length) { } void encode(bufferlist &bl) const override; void write_debug(std::ostream& out) const override; private: imagectx_id_t m_imagectx; uint64_t m_offset; uint64_t m_length; }; class DiscardIO : public IO { public: DiscardIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps, imagectx_id_t imagectx, uint64_t offset, uint64_t length) : IO(ionum, start_time, thread_id, deps), m_imagectx(imagectx), m_offset(offset), m_length(length) { } void encode(bufferlist &bl) const override; void write_debug(std::ostream& out) const override; private: imagectx_id_t m_imagectx; uint64_t m_offset; uint64_t m_length; }; class AioReadIO : public IO { public: AioReadIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps, imagectx_id_t imagectx, uint64_t offset, uint64_t length) : IO(ionum, start_time, thread_id, deps), m_imagectx(imagectx), m_offset(offset), m_length(length) { } void encode(bufferlist &bl) const override; void write_debug(std::ostream& out) const override; private: imagectx_id_t m_imagectx; uint64_t m_offset; uint64_t m_length; }; class AioWriteIO : public IO { public: AioWriteIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps, imagectx_id_t imagectx, uint64_t offset, uint64_t length) : IO(ionum, start_time, thread_id, deps), m_imagectx(imagectx), m_offset(offset), m_length(length) { } void encode(bufferlist &bl) const override; void write_debug(std::ostream& out) const override; private: imagectx_id_t m_imagectx; uint64_t m_offset; uint64_t m_length; }; class AioDiscardIO : public IO { public: AioDiscardIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps, imagectx_id_t imagectx, uint64_t offset, uint64_t length) : IO(ionum, start_time, thread_id, deps), m_imagectx(imagectx), m_offset(offset), m_length(length) { } void encode(bufferlist &bl) const override; void write_debug(std::ostream& out) const override; private: imagectx_id_t m_imagectx; uint64_t m_offset; uint64_t m_length; }; class OpenImageIO : public IO { public: OpenImageIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps, imagectx_id_t imagectx, const std::string& name, const std::string& snap_name, bool readonly) : IO(ionum, start_time, thread_id, deps), m_imagectx(imagectx), m_name(name), m_snap_name(snap_name), m_readonly(readonly) { } void encode(bufferlist &bl) const override; imagectx_id_t imagectx() const { return m_imagectx; } void write_debug(std::ostream& out) const override; private: imagectx_id_t m_imagectx; std::string m_name; std::string m_snap_name; bool m_readonly; }; class CloseImageIO : public IO { public: CloseImageIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps, imagectx_id_t imagectx) : IO(ionum, start_time, thread_id, deps), m_imagectx(imagectx) { } void encode(bufferlist &bl) const override; imagectx_id_t imagectx() const { return m_imagectx; } void write_debug(std::ostream& out) const override; private: imagectx_id_t m_imagectx; }; class AioOpenImageIO : public IO { public: AioOpenImageIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps, imagectx_id_t imagectx, const std::string& name, const std::string& snap_name, bool readonly) : IO(ionum, start_time, thread_id, deps), m_imagectx(imagectx), m_name(name), m_snap_name(snap_name), m_readonly(readonly) { } void encode(bufferlist &bl) const override; imagectx_id_t imagectx() const { return m_imagectx; } void write_debug(std::ostream& out) const override; private: imagectx_id_t m_imagectx; std::string m_name; std::string m_snap_name; bool m_readonly; }; class AioCloseImageIO : public IO { public: AioCloseImageIO(action_id_t ionum, uint64_t start_time, thread_id_t thread_id, const io_set_t& deps, imagectx_id_t imagectx) : IO(ionum, start_time, thread_id, deps), m_imagectx(imagectx) { } void encode(bufferlist &bl) const override; imagectx_id_t imagectx() const { return m_imagectx; } void write_debug(std::ostream& out) const override; private: imagectx_id_t m_imagectx; }; } #endif