1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2014 Adam Crume <adamcrume@gmail.com>
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
15 #ifndef _INCLUDED_RBD_REPLAY_IOS_HPP
16 #define _INCLUDED_RBD_REPLAY_IOS_HPP
18 // This code assumes that IO IDs and timestamps are related monotonically.
19 // In other words, (a.id < b.id) == (a.timestamp < b.timestamp) for all IOs a and b.
21 #include "include/buffer_fwd.h"
22 #include <boost/enable_shared_from_this.hpp>
23 #include <boost/shared_ptr.hpp>
28 #include "actions.hpp"
31 namespace rbd_replay {
35 typedef std::set<boost::shared_ptr<IO> > io_set_t;
37 typedef std::map<action_id_t, boost::shared_ptr<IO> > io_map_t;
40 Used by rbd-replay-prep for processing the raw trace.
41 Corresponds to the Action class, except that Actions are executed by rbd-replay,
42 and IOs are used by rbd-replay-prep for processing the raw trace.
44 class IO : public boost::enable_shared_from_this<IO> {
46 typedef boost::shared_ptr<IO> ptr;
47 typedef std::vector<ptr> ptrs;
50 @param ionum ID of this %IO
51 @param start_time time the %IO started, in nanoseconds
52 @param thread_id ID of the thread that issued the %IO
56 thread_id_t thread_id,
59 m_start_time(start_time),
61 m_thread_id(thread_id),
68 uint64_t start_time() const {
72 io_set_t& dependencies() {
73 return m_dependencies;
76 const io_set_t& dependencies() const {
77 return m_dependencies;
80 virtual void encode(bufferlist &bl) const = 0;
82 void set_ionum(action_id_t ionum) {
86 action_id_t ionum() const {
90 thread_id_t thread_id() const {
94 virtual void write_debug(std::ostream& out) const = 0;
97 void write_debug_base(std::ostream& out, std::string iotype) const;
101 uint64_t m_start_time;
102 io_set_t m_dependencies;
103 thread_id_t m_thread_id;
107 /// Used for dumping debug info.
109 std::ostream& operator<<(std::ostream &out, const IO::ptr &io);
112 class StartThreadIO : public IO {
114 StartThreadIO(action_id_t ionum,
116 thread_id_t thread_id)
117 : IO(ionum, start_time, thread_id, io_set_t()) {
120 void encode(bufferlist &bl) const override;
122 void write_debug(std::ostream& out) const override;
125 class StopThreadIO : public IO {
127 StopThreadIO(action_id_t ionum,
129 thread_id_t thread_id,
130 const io_set_t& deps)
131 : IO(ionum, start_time, thread_id, deps) {
134 void encode(bufferlist &bl) const override;
136 void write_debug(std::ostream& out) const override;
139 class ReadIO : public IO {
141 ReadIO(action_id_t ionum,
143 thread_id_t thread_id,
144 const io_set_t& deps,
145 imagectx_id_t imagectx,
148 : IO(ionum, start_time, thread_id, deps),
149 m_imagectx(imagectx),
154 void encode(bufferlist &bl) const override;
156 void write_debug(std::ostream& out) const override;
159 imagectx_id_t m_imagectx;
164 class WriteIO : public IO {
166 WriteIO(action_id_t ionum,
168 thread_id_t thread_id,
169 const io_set_t& deps,
170 imagectx_id_t imagectx,
173 : IO(ionum, start_time, thread_id, deps),
174 m_imagectx(imagectx),
179 void encode(bufferlist &bl) const override;
181 void write_debug(std::ostream& out) const override;
184 imagectx_id_t m_imagectx;
189 class DiscardIO : public IO {
191 DiscardIO(action_id_t ionum,
193 thread_id_t thread_id,
194 const io_set_t& deps,
195 imagectx_id_t imagectx,
198 : IO(ionum, start_time, thread_id, deps),
199 m_imagectx(imagectx),
204 void encode(bufferlist &bl) const override;
206 void write_debug(std::ostream& out) const override;
209 imagectx_id_t m_imagectx;
214 class AioReadIO : public IO {
216 AioReadIO(action_id_t ionum,
218 thread_id_t thread_id,
219 const io_set_t& deps,
220 imagectx_id_t imagectx,
223 : IO(ionum, start_time, thread_id, deps),
224 m_imagectx(imagectx),
229 void encode(bufferlist &bl) const override;
231 void write_debug(std::ostream& out) const override;
234 imagectx_id_t m_imagectx;
239 class AioWriteIO : public IO {
241 AioWriteIO(action_id_t ionum,
243 thread_id_t thread_id,
244 const io_set_t& deps,
245 imagectx_id_t imagectx,
248 : IO(ionum, start_time, thread_id, deps),
249 m_imagectx(imagectx),
254 void encode(bufferlist &bl) const override;
256 void write_debug(std::ostream& out) const override;
259 imagectx_id_t m_imagectx;
264 class AioDiscardIO : public IO {
266 AioDiscardIO(action_id_t ionum,
268 thread_id_t thread_id,
269 const io_set_t& deps,
270 imagectx_id_t imagectx,
273 : IO(ionum, start_time, thread_id, deps),
274 m_imagectx(imagectx),
279 void encode(bufferlist &bl) const override;
281 void write_debug(std::ostream& out) const override;
284 imagectx_id_t m_imagectx;
289 class OpenImageIO : public IO {
291 OpenImageIO(action_id_t ionum,
293 thread_id_t thread_id,
294 const io_set_t& deps,
295 imagectx_id_t imagectx,
296 const std::string& name,
297 const std::string& snap_name,
299 : IO(ionum, start_time, thread_id, deps),
300 m_imagectx(imagectx),
302 m_snap_name(snap_name),
303 m_readonly(readonly) {
306 void encode(bufferlist &bl) const override;
308 imagectx_id_t imagectx() const {
312 void write_debug(std::ostream& out) const override;
315 imagectx_id_t m_imagectx;
317 std::string m_snap_name;
321 class CloseImageIO : public IO {
323 CloseImageIO(action_id_t ionum,
325 thread_id_t thread_id,
326 const io_set_t& deps,
327 imagectx_id_t imagectx)
328 : IO(ionum, start_time, thread_id, deps),
329 m_imagectx(imagectx) {
332 void encode(bufferlist &bl) const override;
334 imagectx_id_t imagectx() const {
338 void write_debug(std::ostream& out) const override;
341 imagectx_id_t m_imagectx;
344 class AioOpenImageIO : public IO {
346 AioOpenImageIO(action_id_t ionum,
348 thread_id_t thread_id,
349 const io_set_t& deps,
350 imagectx_id_t imagectx,
351 const std::string& name,
352 const std::string& snap_name,
354 : IO(ionum, start_time, thread_id, deps),
355 m_imagectx(imagectx),
357 m_snap_name(snap_name),
358 m_readonly(readonly) {
361 void encode(bufferlist &bl) const override;
363 imagectx_id_t imagectx() const {
367 void write_debug(std::ostream& out) const override;
370 imagectx_id_t m_imagectx;
372 std::string m_snap_name;
376 class AioCloseImageIO : public IO {
378 AioCloseImageIO(action_id_t ionum,
380 thread_id_t thread_id,
381 const io_set_t& deps,
382 imagectx_id_t imagectx)
383 : IO(ionum, start_time, thread_id, deps),
384 m_imagectx(imagectx) {
387 void encode(bufferlist &bl) const override;
389 imagectx_id_t imagectx() const {
393 void write_debug(std::ostream& out) const override;
396 imagectx_id_t m_imagectx;