From 18c081e54ae01bba0fded35fe9324db66af27024 Mon Sep 17 00:00:00 2001 From: Adam Crume Date: Tue, 12 Aug 2014 16:10:53 -0700 Subject: [PATCH] rbd-replay: Remove extent tracepoints and inline extents Signed-off-by: Adam Crume --- src/librbd/librbd.cc | 16 +--- src/rbd_replay/rbd-replay-prep.cc | 143 ++++++++++-------------------- src/tracing/librbd.tp | 24 ++--- 3 files changed, 56 insertions(+), 127 deletions(-) diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index eced4f921b8c4..24e191adfd0f1 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -477,9 +477,7 @@ namespace librbd { ssize_t Image::read(uint64_t ofs, size_t len, bufferlist& bl) { ImageCtx *ictx = (ImageCtx *)ctx; - // TODO: Should these be merged? - tracepoint(librbd, read_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only); - tracepoint(librbd, read_extent, ofs, len); + tracepoint(librbd, read_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, ofs, len); bufferptr ptr(len); bl.push_back(ptr); int r = librbd::read(ictx, ofs, len, bl.c_str()); @@ -565,9 +563,7 @@ namespace librbd { RBD::AioCompletion *c) { ImageCtx *ictx = (ImageCtx *)ctx; - // TODO: See if these tracepoints should be merged - tracepoint(librbd, aio_read_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, bl.c_str(), c->pc); - tracepoint(librbd, aio_read_extent, off, len); + tracepoint(librbd, aio_read_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, off, len, bl.c_str(), c->pc); ldout(ictx->cct, 10) << "Image::aio_read() buf=" << (void *)bl.c_str() << "~" << (void *)(bl.c_str() + len - 1) << dendl; int r = librbd::aio_read(ictx, off, len, NULL, &bl, (librbd::AioCompletion *)c->pc); @@ -1163,9 +1159,7 @@ extern "C" ssize_t rbd_read(rbd_image_t image, uint64_t ofs, size_t len, char *buf) { librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; - // TODO: Should these tracepoints be combined? - tracepoint(librbd, read_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only); - tracepoint(librbd, read_extent, ofs, len); + tracepoint(librbd, read_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, ofs, len); int r = librbd::read(ictx, ofs, len, buf); tracepoint(librbd, read_exit, r); return r; @@ -1257,9 +1251,7 @@ extern "C" int rbd_aio_read(rbd_image_t image, uint64_t off, size_t len, { librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c; - // TODO: See if these tracepoints can be combined - tracepoint(librbd, aio_read_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, buf, comp->pc); - tracepoint(librbd, aio_read_extent, off, len); + tracepoint(librbd, aio_read_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, off, len, buf, comp->pc); int r = librbd::aio_read(ictx, off, len, buf, NULL, (librbd::AioCompletion *)comp->pc); tracepoint(librbd, aio_read_exit, r); diff --git a/src/rbd_replay/rbd-replay-prep.cc b/src/rbd_replay/rbd-replay-prep.cc index 96adfc18e1c17..0562a7f63e3a9 100644 --- a/src/rbd_replay/rbd-replay-prep.cc +++ b/src/rbd_replay/rbd-replay-prep.cc @@ -33,15 +33,6 @@ using namespace rbd_replay; // Allows us to easily expose all the functions to make debugging easier. #define STATIC static -struct extent { - extent() : offset(0), length(0) { - } - extent(uint64_t offset, uint64_t length) : offset(offset), length(length) { - } - uint64_t offset; - uint64_t length; -}; - class IO; typedef set > io_set_t; @@ -260,42 +251,31 @@ public: uint64_t start_time, thread_id_t thread_id, IO::ptr prev, - imagectx_id_t imagectx) + imagectx_id_t imagectx, + uint64_t offset, + uint64_t length) : IO(ionum, start_time, thread_id, prev), m_imagectx(imagectx), - m_extents(vector()) { + m_offset(offset), + m_length(length) { } void write_to(Ser& out) const { IO::write_to(out, IO_READ); - // TODO: figure out how to handle empty IO, i.e. reads/writes with no extents. - // These happen if the trace cuts off mid-IO. We should just toss it, but it - // might mess up the dependency graph. - assertf(m_extents.size() == 1, "m_extents.size() = %d", m_extents.size()); out.write_uint64_t(m_imagectx); - out.write_uint64_t(m_extents[0].offset); - out.write_uint64_t(m_extents[0].length); - } - - void add_extent(const extent& e) { - m_extents.push_back(e); + out.write_uint64_t(m_offset); + out.write_uint64_t(m_length); } void write_debug(ostream& out) { write_debug_base(out, "read"); - out << ", imagectx=" << m_imagectx << ", extents=["; - for (int i = 0, n = m_extents.size(); i < n; i++) { - if (i > 0) { - out << ", "; - } - out << m_extents[i].offset << "+" << m_extents[i].length; - } - out << "]"; + out << ", imagectx=" << m_imagectx << ", offset=" << m_offset << ", length=" << m_length << "]"; } private: imagectx_id_t m_imagectx; - vector m_extents; + uint64_t m_offset; + uint64_t m_length; }; class WriteIO : public IO { @@ -305,35 +285,30 @@ public: thread_id_t thread_id, IO::ptr prev, imagectx_id_t imagectx, - const vector& extents) + uint64_t offset, + uint64_t length) : IO(ionum, start_time, thread_id, prev), m_imagectx(imagectx), - m_extents(extents) { + m_offset(offset), + m_length(length) { } void write_to(Ser& out) const { IO::write_to(out, IO_WRITE); - assertf(m_extents.size() == 1, "m_extents.size() = %d", m_extents.size()); out.write_uint64_t(m_imagectx); - out.write_uint64_t(m_extents[0].offset); - out.write_uint64_t(m_extents[0].length); + out.write_uint64_t(m_offset); + out.write_uint64_t(m_length); } void write_debug(ostream& out) { write_debug_base(out, "write"); - out << ", imagectx=" << m_imagectx << ", extents=["; - for (int i = 0, n = m_extents.size(); i < n; i++) { - if (i > 0) { - out << ", "; - } - out << m_extents[i].offset << "+" << m_extents[i].length; - } - out << "]"; + out << ", imagectx=" << m_imagectx << ", offset=" << m_offset << ", length=" << m_length << "]"; } private: imagectx_id_t m_imagectx; - vector m_extents; + uint64_t m_offset; + uint64_t m_length; }; class AioReadIO : public IO { @@ -342,39 +317,30 @@ public: uint64_t start_time, thread_id_t thread_id, IO::ptr prev, - imagectx_id_t imagectx) + imagectx_id_t imagectx, + uint64_t offset, + uint64_t length) : IO(ionum, start_time, thread_id, prev), m_imagectx(imagectx), - m_extents(vector()) { + m_offset(offset), + m_length(length) { } void write_to(Ser& out) const { IO::write_to(out, IO_ASYNC_READ); - assertf(m_extents.size() == 1, "m_extents.size() = %d", m_extents.size()); out.write_uint64_t(m_imagectx); - out.write_uint64_t(m_extents[0].offset); - out.write_uint64_t(m_extents[0].length); + out.write_uint64_t(m_offset); + out.write_uint64_t(m_length); } - void add_extent(const extent& e) { - m_extents.push_back(e); - } - - void write_debug(ostream& out) { write_debug_base(out, "aio read"); - out << ", imagectx=" << m_imagectx << ", extents=["; - for (int i = 0, n = m_extents.size(); i < n; i++) { - if (i > 0) { - out << ", "; - } - out << m_extents[i].offset << "+" << m_extents[i].length; - } - out << "]"; + out << ", imagectx=" << m_imagectx << ", offset=" << m_offset << ", length=" << m_length << "]"; } private: imagectx_id_t m_imagectx; - vector m_extents; + uint64_t m_offset; + uint64_t m_length; }; class AioWriteIO : public IO { @@ -384,35 +350,30 @@ public: thread_id_t thread_id, IO::ptr prev, imagectx_id_t imagectx, - const vector& extents) + uint64_t offset, + uint64_t length) : IO(ionum, start_time, thread_id, prev), m_imagectx(imagectx), - m_extents(extents) { + m_offset(offset), + m_length(length) { } void write_to(Ser& out) const { IO::write_to(out, IO_ASYNC_WRITE); - assertf(m_extents.size() == 1, "m_extents.size() = %d", m_extents.size()); out.write_uint64_t(m_imagectx); - out.write_uint64_t(m_extents[0].offset); - out.write_uint64_t(m_extents[0].length); + out.write_uint64_t(m_offset); + out.write_uint64_t(m_length); } void write_debug(ostream& out) { write_debug_base(out, "aio write"); - out << ", imagectx=" << m_imagectx << ", extents=["; - for (int i = 0, n = m_extents.size(); i < n; i++) { - if (i > 0) { - out << ", "; - } - out << m_extents[i].offset << "+" << m_extents[i].length; - } - out << "]"; + out << ", imagectx=" << m_imagectx << ", offset=" << m_offset << ", length=" << m_length << "]"; } private: imagectx_id_t m_imagectx; - vector m_extents; + uint64_t m_offset; + uint64_t m_length; }; class OpenImageIO : public IO { @@ -874,9 +835,11 @@ private: string snap_name(fields.string("snap_name")); bool readonly = fields.int64("read_only"); imagectx_id_t imagectx = fields.uint64("imagectx"); + uint64_t offset = fields.uint64("offset"); + uint64_t length = fields.uint64("length"); require_image(ts, thread, imagectx, name, snap_name, readonly); action_id_t ionum = next_id(); - IO::ptr io(new ReadIO(ionum, ts, threadID, thread->pending_io(), imagectx)); + IO::ptr io(new ReadIO(ionum, ts, threadID, thread->pending_io(), imagectx, offset, length)); io->add_dependencies(m_recent_completions); thread->issued_io(io, m_threads); m_ios.push_back(io); @@ -910,12 +873,6 @@ private: boost::shared_ptr io(boost::dynamic_pointer_cast(thread->pending_io())); assert(io); m_open_images.erase(io->imagectx()); - } else if (strcmp(event_name, "librbd:read_extent") == 0) { - boost::shared_ptr io(boost::dynamic_pointer_cast(thread->pending_io())); - assert(io); - uint64_t offset = fields.uint64("offset"); - uint64_t length = fields.uint64("length"); - io->add_extent(extent(offset, length)); } else if (strcmp(event_name, "librbd:read_exit") == 0) { IO::ptr completionIO(thread->pending_io()->create_completion(ts, threadID)); m_ios.push_back(completionIO); @@ -929,9 +886,7 @@ private: imagectx_id_t imagectx = fields.uint64("imagectx"); require_image(ts, thread, imagectx, name, snap_name, readonly); action_id_t ionum = next_id(); - vector extents; - extents.push_back(extent(offset, length)); - IO::ptr io(new WriteIO(ionum, ts, threadID, thread->pending_io(), imagectx, extents)); + IO::ptr io(new WriteIO(ionum, ts, threadID, thread->pending_io(), imagectx, offset, length)); io->add_dependencies(m_recent_completions); thread->issued_io(io, m_threads); m_ios.push_back(io); @@ -945,19 +900,15 @@ private: bool readonly = fields.int64("read_only"); uint64_t completion = fields.uint64("completion"); imagectx_id_t imagectx = fields.uint64("imagectx"); + uint64_t offset = fields.uint64("offset"); + uint64_t length = fields.uint64("length"); require_image(ts, thread, imagectx, name, snap_name, readonly); action_id_t ionum = next_id(); - IO::ptr io(new AioReadIO(ionum, ts, threadID, thread->pending_io(), imagectx)); + IO::ptr io(new AioReadIO(ionum, ts, threadID, thread->pending_io(), imagectx, offset, length)); io->add_dependencies(m_recent_completions); m_ios.push_back(io); thread->issued_io(io, m_threads); m_pending_ios[completion] = io; - } else if (strcmp(event_name, "librbd:aio_read_extent") == 0) { - boost::shared_ptr io(boost::dynamic_pointer_cast(thread->pending_io())); - assert(io); - uint64_t offset = fields.uint64("offset"); - uint64_t length = fields.uint64("length"); - io->add_extent(extent(offset, length)); } else if (strcmp(event_name, "librbd:aio_write_enter") == 0) { string name(fields.string("name")); string snap_name(fields.string("snap_name")); @@ -968,9 +919,7 @@ private: imagectx_id_t imagectx = fields.uint64("imagectx"); require_image(ts, thread, imagectx, name, snap_name, readonly); action_id_t ionum = next_id(); - vector extents; - extents.push_back(extent(offset, length)); - IO::ptr io(new AioWriteIO(ionum, ts, threadID, thread->pending_io(), imagectx, extents)); + IO::ptr io(new AioWriteIO(ionum, ts, threadID, thread->pending_io(), imagectx, offset, length)); io->add_dependencies(m_recent_completions); thread->issued_io(io, m_threads); m_ios.push_back(io); diff --git a/src/tracing/librbd.tp b/src/tracing/librbd.tp index 91a1bfb045c32..7124637464d9b 100644 --- a/src/tracing/librbd.tp +++ b/src/tracing/librbd.tp @@ -6,20 +6,14 @@ TRACEPOINT_EVENT(librbd, read_enter, void*, imagectx, const char*, name, const char*, snap_name, - char, read_only), + char, read_only, + uint64_t, offset, + uint64_t, length), TP_FIELDS( ctf_integer_hex(void*, imagectx, imagectx) ctf_string(name, name) ctf_string(snap_name, snap_name) ctf_integer(char, read_only, read_only) - ) -) - -TRACEPOINT_EVENT(librbd, read_extent, - TP_ARGS( - uint64_t, offset, - uint64_t, length), - TP_FIELDS( ctf_integer(uint64_t, offset, offset) ctf_integer(uint64_t, length, length) ) @@ -243,6 +237,8 @@ TRACEPOINT_EVENT(librbd, aio_read_enter, const char*, name, const char*, snap_name, char, read_only, + uint64_t, offset, + uint64_t, length, const char*, buf, const void*, completion), TP_FIELDS( @@ -250,17 +246,9 @@ TRACEPOINT_EVENT(librbd, aio_read_enter, ctf_string(name, name) ctf_string(snap_name, snap_name) ctf_integer(char, read_only, read_only) - ctf_integer_hex(const void*, completion, completion) - ) -) - -TRACEPOINT_EVENT(librbd, aio_read_extent, - TP_ARGS( - uint64_t, offset, - uint64_t, length), - TP_FIELDS( ctf_integer(uint64_t, offset, offset) ctf_integer(uint64_t, length, length) + ctf_integer_hex(const void*, completion, completion) ) ) -- 2.39.5