#include "include/util.h"
#include "librados/snap_set_diff.h"
+#include "tracing/librbd.h"
#define dout_subsys ceph_subsys_rbd
#undef dout_prefix
int create_v1(IoCtx& io_ctx, const char *imgname, uint64_t bid,
uint64_t size, int order)
{
+ tracepoint(librbd, create_v1_enter, io_ctx.get_pool_name().c_str(), io_ctx.get_id(), imgname, bid, size, order);
CephContext *cct = (CephContext *)io_ctx.cct();
ldout(cct, 2) << "adding rbd image to directory..." << dendl;
int r = tmap_set(io_ctx, imgname);
if (r < 0) {
lderr(cct) << "error adding image to directory: " << cpp_strerror(r)
<< dendl;
+ tracepoint(librbd, create_v1_exit, r);
return r;
}
<< "header creation failed: "
<< cpp_strerror(r) << dendl;
}
+ tracepoint(librbd, create_v1_exit, r);
return r;
}
ldout(cct, 2) << "done." << dendl;
+ tracepoint(librbd, create_v1_exit, 0);
return 0;
}
int order, uint64_t features, uint64_t stripe_unit,
uint64_t stripe_count)
{
+ tracepoint(librbd, create_v2_enter, io_ctx.get_pool_name().c_str(), io_ctx.get_id(), imgname, bid, size, order, features, stripe_unit, stripe_count);
ostringstream bid_ss;
uint32_t extra;
string id, id_obj, header_oid;
if (r < 0) {
lderr(cct) << "error creating rbd id object: " << cpp_strerror(r)
<< dendl;
+ tracepoint(librbd, create_v2_exit, r);
return r;
}
}
ldout(cct, 2) << "done." << dendl;
+ tracepoint(librbd, create_v2_exit, 0);
return 0;
err_remove_header:
<< cpp_strerror(remove_r) << dendl;
}
+ tracepoint(librbd, create_v2_exit, r);
return r;
}
int remove(IoCtx& io_ctx, const char *imgname, ProgressContext& prog_ctx)
{
+ tracepoint(librbd, remove_enter, io_ctx.get_pool_name().c_str(), io_ctx.get_id(), imgname);
CephContext *cct((CephContext *)io_ctx.cct());
ldout(cct, 20) << "remove " << &io_ctx << " " << imgname << dendl;
if (ictx->snaps.size()) {
lderr(cct) << "image has snapshots - not removing" << dendl;
close_image(ictx);
+ tracepoint(librbd, remove_exit, -ENOTEMPTY);
return -ENOTEMPTY;
}
if (r < 0) {
lderr(cct) << "error listing watchers" << dendl;
close_image(ictx);
+ tracepoint(librbd, remove_exit, r);
return r;
}
if (watchers.size() > 1) {
lderr(cct) << "image has watchers - not removing" << dendl;
close_image(ictx);
+ tracepoint(librbd, remove_exit, -EBUSY);
return -EBUSY;
}
assert(watchers.size() == 1);
if (r < 0 && r != -ENOENT) {
lderr(cct) << "error removing child from children list" << dendl;
close_image(ictx);
+ tracepoint(librbd, remove_exit, r);
return r;
}
close_image(ictx);
r = io_ctx.remove(header_oid);
if (r < 0 && r != -ENOENT) {
lderr(cct) << "error removing header: " << cpp_strerror(-r) << dendl;
+ tracepoint(librbd, remove_exit, r);
return r;
}
}
if (r < 0 && !unknown_format) {
lderr(cct) << "error removing img from old-style directory: "
<< cpp_strerror(-r) << dendl;
+ tracepoint(librbd, remove_exit, r);
return r;
}
}
r = io_ctx.remove(id_obj_name(imgname));
if (r < 0 && r != -ENOENT) {
lderr(cct) << "error removing id object: " << cpp_strerror(r) << dendl;
+ tracepoint(librbd, remove_exit, r);
return r;
}
r = cls_client::dir_get_id(&io_ctx, RBD_DIRECTORY, imgname, &id);
if (r < 0 && r != -ENOENT) {
lderr(cct) << "error getting id of image" << dendl;
+ tracepoint(librbd, remove_exit, r);
return r;
}
if (r < 0) {
lderr(cct) << "error removing img from new-style directory: "
<< cpp_strerror(-r) << dendl;
+ tracepoint(librbd, remove_exit, r);
return r;
}
}
ldout(cct, 2) << "done." << dendl;
+ tracepoint(librbd, remove_exit, 0);
return 0;
}
int open_image(ImageCtx *ictx)
{
+ tracepoint(librbd, open_image_enter, ictx->name.c_str(), ictx->id.c_str());
ldout(ictx->cct, 20) << "open_image: ictx = " << ictx
<< " name = '" << ictx->name
<< "' id = '" << ictx->id
if ((r = _snap_set(ictx, ictx->snap_name.c_str())) < 0)
goto err_close;
+ tracepoint(librbd, open_image_exit, 0);
return 0;
err_close:
close_image(ictx);
+ tracepoint(librbd, open_image_exit, r);
return r;
}
void close_image(ImageCtx *ictx)
{
+ tracepoint(librbd, close_image_enter, ictx->name.c_str(), ictx->id.c_str());
ldout(ictx->cct, 20) << "close_image " << ictx << dendl;
if (ictx->object_cacher)
ictx->shutdown_cache(); // implicitly flushes
ictx->unregister_watch();
delete ictx;
+ tracepoint(librbd, close_image_exit);
}
// 'flatten' child image by copying all parent's blocks
ssize_t read(ImageCtx *ictx, const vector<pair<uint64_t,uint64_t> >& image_extents, char *buf, bufferlist *pbl)
{
+ tracepoint(librbd, read_enter, ictx->name.c_str(), ictx->id.c_str());
+ for (vector<pair<uint64_t,uint64_t> >::const_iterator r = image_extents.begin();
+ r != image_extents.end();
+ ++r) {
+ tracepoint(librbd, read_extent, r->first, r->second);
+ }
Mutex mylock("IoCtxImpl::write::mylock");
Cond cond;
bool done;
if (r < 0) {
c->release();
delete ctx;
+ tracepoint(librbd, read_exit, r);
return r;
}
cond.Wait(mylock);
mylock.Unlock();
+ tracepoint(librbd, read_exit, ret);
return ret;
}
ssize_t write(ImageCtx *ictx, uint64_t off, size_t len, const char *buf)
{
+ tracepoint(librbd, write_enter, ictx->name.c_str(), ictx->id.c_str(), off, len, buf);
utime_t start_time, elapsed;
ldout(ictx->cct, 20) << "write " << ictx << " off = " << off << " len = "
<< len << dendl;
uint64_t mylen = len;
int r = clip_io(ictx, off, &mylen);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, write_exit, r);
return r;
+ }
Context *ctx = new C_SafeCond(&mylock, &cond, &done, &ret);
AioCompletion *c = aio_create_completion_internal(ctx, rbd_ctx_cb);
if (r < 0) {
c->release();
delete ctx;
+ tracepoint(librbd, write_exit, r);
return r;
}
cond.Wait(mylock);
mylock.Unlock();
- if (ret < 0)
+ if (ret < 0) {
+ tracepoint(librbd, write_exit, ret);
return ret;
+ }
elapsed = ceph_clock_now(ictx->cct) - start_time;
ictx->perfcounter->tinc(l_librbd_wr_latency, elapsed);
ictx->perfcounter->inc(l_librbd_wr);
ictx->perfcounter->inc(l_librbd_wr_bytes, mylen);
+ tracepoint(librbd, write_exit, mylen);
return mylen;
}
--- /dev/null
+#include "tracing/tracing-common.h"
+#include "include/rbd/librbd.h"
+
+TRACEPOINT_EVENT(librbd, read_enter,
+ TP_ARGS(
+ const char*, name,
+ const char*, id),
+ TP_FIELDS(
+ ctf_string(name, name)
+ ctf_string(id, id)
+ )
+)
+
+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)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, read_exit,
+ TP_ARGS(
+ ssize_t, retval),
+ TP_FIELDS(
+ ctf_integer(ssize_t, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, write_enter,
+ TP_ARGS(
+ const char*, name,
+ const char*, id,
+ uint64_t, off,
+ size_t, len,
+ const char*, buf),
+ TP_FIELDS(
+ ctf_string(name, name)
+ ctf_string(id, id)
+ ctf_integer(uint64_t, off, off)
+ ceph_ctf_sequence(unsigned char, buf, buf, size_t, len)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, write_exit,
+ TP_ARGS(
+ ssize_t, retval),
+ TP_FIELDS(
+ ctf_integer(ssize_t, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, open_image_enter,
+ TP_ARGS(
+ const char*, name,
+ const char*, id),
+ TP_FIELDS(
+ ctf_string(name, name)
+ ctf_string(id, id)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, open_image_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, close_image_enter,
+ TP_ARGS(
+ const char*, name,
+ const char*, id),
+ TP_FIELDS(
+ ctf_string(name, name)
+ ctf_string(id, id)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, close_image_exit,
+ TP_ARGS(),
+ TP_FIELDS()
+)
+
+TRACEPOINT_EVENT(librbd, create_v1_enter,
+ TP_ARGS(
+ const char*, pool_name,
+ int64_t, id,
+ const char*, imgname,
+ uint64_t, bid,
+ uint64_t, size,
+ int, order),
+ TP_FIELDS(
+ ctf_string(pool_name, pool_name)
+ ctf_integer(int64_t, id, id)
+ ctf_string(imgname, imgname)
+ ctf_integer(uint64_t, bid, bid)
+ ctf_integer(uint64_t, size, size)
+ ctf_integer(int, order, order)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, create_v1_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, create_v2_enter,
+ TP_ARGS(
+ const char*, pool_name,
+ int64_t, id,
+ const char*, imgname,
+ uint64_t, bid,
+ uint64_t, size,
+ int, order,
+ uint64_t, features,
+ uint64_t, stripe_unit,
+ uint64_t, stripe_count),
+ TP_FIELDS(
+ ctf_string(pool_name, pool_name)
+ ctf_integer(int64_t, id, id)
+ ctf_string(imgname, imgname)
+ ctf_integer(uint64_t, bid, bid)
+ ctf_integer(uint64_t, size, size)
+ ctf_integer(int, order, order)
+ ctf_integer(uint64_t, features, features)
+ ctf_integer(uint64_t, stripe_unit, stripe_unit)
+ ctf_integer(uint64_t, stripe_count, stripe_count)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, create_v2_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, remove_enter,
+ TP_ARGS(
+ const char*, pool_name,
+ int64_t, id,
+ const char*, imgname),
+ TP_FIELDS(
+ ctf_string(pool_name, pool_name)
+ ctf_integer(int64_t, id, id)
+ ctf_string(imgname, imgname)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, remove_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)