$<TARGET_OBJECTS:librados_api_obj>
$<TARGET_OBJECTS:librados_objs>)
endif()
+if(WITH_LTTNG AND WITH_EVENTTRACE)
+ add_dependencies(librados_api_obj eventtrace_tp)
+endif()
#include "librados/RadosClient.h"
#include "include/assert.h"
#include "common/valgrind.h"
+#include "common/EventTrace.h"
#define dout_subsys ceph_subsys_rados
#undef dout_prefix
int flags,
bufferlist *pbl)
{
+ FUNCTRACE();
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->is_read = true;
c->io = this;
::ObjectOperation *o, AioCompletionImpl *c,
const SnapContext& snap_context, int flags)
{
+ FUNCTRACE();
+ OID_EVENT_TRACE(oid.name.c_str(), "RADOS_WRITE_OP_BEGIN");
auto ut = ceph::real_clock::now();
/* can't write to a snapshot */
if (snap_seq != CEPH_NOSNAP)
return -EROFS;
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->io = this;
queue_aio_write(c);
bufferlist *pbl, size_t len, uint64_t off,
uint64_t snapid)
{
+ FUNCTRACE();
if (len > (size_t) INT_MAX)
return -EDOM;
+ OID_EVENT_TRACE(oid.name.c_str(), "RADOS_READ_OP_BEGIN");
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->is_read = true;
c->io = this;
c->blp = pbl;
char *buf, size_t len, uint64_t off,
uint64_t snapid)
{
+ FUNCTRACE();
if (len > (size_t) INT_MAX)
return -EDOM;
+ OID_EVENT_TRACE(oid.name.c_str(), "RADOS_READ_OP_BEGIN");
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->is_read = true;
c->io = this;
c->bl.clear();
bufferlist *data_bl, size_t len,
uint64_t off, uint64_t snapid)
{
+ FUNCTRACE();
if (len > (size_t) INT_MAX)
return -EDOM;
Context *nested = new C_aio_Complete(c);
C_ObjectOperation *onack = new C_ObjectOperation(nested);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) nested)->oid = oid;
+#endif
c->is_read = true;
c->io = this;
const bufferlist& bl, size_t len,
uint64_t off)
{
+ FUNCTRACE();
auto ut = ceph::real_clock::now();
ldout(client->cct, 20) << "aio_write " << oid << " " << off << "~" << len << " snapc=" << snapc << " snap_seq=" << snap_seq << dendl;
+ OID_EVENT_TRACE(oid.name.c_str(), "RADOS_WRITE_OP_BEGIN");
if (len > UINT_MAX/2)
return -E2BIG;
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->io = this;
queue_aio_write(c);
int librados::IoCtxImpl::aio_append(const object_t &oid, AioCompletionImpl *c,
const bufferlist& bl, size_t len)
{
+ FUNCTRACE();
auto ut = ceph::real_clock::now();
if (len > UINT_MAX/2)
return -EROFS;
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->io = this;
queue_aio_write(c);
AioCompletionImpl *c,
const bufferlist& bl)
{
+ FUNCTRACE();
auto ut = ceph::real_clock::now();
if (bl.length() > UINT_MAX/2)
return -EROFS;
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->io = this;
queue_aio_write(c);
size_t write_len,
uint64_t off)
{
+ FUNCTRACE();
auto ut = ceph::real_clock::now();
if ((bl.length() > UINT_MAX/2) || (write_len > UINT_MAX/2))
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->io = this;
queue_aio_write(c);
int librados::IoCtxImpl::aio_remove(const object_t &oid, AioCompletionImpl *c, int flags)
{
+ FUNCTRACE();
auto ut = ceph::real_clock::now();
/* can't write to a snapshot */
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->io = this;
queue_aio_write(c);
const char *cls, const char *method,
bufferlist& inbl, bufferlist *outbl)
{
+ FUNCTRACE();
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->is_read = true;
c->io = this;
const char *cls, const char *method,
bufferlist& inbl, char *buf, size_t out_len)
{
+ FUNCTRACE();
Context *onack = new C_aio_Complete(c);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ ((C_aio_Complete *) onack)->oid = oid;
+#endif
c->is_read = true;
c->io = this;
c->bl.clear();
{
if (len > (size_t) INT_MAX)
return -EDOM;
+ OID_EVENT_TRACE(oid.name.c_str(), "RADOS_READ_OP_BEGIN");
::ObjectOperation rd;
prepare_assert_ops(&rd);
c->io->complete_aio_write(c);
}
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ OID_EVENT_TRACE(oid.name.c_str(), "RADOS_OP_COMPLETE");
+#endif
c->put_unlock();
}
};
struct C_aio_Complete : public Context {
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ object_t oid;
+#endif
AioCompletionImpl *c;
explicit C_aio_Complete(AioCompletionImpl *_c);
void finish(int r);
#include "RadosClient.h"
#include "include/assert.h"
+#include "common/EventTrace.h"
#define dout_subsys ceph_subsys_rados
#undef dout_prefix
#include "AsyncMessenger.h"
#include "AsyncConnection.h"
+#include "messages/MOSDOp.h"
+#include "messages/MOSDOpReply.h"
+#include "common/EventTrace.h"
+
// Constant to limit starting sequence number to 2^31. Nothing special about it, just a big number. PLR
#define SEQ_MASK 0x7fffffff
{
ssize_t r = 0;
int prev_state = state;
+#ifdef WITH_LTTNG
+ utime_t ltt_recv_stamp = ceph_clock_now();
+#endif
bool need_dispatch_writer = false;
std::lock_guard<std::mutex> l(lock);
last_active = ceph::coarse_mono_clock::now();
case STATE_OPEN_MESSAGE_HEADER:
{
+#ifdef WITH_LTTNG
+ ltt_recv_stamp = ceph_clock_now();
+#endif
ldout(async_msgr->cct, 20) << __func__ << " begin MSG" << dendl;
ceph_msg_header header;
ceph_msg_header_old oldheader;
message->set_connection(this);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ if (message->get_type() == CEPH_MSG_OSD_OP || message->get_type() == CEPH_MSG_OSD_OPREPLY) {
+ utime_t ltt_processed_stamp = ceph_clock_now();
+ double usecs_elapsed = (ltt_processed_stamp.to_nsec()-ltt_recv_stamp.to_nsec())/1000;
+ ostringstream buf;
+ if (message->get_type() == CEPH_MSG_OSD_OP)
+ OID_ELAPSED_WITH_MSG(message, usecs_elapsed, "TIME_TO_DECODE_OSD_OP", false);
+ else
+ OID_ELAPSED_WITH_MSG(message, usecs_elapsed, "TIME_TO_DECODE_OSD_OPREPLY", false);
+ }
+#endif
+
// note last received message.
in_seq.set(message->get_seq());
ldout(async_msgr->cct, 5) << " rx " << message->get_source() << " seq "
int AsyncConnection::send_message(Message *m)
{
+ FUNCTRACE();
lgeneric_subdout(async_msgr->cct, ms,
1) << "-- " << async_msgr->get_myaddr() << " --> "
<< get_peer_addr() << " -- "
m->get_header().src = async_msgr->get_myname();
m->set_connection(this);
+ if (m->get_type() == CEPH_MSG_OSD_OP)
+ OID_EVENT_TRACE_WITH_MSG(m, "SEND_MSG_OSD_OP_BEGIN", true);
+ else if (m->get_type() == CEPH_MSG_OSD_OPREPLY)
+ OID_EVENT_TRACE_WITH_MSG(m, "SEND_MSG_OSD_OPREPLY_BEGIN", true);
+
if (async_msgr->get_myaddr() == get_peer_addr()) { //loopback connection
ldout(async_msgr->cct, 20) << __func__ << " " << *m << " local" << dendl;
std::lock_guard<std::mutex> l(write_lock);
ssize_t AsyncConnection::write_message(Message *m, bufferlist& bl, bool more)
{
+ FUNCTRACE();
assert(can_write == WriteStatus::CANWRITE);
m->set_seq(out_seq.inc());
} else {
ldout(async_msgr->cct, 10) << __func__ << " sending " << m << " continuely." << dendl;
}
+ if (m->get_type() == CEPH_MSG_OSD_OP)
+ OID_EVENT_TRACE_WITH_MSG(m, "SEND_MSG_OSD_OP_END", false);
+ else if (m->get_type() == CEPH_MSG_OSD_OPREPLY)
+ OID_EVENT_TRACE_WITH_MSG(m, "SEND_MSG_OSD_OPREPLY_END", false);
m->put();
return rc;
#include "common/Timer.h"
#include "common/errno.h"
+#include "messages/MOSDOp.h"
+#include "messages/MOSDOpReply.h"
+#include "common/EventTrace.h"
+
#define dout_subsys ceph_subsys_ms
#undef dout_prefix
#define dout_prefix _prefix(_dout, this)
int AsyncMessenger::_send_message(Message *m, const entity_inst_t& dest)
{
+ FUNCTRACE();
+ if (m && m->get_type() == CEPH_MSG_OSD_OP)
+ OID_EVENT_TRACE(((MOSDOp *)m)->get_oid().name.c_str(), "SEND_MSG_OSD_OP");
+ else if (m && m->get_type() == CEPH_MSG_OSD_OPREPLY)
+ OID_EVENT_TRACE(((MOSDOpReply *)m)->get_oid().name.c_str(), "SEND_MSG_OSD_OP_REPLY");
+
ldout(cct, 1) << __func__ << "--> " << dest.name << " "
<< dest.addr << " -- " << *m << " -- ?+"
<< m->get_data().length() << " " << m << dendl;
list(APPEND SPDK_LIBRARIES spdk_${lib})
endforeach()
endif(WITH_SPDK)
+
+if(WITH_LTTNG AND WITH_EVENTTRACE)
+ add_dependencies(os eventtrace_tp)
+endif()
#endif
#include "common/debug.h"
+#include "common/EventTrace.h"
#define dout_context cct
#define dout_subsys ceph_subsys_bdev
#include "BlueFS.h"
#include "BlueRocksEnv.h"
#include "auth/Crypto.h"
+#include "common/EventTrace.h"
#define dout_context cct
#define dout_subsys ceph_subsys_bluestore
bufferlist& bl,
uint32_t op_flags)
{
+ FUNCTRACE();
boost::intrusive::set<Extent>::iterator ep, eend;
int r = 0;
TrackedOpRef op,
ThreadPool::TPHandle *handle)
{
+ FUNCTRACE();
Context *onreadable;
Context *ondisk;
Context *onreadable_sync;
#include "bluestore_types.h"
#include "BlockDevice.h"
+#include "common/EventTrace.h"
+
class Allocator;
class FreelistManager;
class BlueFS;
return "???";
}
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ const char *get_state_latency_name(int state) {
+ switch (state) {
+ case l_bluestore_state_prepare_lat: return "prepare";
+ case l_bluestore_state_aio_wait_lat: return "aio_wait";
+ case l_bluestore_state_io_done_lat: return "io_done";
+ case l_bluestore_state_kv_queued_lat: return "kv_queued";
+ case l_bluestore_state_kv_committing_lat: return "kv_committing";
+ case l_bluestore_state_kv_done_lat: return "kv_done";
+ case l_bluestore_state_wal_queued_lat: return "wal_queued";
+ case l_bluestore_state_wal_applying_lat: return "wal_applying";
+ case l_bluestore_state_wal_aio_wait_lat: return "wal_aio_wait";
+ case l_bluestore_state_wal_cleanup_lat: return "wal_cleanup";
+ case l_bluestore_state_finishing_lat: return "finishing";
+ case l_bluestore_state_done_lat: return "done";
+ }
+ return "???";
+ }
+#endif
+
void log_state_latency(PerfCounters *logger, int state) {
utime_t lat, now = ceph_clock_now();
lat = now - last_stamp;
logger->tinc(state, lat);
+#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+ if (state >= l_bluestore_state_prepare_lat && state <= l_bluestore_state_done_lat) {
+ double usecs = (now.to_nsec()-last_stamp.to_nsec())/1000;
+ OID_ELAPSED("", usecs, get_state_latency_name(state));
+ }
+#endif
last_stamp = now;
}
if(WITH_LTTNG)
add_dependencies(osd oprequest-tp osd-tp pg-tp)
endif()
+if(WITH_LTTNG AND WITH_EVENTTRACE)
+ add_dependencies(osd eventtrace_tp)
+endif()
#include "include/assert.h"
#include "common/config.h"
+#include "common/EventTrace.h"
#ifdef WITH_LTTNG
#define TRACEPOINT_DEFINE
void OSDService::dequeue_pg(PG *pg, list<OpRequestRef> *dequeued)
{
+ FUNCTRACE();
if (dequeued)
osd->op_shardedwq.dequeue_and_get_ops(pg, dequeued);
else
pair<PGRef, DeletingStateRef> item,
ThreadPool::TPHandle &handle)
{
+ FUNCTRACE();
PGRef pg(item.first);
SnapMapper &mapper = pg->snap_mapper;
OSDriver &driver = pg->osdriver;
void OSD::ms_fast_dispatch(Message *m)
{
+ FUNCTRACE();
if (service.is_stopping()) {
m->put();
return;
session->put();
}
service.release_map(nextmap);
+ OID_EVENT_TRACE_WITH_MSG(m, "MS_FAST_DISPATCH_END", false);
}
void OSD::ms_fast_preprocess(Message *m)
PGRef pg, OpRequestRef op,
ThreadPool::TPHandle &handle)
{
+ FUNCTRACE();
+ OID_EVENT_TRACE_WITH_MSG(op->get_req(), "DEQUEUE_OP_BEGIN", false);
+
utime_t now = ceph_clock_now();
op->set_dequeued_time(now);
utime_t latency = now - op->get_req()->get_recv_stamp();
// finish
dout(10) << "dequeue_op " << op << " finish" << dendl;
+ OID_EVENT_TRACE_WITH_MSG(op->get_req(), "DEQUEUE_OP_END", true);
}
#include "common/PrioritizedQueue.h"
#include "messages/MOSDOp.h"
#include "include/Spinlock.h"
+#include "common/EventTrace.h"
#define CEPH_OSD_PROTOCOL 10 /* cluster internal */
};
void dequeue(PG *pg) {
+ FUNCTRACE();
return dequeue_and_get_ops(pg, nullptr);
}
#include "messages/MOSDSubOpReply.h"
#include "messages/MOSDRepOpReply.h"
#include "common/BackTrace.h"
+#include "common/EventTrace.h"
#ifdef WITH_LTTNG
#define TRACEPOINT_DEFINE
#include "messages/MOSDPGUpdateLogMissingReply.h"
#include "messages/MCommandReply.h"
#include "mds/inode_backtrace.h" // Ugh
+#include "common/EventTrace.h"
#include "common/config.h"
#include "include/compat.h"
*/
void PrimaryLogPG::do_op(OpRequestRef& op)
{
+ FUNCTRACE();
MOSDOp *m = static_cast<MOSDOp*>(op->get_req());
assert(m->get_type() == CEPH_MSG_OSD_OP);
void PrimaryLogPG::execute_ctx(OpContext *ctx)
{
+ FUNCTRACE();
dout(10) << __func__ << " " << ctx << dendl;
ctx->reset_obs(ctx->obc);
ctx->update_log_only = false; // reset in case finish_copyfrom() is re-running execute_ctx
void PrimaryLogPG::issue_repop(RepGather *repop, OpContext *ctx)
{
+ FUNCTRACE();
const hobject_t& soid = ctx->obs->oi.soid;
dout(7) << "issue_repop rep_tid " << repop->rep_tid
<< " o " << soid
bool map_snapid_to_clone,
hobject_t *pmissing)
{
+ FUNCTRACE();
assert(oid.pool == static_cast<int64_t>(info.pgid.pool()));
// want the head?
if (oid.snap == CEPH_NOSNAP) {
#include "messages/MOSDPGPush.h"
#include "messages/MOSDPGPull.h"
#include "messages/MOSDPGPushReply.h"
+#include "common/EventTrace.h"
#define dout_context cct
#define dout_subsys ceph_subsys_osd
void ReplicatedBackend::op_applied(
InProgressOp *op)
{
+ FUNCTRACE();
+ OID_EVENT_TRACE_WITH_MSG((op && op->op) ? op->op->get_req() : NULL, "OP_APPLIED_BEGIN", true);
dout(10) << __func__ << ": " << op->tid << dendl;
if (op->op)
op->op->mark_event("op_applied");
void ReplicatedBackend::op_commit(
InProgressOp *op)
{
+ FUNCTRACE();
+ OID_EVENT_TRACE_WITH_MSG((op && op->op) ? op->op->get_req() : NULL, "OP_COMMIT_BEGIN", true);
dout(10) << __func__ << ": " << op->tid << dendl;
if (op->op)
op->op->mark_event("op_commit");
Striper.cc)
add_library(osdc_rbd_objs OBJECT ${osdc_rbd_files})
add_library(osdc STATIC ${osdc_files} $<TARGET_OBJECTS:osdc_rbd_objs>)
+if(WITH_LTTNG AND WITH_EVENTTRACE)
+ add_dependencies(osdc eventtrace_tp)
+endif()
#include "common/scrub_types.h"
#include "include/str_list.h"
#include "common/errno.h"
+#include "common/EventTrace.h"
using ceph::real_time;
using ceph::real_clock;
*/
void Objecter::handle_pool_op_reply(MPoolOpReply *m)
{
+ FUNCTRACE();
shunique_lock sul(rwlock, acquire_shared);
if (!initialized.read()) {
sul.unlock();