int rename(IoCtx& io_ctx, const char *srcname, const char *dstname)
{
+ tracepoint(librbd, rename_enter, io_ctx.get_pool_name().c_str(), io_ctx.get_id(), srcname, dstname);
CephContext *cct = (CephContext *)io_ctx.cct();
ldout(cct, 20) << "rename " << &io_ctx << " " << srcname << " -> "
<< dstname << dendl;
r = cls_client::get_id(&io_ctx, src_oid, &id);
if (r < 0) {
lderr(cct) << "error reading image id: " << cpp_strerror(r) << dendl;
+ tracepoint(librbd, rename_exit, r);
return r;
}
}
if (r < 0) {
lderr(cct) << "error reading source object: " << src_oid << ": "
<< cpp_strerror(r) << dendl;
+ tracepoint(librbd, rename_exit, r);
return r;
}
if (r < 0) {
lderr(cct) << "error reading source object omap values: "
<< cpp_strerror(r) << dendl;
+ tracepoint(librbd, rename_exit, r);
return r;
}
omap_values.insert(outbl.begin(), outbl.end());
if (r < 0 && r != -ENOENT) {
lderr(cct) << "error checking for existing image called "
<< dstname << ":" << cpp_strerror(r) << dendl;
+ tracepoint(librbd, rename_exit, r);
return r;
}
if (r == 0) {
lderr(cct) << "rbd image " << dstname << " already exists" << dendl;
+ tracepoint(librbd, rename_exit, -EEXIST);
return -EEXIST;
}
if (r < 0) {
lderr(cct) << "error writing destination object: " << dst_oid << ": "
<< cpp_strerror(r) << dendl;
+ tracepoint(librbd, rename_exit, r);
return r;
}
io_ctx.remove(dst_oid);
lderr(cct) << "couldn't add " << dstname << " to directory: "
<< cpp_strerror(r) << dendl;
+ tracepoint(librbd, rename_exit, r);
return r;
}
r = tmap_rm(io_ctx, srcname);
srcname, dstname, id);
if (r < 0) {
lderr(cct) << "error updating directory: " << cpp_strerror(r) << dendl;
+ tracepoint(librbd, rename_exit, r);
return r;
}
}
notify_change(io_ctx, old_header_name(srcname), NULL, NULL);
}
+ tracepoint(librbd, rename_exit, 0);
return 0;
}
int resize(ImageCtx *ictx, uint64_t size, ProgressContext& prog_ctx)
{
+ tracepoint(librbd, resize_enter, ictx, ictx->name.c_str(), ictx->id.c_str(), size);
CephContext *cct = ictx->cct;
ldout(cct, 20) << "resize " << ictx << " " << ictx->size << " -> "
<< size << dendl;
- if (ictx->read_only)
+ if (ictx->read_only) {
+ tracepoint(librbd, resize_exit, -EROFS);
return -EROFS;
+ }
int r = ictx_check(ictx);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, resize_exit, r);
return r;
+ }
RWLock::WLocker l(ictx->md_lock);
if (size < ictx->size && ictx->object_cacher) {
// need to invalidate since we're deleting objects, and
// ObjectCacher doesn't track non-existent objects
r = ictx->invalidate_cache();
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, resize_exit, r);
return r;
+ }
}
resize_helper(ictx, size, prog_ctx);
ldout(cct, 2) << "done." << dendl;
ictx->perfcounter->inc(l_librbd_resize);
+ tracepoint(librbd, resize_exit, 0);
return 0;
}
int copy(ImageCtx *src, ImageCtx *dest, ProgressContext &prog_ctx)
{
+ tracepoint(librbd, copy_enter, src, src->name.c_str(), src->id.c_str(), dest, dest->name.c_str(), dest->id.c_str());
src->md_lock.get_read();
src->snap_lock.get_read();
uint64_t src_size = src->get_image_size(src->snap_id);
if (dest_size < src_size) {
lderr(cct) << " src size " << src_size << " >= dest size "
<< dest_size << dendl;
+ tracepoint(librbd, copy_exit, -EINVAL);
return -EINVAL;
}
int r;
lderr(cct) << "could not read from source image from "
<< offset << " to " << offset + len << ": "
<< cpp_strerror(r) << dendl;
+ tracepoint(librbd, copy_exit, r);
return r;
}
prog_ctx.update_progress(offset, src_size);
r = throttle.wait_for_ret();
if (r >= 0)
prog_ctx.update_progress(src_size, src_size);
+ tracepoint(librbd, copy_exit, r);
return r;
}
int open_image(ImageCtx *ictx)
{
- tracepoint(librbd, open_image_enter, ictx->name.c_str(), ictx->id.c_str());
+ tracepoint(librbd, open_image_enter, ictx, ictx->name.c_str(), ictx->id.c_str(), ictx->snap_name.c_str(), ictx->read_only);
ldout(ictx->cct, 20) << "open_image: ictx = " << ictx
<< " name = '" << ictx->name
<< "' id = '" << ictx->id
void close_image(ImageCtx *ictx)
{
- tracepoint(librbd, close_image_enter, ictx->name.c_str(), ictx->id.c_str());
+ tracepoint(librbd, close_image_enter, ictx, 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
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());
+ tracepoint(librbd, read_enter, ictx, 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) {
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);
+ tracepoint(librbd, write_enter, ictx, 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;
int discard(ImageCtx *ictx, uint64_t off, uint64_t len)
{
+ tracepoint(librbd, discard_enter, ictx, ictx->name.c_str(), ictx->id.c_str(), off, len);
utime_t start_time, elapsed;
ldout(ictx->cct, 20) << "discard " << ictx << " off = " << off << " len = "
<< len << dendl;
if (r < 0) {
c->release();
delete ctx;
+ tracepoint(librbd, discard_exit, r);
return r;
}
cond.Wait(mylock);
mylock.Unlock();
- if (ret < 0)
+ if (ret < 0) {
+ tracepoint(librbd, discard_exit, ret);
return ret;
+ }
elapsed = ceph_clock_now(ictx->cct) - start_time;
ictx->perfcounter->inc(l_librbd_discard_latency, elapsed);
ictx->perfcounter->inc(l_librbd_discard);
ictx->perfcounter->inc(l_librbd_discard_bytes, len);
+ tracepoint(librbd, discard_exit, len);
return len;
}
int aio_flush(ImageCtx *ictx, AioCompletion *c)
{
+ tracepoint(librbd, aio_flush_enter, ictx, ictx->name.c_str(), ictx->id.c_str(), c);
CephContext *cct = ictx->cct;
ldout(cct, 20) << "aio_flush " << ictx << " completion " << c << dendl;
int r = ictx_check(ictx);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, aio_flush_exit, r);
return r;
+ }
ictx->user_flushed();
c->put();
ictx->perfcounter->inc(l_librbd_aio_flush);
+ tracepoint(librbd, aio_flush_exit, 0);
return 0;
}
int flush(ImageCtx *ictx)
{
+ tracepoint(librbd, flush_enter, ictx, ictx->name.c_str(), ictx->id.c_str());
CephContext *cct = ictx->cct;
ldout(cct, 20) << "flush " << ictx << dendl;
int r = ictx_check(ictx);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, flush_exit, r);
return r;
+ }
ictx->user_flushed();
r = _flush(ictx);
ictx->perfcounter->inc(l_librbd_flush);
+ tracepoint(librbd, flush_exit, r);
return r;
}
int invalidate_cache(ImageCtx *ictx)
{
+ tracepoint(librbd, invalidate_cache_enter, ictx, ictx->name.c_str(), ictx->id.c_str());
CephContext *cct = ictx->cct;
ldout(cct, 20) << "invalidate_cache " << ictx << dendl;
int r = ictx_check(ictx);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, invalidate_cache_exit, r);
return r;
+ }
RWLock::WLocker l(ictx->md_lock);
- return ictx->invalidate_cache();
+ r = ictx->invalidate_cache();
+ tracepoint(librbd, invalidate_cache_exit, r);
+ return r;
}
int aio_write(ImageCtx *ictx, uint64_t off, size_t len, const char *buf,
AioCompletion *c)
{
+ tracepoint(librbd, aio_write_enter, ictx, ictx->name.c_str(), ictx->id.c_str(), off, len, buf, c);
CephContext *cct = ictx->cct;
ldout(cct, 20) << "aio_write " << ictx << " off = " << off << " len = "
<< len << " buf = " << (void*)buf << dendl;
int r = ictx_check(ictx);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, aio_write_exit, r);
return r;
+ }
uint64_t mylen = len;
r = clip_io(ictx, off, &mylen);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, aio_write_exit, r);
return r;
+ }
ictx->snap_lock.get_read();
snapid_t snap_id = ictx->snap_id;
ictx->parent_lock.put_read();
ictx->snap_lock.put_read();
- if (snap_id != CEPH_NOSNAP || ictx->read_only)
+ if (snap_id != CEPH_NOSNAP || ictx->read_only) {
+ tracepoint(librbd, aio_write_exit, -EROFS);
return -EROFS;
+ }
ldout(cct, 20) << " parent overlap " << overlap << dendl;
ictx->perfcounter->inc(l_librbd_aio_wr_bytes, mylen);
/* FIXME: cleanup all the allocated stuff */
+ tracepoint(librbd, aio_write_exit, r);
return r;
}
int aio_discard(ImageCtx *ictx, uint64_t off, uint64_t len, AioCompletion *c)
{
+ tracepoint(librbd, aio_discard_enter, ictx, ictx->name.c_str(), ictx->id.c_str(), off, len, c);
CephContext *cct = ictx->cct;
ldout(cct, 20) << "aio_discard " << ictx << " off = " << off << " len = "
<< len << dendl;
int r = ictx_check(ictx);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, aio_discard_exit, r);
return r;
+ }
r = clip_io(ictx, off, &len);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, aio_discard_exit, r);
return r;
+ }
// TODO: check for snap
ictx->snap_lock.get_read();
ictx->parent_lock.put_read();
ictx->snap_lock.put_read();
- if (snap_id != CEPH_NOSNAP || ictx->read_only)
+ if (snap_id != CEPH_NOSNAP || ictx->read_only) {
+ tracepoint(librbd, aio_discard_exit, -EROFS);
return -EROFS;
+ }
// map
vector<ObjectExtent> extents;
ictx->perfcounter->inc(l_librbd_aio_discard_bytes, len);
/* FIXME: cleanup all the allocated stuff */
+ tracepoint(librbd, aio_discard_exit, r);
return r;
}
int aio_read(ImageCtx *ictx, const vector<pair<uint64_t,uint64_t> >& image_extents,
char *buf, bufferlist *pbl, AioCompletion *c)
{
+ tracepoint(librbd, aio_read_enter, ictx, ictx->name.c_str(), ictx->id.c_str(), buf, c);
+ for (vector<pair<uint64_t,uint64_t> >::const_iterator r = image_extents.begin();
+ r != image_extents.end();
+ ++r) {
+ tracepoint(librbd, aio_read_extent, r->first, r->second);
+ }
ldout(ictx->cct, 20) << "aio_read " << ictx << " completion " << c << " " << image_extents << dendl;
int r = ictx_check(ictx);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, aio_read_exit, r);
return r;
+ }
ictx->snap_lock.get_read();
snap_t snap_id = ictx->snap_id;
++p) {
uint64_t len = p->second;
r = clip_io(ictx, p->first, &len);
- if (r < 0)
+ if (r < 0) {
+ tracepoint(librbd, aio_read_exit, r);
return r;
+ }
if (len == 0)
continue;
ictx->perfcounter->inc(l_librbd_aio_rd);
ictx->perfcounter->inc(l_librbd_aio_rd_bytes, buffer_ofs);
+ tracepoint(librbd, aio_read_exit, ret);
return ret;
}
TRACEPOINT_EVENT(librbd, read_enter,
TP_ARGS(
+ void*, imagectx,
const char*, name,
const char*, id),
TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
ctf_string(name, name)
ctf_string(id, id)
)
TRACEPOINT_EVENT(librbd, write_enter,
TP_ARGS(
+ void*, imagectx,
const char*, name,
const char*, id,
uint64_t, off,
size_t, len,
const char*, buf),
TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
ctf_string(name, name)
ctf_string(id, id)
ctf_integer(uint64_t, off, off)
TRACEPOINT_EVENT(librbd, open_image_enter,
TP_ARGS(
+ void*, imagectx,
const char*, name,
- const char*, id),
+ const char*, id,
+ const char*, snap_name,
+ int, read_only),
TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
ctf_string(name, name)
ctf_string(id, id)
+ ctf_string(snap_name, snap_name)
+ ctf_integer(uint8_t, read_only, read_only ? 1 : 0)
)
)
TRACEPOINT_EVENT(librbd, close_image_enter,
TP_ARGS(
+ void*, imagectx,
const char*, name,
const char*, id),
TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
ctf_string(name, name)
ctf_string(id, id)
)
ctf_integer(int, retval, retval)
)
)
+
+TRACEPOINT_EVENT(librbd, aio_write_enter,
+ TP_ARGS(
+ void*, imagectx,
+ const char*, name,
+ const char*, id,
+ uint64_t, off,
+ size_t, len,
+ const char*, buf,
+ const void*, completion),
+ TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
+ ctf_string(name, name)
+ ctf_string(id, id)
+ ctf_integer(uint64_t, off, off)
+ ctf_integer(size_t, len, len)
+ ceph_ctf_sequence(unsigned char, buf, buf, size_t, len)
+ ctf_integer_hex(const void*, completion, completion)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_write_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_read_enter,
+ TP_ARGS(
+ void*, imagectx,
+ const char*, name,
+ const char*, id,
+ const char*, buf,
+ const void*, completion),
+ TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
+ ctf_string(name, name)
+ ctf_string(id, id)
+ 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)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_read_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_discard_enter,
+ TP_ARGS(
+ void*, imagectx,
+ const char*, name,
+ const char*, id,
+ uint64_t, off,
+ uint64_t, len,
+ void*, completion),
+ TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
+ ctf_string(name, name)
+ ctf_string(id, id)
+ ctf_integer(uint64_t, off, off)
+ ctf_integer(uint64_t, len, len)
+ ctf_integer_hex(void*, completion, completion)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_discard_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, invalidate_cache_enter,
+ TP_ARGS(
+ void*, imagectx,
+ const char*, name,
+ const char*, id),
+ TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
+ ctf_string(name, name)
+ ctf_string(id, id)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, invalidate_cache_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, flush_enter,
+ TP_ARGS(
+ void*, imagectx,
+ const char*, name,
+ const char*, id),
+ TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
+ ctf_string(name, name)
+ ctf_string(id, id)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, flush_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_flush_enter,
+ TP_ARGS(
+ void*, imagectx,
+ const char*, name,
+ const char*, id,
+ const void*, completion),
+ TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
+ ctf_string(name, name)
+ ctf_string(id, id)
+ ctf_integer_hex(const void*, completion, completion)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_flush_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, copy_enter,
+ TP_ARGS(
+ void*, src_imagectx,
+ const char*, src_name,
+ const char*, src_id,
+ void*, dst_imagectx,
+ const char*, dst_name,
+ const char*, dst_id),
+ TP_FIELDS(
+ ctf_integer_hex(void*, src_imagectx, src_imagectx)
+ ctf_string(src_name, src_name)
+ ctf_string(src_id, src_id)
+ ctf_integer_hex(void*, dst_imagectx, dst_imagectx)
+ ctf_string(dst_name, dst_name)
+ ctf_string(dst_id, dst_id)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, copy_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, resize_enter,
+ TP_ARGS(
+ void*, imagectx,
+ const char*, name,
+ const char*, id,
+ uint64_t, size),
+ TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
+ ctf_string(name, name)
+ ctf_string(id, id)
+ ctf_integer(uint64_t, size, size)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, resize_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, rename_enter,
+ TP_ARGS(
+ const char*, pool_name,
+ uint64_t, id,
+ const char*, srcname,
+ const char*, dstname),
+ TP_FIELDS(
+ ctf_string(pool_name, pool_name)
+ ctf_integer(uint64_t, id, id)
+ ctf_string(srcname, srcname)
+ ctf_string(dstname, dstname)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, rename_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, discard_enter,
+ TP_ARGS(
+ void*, imagectx,
+ const char*, name,
+ const char*, id,
+ uint64_t, off,
+ uint64_t, len),
+ TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
+ ctf_string(name, name)
+ ctf_string(id, id)
+ ctf_integer(uint64_t, off, off)
+ ctf_integer(uint64_t, len, len)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, discard_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_is_complete_enter,
+ TP_ARGS(
+ rbd_completion_t, completion),
+ TP_FIELDS(
+ ctf_integer_hex(rbd_completion_t, completion, completion)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_is_complete_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_get_return_value_enter,
+ TP_ARGS(
+ rbd_completion_t, completion),
+ TP_FIELDS(
+ ctf_integer_hex(rbd_completion_t, completion, completion)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_get_return_value_exit,
+ TP_ARGS(
+ ssize_t, retval),
+ TP_FIELDS(
+ ctf_integer(ssize_t, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_wait_for_complete_enter,
+ TP_ARGS(
+ rbd_completion_t, completion),
+ TP_FIELDS(
+ ctf_integer_hex(rbd_completion_t, completion, completion)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_wait_for_complete_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_complete_enter,
+ TP_ARGS(
+ rbd_completion_t, completion,
+ ssize_t, rval),
+ TP_FIELDS(
+ ctf_integer_hex(rbd_completion_t, completion, completion)
+ ctf_integer(ssize_t, rval, rval)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, aio_complete_exit,
+ TP_ARGS(),
+ TP_FIELDS()
+)