From: Jason Dillaman Date: Wed, 8 Jul 2020 18:28:55 +0000 (-0400) Subject: neorados: support blkin trace passing on execute calls X-Git-Tag: wip-pdonnell-testing-20200918.022351~622^2~20 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=71fc3a3eed3105fbddc7971f0b4735ad040ad792;p=ceph-ci.git neorados: support blkin trace passing on execute calls librbd passes blkin traces from the user API down through to Objecter and back. Add these missing hooks to the neorados API since they weren't included in the intial revision. Signed-off-by: Jason Dillaman --- diff --git a/src/include/neorados/RADOS.hpp b/src/include/neorados/RADOS.hpp index 5b0b011d361..98bed7625ad 100644 --- a/src/include/neorados/RADOS.hpp +++ b/src/include/neorados/RADOS.hpp @@ -551,23 +551,25 @@ public: template auto execute(const Object& o, const IOContext& ioc, ReadOp&& op, ceph::buffer::list* bl, - CompletionToken&& token, uint64_t* objver = nullptr) { + CompletionToken&& token, uint64_t* objver = nullptr, + const blkin_trace_info* trace_info = nullptr) { boost::asio::async_completion init(token); execute(o, ioc, std::move(op), bl, ReadOp::Completion::create(get_executor(), std::move(init.completion_handler)), - objver); + objver, trace_info); return init.result.get(); } template auto execute(const Object& o, const IOContext& ioc, WriteOp&& op, - CompletionToken&& token, uint64_t* objver = nullptr) { + CompletionToken&& token, uint64_t* objver = nullptr, + const blkin_trace_info* trace_info = nullptr) { boost::asio::async_completion init(token); execute(o, ioc, std::move(op), Op::Completion::create(get_executor(), std::move(init.completion_handler)), - objver); + objver, trace_info); return init.result.get(); } @@ -954,10 +956,11 @@ private: void execute(const Object& o, const IOContext& ioc, ReadOp&& op, ceph::buffer::list* bl, std::unique_ptr c, - uint64_t* objver); + uint64_t* objver, const blkin_trace_info* trace_info); void execute(const Object& o, const IOContext& ioc, WriteOp&& op, - std::unique_ptr c, uint64_t* objver); + std::unique_ptr c, uint64_t* objver, + const blkin_trace_info* trace_info); void execute(const Object& o, std::int64_t pool, ReadOp&& op, ceph::buffer::list* bl, std::unique_ptr c, diff --git a/src/include/rados/librados_fwd.hpp b/src/include/rados/librados_fwd.hpp index 8926d097095..396f3a83875 100644 --- a/src/include/rados/librados_fwd.hpp +++ b/src/include/rados/librados_fwd.hpp @@ -1,6 +1,8 @@ #ifndef __LIBRADOS_FWD_HPP #define __LIBRADOS_FWD_HPP +struct blkin_trace_info; + namespace libradosstriper { class RadosStriper; diff --git a/src/neorados/RADOS.cc b/src/neorados/RADOS.cc index 8a49f05a9c4..b5f93c5a8e2 100644 --- a/src/neorados/RADOS.cc +++ b/src/neorados/RADOS.cc @@ -27,6 +27,7 @@ #include "common/ceph_argparse.h" #include "common/common_init.h" #include "common/hobject.h" +#include "common/EventTrace.h" #include "global/global_init.h" @@ -783,19 +784,30 @@ boost::asio::io_context& RADOS::get_io_context() { void RADOS::execute(const Object& o, const IOContext& _ioc, ReadOp&& _op, cb::list* bl, - std::unique_ptr c, version_t* objver) { + std::unique_ptr c, version_t* objver, + const blkin_trace_info *trace_info) { auto oid = reinterpret_cast(&o.impl); auto ioc = reinterpret_cast(&_ioc.impl); auto op = reinterpret_cast(&_op.impl); auto flags = 0; // Should be in Op. + ZTracer::Trace trace; + if (trace_info) { + ZTracer::Trace parent_trace("", nullptr, trace_info); + trace.init("rados execute", &impl->objecter->trace_endpoint, &parent_trace); + } + + trace.event("init"); impl->objecter->read( *oid, ioc->oloc, std::move(op->op), ioc->snap_seq, bl, flags, - std::move(c), objver); + std::move(c), objver, nullptr /* data_offset */, 0 /* features */, &trace); + + trace.event("submitted"); } void RADOS::execute(const Object& o, const IOContext& _ioc, WriteOp&& _op, - std::unique_ptr c, version_t* objver) { + std::unique_ptr c, version_t* objver, + const blkin_trace_info *trace_info) { auto oid = reinterpret_cast(&o.impl); auto ioc = reinterpret_cast(&_ioc.impl); auto op = reinterpret_cast(&_op.impl); @@ -806,10 +818,18 @@ void RADOS::execute(const Object& o, const IOContext& _ioc, WriteOp&& _op, else mtime = ceph::real_clock::now(); + ZTracer::Trace trace; + if (trace_info) { + ZTracer::Trace parent_trace("", nullptr, trace_info); + trace.init("rados execute", &impl->objecter->trace_endpoint, &parent_trace); + } + + trace.event("init"); impl->objecter->mutate( *oid, ioc->oloc, std::move(op->op), ioc->snapc, mtime, flags, - std::move(c), objver); + std::move(c), objver, osd_reqid_t{}, &trace); + trace.event("submitted"); } void RADOS::execute(const Object& o, std::int64_t pool, ReadOp&& _op, diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 18f17d53ac6..7341a719e79 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -2931,10 +2931,11 @@ public: ObjectOperation&& op, const SnapContext& snapc, ceph::real_time mtime, int flags, std::unique_ptr&& oncommit, - version_t *objver = NULL, osd_reqid_t reqid = osd_reqid_t()) { + version_t *objver = NULL, osd_reqid_t reqid = osd_reqid_t(), + ZTracer::Trace *parent_trace = nullptr) { Op *o = new Op(oid, oloc, std::move(op.ops), flags | global_op_flags | CEPH_OSD_FLAG_WRITE, std::move(oncommit), objver, - nullptr); + nullptr, parent_trace); o->priority = op.priority; o->mtime = mtime; o->snapc = snapc; @@ -2990,10 +2991,10 @@ public: ObjectOperation&& op, snapid_t snapid, ceph::buffer::list *pbl, int flags, std::unique_ptr&& onack, version_t *objver = nullptr, int *data_offset = nullptr, - uint64_t features = 0) { + uint64_t features = 0, ZTracer::Trace *parent_trace = nullptr) { Op *o = new Op(oid, oloc, std::move(op.ops), flags | global_op_flags | CEPH_OSD_FLAG_READ, std::move(onack), objver, - data_offset); + data_offset, parent_trace); o->priority = op.priority; o->snapid = snapid; o->outbl = pbl;