* Adds traced versions of Rados aio_read/write

Signed-off-by: Marios-Evaggelos Kogias <[email protected]>
Signed-off-by: Filippos Giannakos <[email protected]>
Signed-off-by: Andrew Shewmaker <[email protected]>
Signed-off-by: Chendi.Xue <[email protected]>
---
 src/include/rados/librados.h | 13 +++++++
 src/librados/IoCtxImpl.cc    | 85 ++++++++++++++++++++++++++++++++++++++++++++
 src/librados/IoCtxImpl.h     | 16 +++++++++
 src/librados/RadosClient.cc  |  1 +
 src/librados/librados.cc     | 30 ++++++++++++++++
 5 files changed, 145 insertions(+)

diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h
index 15a225b..aa0416e 100644
--- a/src/include/rados/librados.h
+++ b/src/include/rados/librados.h
@@ -1736,6 +1736,13 @@ CEPH_RADOS_API int rados_aio_write(rados_ioctx_t io, 
const char *oid,
                                   rados_completion_t completion,
                                   const char *buf, size_t len, uint64_t off);
 
+#ifdef WITH_BLKIN
+struct blkin_trace_info;
+int rados_aio_write_traced(rados_ioctx_t io, const char *oid,
+        rados_completion_t completion,
+        const char *buf, size_t len, uint64_t off,
+        struct blkin_trace_info *info);
+#endif
 /**
  * Asychronously append data to an object
  *
@@ -1818,6 +1825,12 @@ CEPH_RADOS_API int rados_aio_read(rados_ioctx_t io, 
const char *oid,
                                  rados_completion_t completion,
                                  char *buf, size_t len, uint64_t off);
 
+#ifdef WTIH_BLKIN
+int rados_aio_read_traced(rados_ioctx_t io, const char *oid,
+        rados_completion_t completion,
+        char *buf, size_t len, uint64_t off,
+        struct blkin_trace_info *info);
+#endif
 /**
  * Block until all pending writes in an io context are safe
  *
diff --git a/src/librados/IoCtxImpl.cc b/src/librados/IoCtxImpl.cc
index 5ef56c0..0e52bd3 100644
--- a/src/librados/IoCtxImpl.cc
+++ b/src/librados/IoCtxImpl.cc
@@ -31,6 +31,7 @@ librados::IoCtxImpl::IoCtxImpl() :
   aio_write_seq(0), 
cached_pool_names_lock("librados::IoCtxImpl::cached_pool_names_lock"),
   objecter(NULL)
 {
+    BLKIN_MSG_END(ioctx, "0.0.0.0", 0, "ioctx");
 }
 
 librados::IoCtxImpl::IoCtxImpl(RadosClient *c, Objecter *objecter,
@@ -42,6 +43,7 @@ librados::IoCtxImpl::IoCtxImpl(RadosClient *c, Objecter 
*objecter,
     aio_write_seq(0), 
cached_pool_names_lock("librados::IoCtxImpl::cached_pool_names_lock"),
     objecter(objecter)
 {
+    BLKIN_MSG_END(ioctx, "0.0.0.0", 0, "ioctx");
 }
 
 void librados::IoCtxImpl::set_snap_read(snapid_t s)
@@ -516,6 +518,7 @@ int librados::IoCtxImpl::operate(const object_t& oid, 
::ObjectOperation *o,
   Objecter::Op *objecter_op = objecter->prepare_mutate_op(oid, oloc,
                                                          *o, snapc, ut, flags,
                                                          NULL, oncommit, &ver);
+  BLKIN_OP_SET_TRACE(objecter_op, o->trace);
   objecter->op_submit(objecter_op);
 
   mylock.Lock();
@@ -645,6 +648,45 @@ int librados::IoCtxImpl::aio_read(const object_t oid, 
AioCompletionImpl *c,
   return 0;
 }
 
+#ifdef WITH_BLKIN
+int librados::IoCtxImpl::aio_read_traced(const object_t oid, AioCompletionImpl 
*c,
+                                        char *buf, size_t len, uint64_t off,
+                                        uint64_t snapid,
+                                        struct blkin_trace_info *info)
+{
+  if (len > (size_t) INT_MAX)
+    return -EDOM;
+
+  /*handle trace*/
+  ZTracer::ZTraceRef trace;
+  trace = ZTracer::create_ZTrace("librados", ioctx_endpoint, info, true);
+  if (!trace) {
+    ldout(client->cct, 5) << "librados read trace could not be created" << 
dendl;
+    return -1;
+  }
+
+  trace->event("librados accept");
+  Context *onack = new C_aio_Ack(c);
+
+  c->is_read = true;
+  c->io = this;
+  c->bl.clear();
+  c->bl.push_back(buffer::create_static(len, buf));
+  c->blp = &c->bl;
+
+  Mutex::Locker l(*aio_read_traced_lock);
+  trace->event("send to objecter");
+  struct blkin_trace_info *child_info = (struct blkin_trace_info *)
+      malloc(sizeof(struct blkin_trace_info));
+  trace->get_trace_info(child_info);
+  objecter->read_traced(oid, oloc,
+                off, len, snapid, &c->bl, 0,
+                onack, child_info, &c->objver);
+
+  return 0;
+}
+#endif // WITH_BLKIN
+
 class C_ObjectOperation : public Context {
 public:
   ::ObjectOperation m_ops;
@@ -705,6 +747,49 @@ int librados::IoCtxImpl::aio_write(const object_t &oid, 
AioCompletionImpl *c,
   return 0;
 }
 
+#ifdef WITH_BLKIN
+int librados::IoCtxImpl::aio_write_traced(const object_t &oid,
+                                         AioCompletionImpl *c,
+                                         const bufferlist& bl, size_t len,
+                                         uint64_t off,
+                                         struct blkin_trace_info *info)
+{
+  utime_t ut = ceph_clock_now(client->cct);
+  ldout(client->cct, 20) << "aio_write_traced " << oid << " " << off << "~" << 
len << " snapc=" << snapc << " snap_seq=" << snap_seq << dendl;
+
+  /* can't write to a snapshot */
+  if (snap_seq != CEPH_NOSNAP)
+    return -EROFS;
+
+  /*handle trace*/
+  ZTracer::ZTraceRef trace;
+  trace = ZTracer::create_ZTrace("librados", ioctx_endpoint, info, true);
+  if (!trace) {
+    ldout(client->cct, 5) << "librados write trace could not be created" << 
dendl;
+    return -1;
+  }
+
+  trace->event("librados accept");
+
+  c->io = this;
+  queue_aio_write(c);
+
+  Context *onack = new C_aio_Ack(c);
+  Context *onsafe = new C_aio_Safe(c);
+
+  Mutex::Locker l(*aio_write_traced_lock);
+  trace->event("send to objecter");
+  struct blkin_trace_info *child_info = (struct blkin_trace_info *)
+      malloc(sizeof(struct blkin_trace_info));
+  trace->get_trace_info(child_info);
+  objecter->write_traced(oid, oloc,
+                 off, len, snapc, bl, ut, 0,
+                 onack, onsafe, child_info, &c->objver);
+
+  return 0;
+}
+#endif // WITH_BLKIN
+
 int librados::IoCtxImpl::aio_append(const object_t &oid, AioCompletionImpl *c,
                                    const bufferlist& bl, size_t len)
 {
diff --git a/src/librados/IoCtxImpl.h b/src/librados/IoCtxImpl.h
index df73b03..ee7f46c 100644
--- a/src/librados/IoCtxImpl.h
+++ b/src/librados/IoCtxImpl.h
@@ -51,6 +51,12 @@ struct librados::IoCtxImpl {
 
   Objecter *objecter;
 
+#ifdef WITH_BLKIN
+  Mutex *aio_read_traced_lock;
+  Mutex *aio_write_traced_lock;
+#endif // WITH_BLKIN
+  BLKIN_END_REF(ioctx_endpoint)
+
   IoCtxImpl();
   IoCtxImpl(RadosClient *c, Objecter *objecter,
            int64_t poolid, snapid_t s);
@@ -174,11 +180,21 @@ struct librados::IoCtxImpl {
               bufferlist *pbl, size_t len, uint64_t off, uint64_t snapid);
   int aio_read(object_t oid, AioCompletionImpl *c,
               char *buf, size_t len, uint64_t off, uint64_t snapid);
+#ifdef WITH_BLKIN
+  int aio_read_traced(object_t oid, AioCompletionImpl *c,
+              char *buf, size_t len, uint64_t off, uint64_t snapid,
+              struct blkin_trace_info *info);
+#endif
   int aio_sparse_read(const object_t oid, AioCompletionImpl *c,
                      std::map<uint64_t,uint64_t> *m, bufferlist *data_bl,
                      size_t len, uint64_t off, uint64_t snapid);
   int aio_write(const object_t &oid, AioCompletionImpl *c,
                const bufferlist& bl, size_t len, uint64_t off);
+#ifdef WITH_BLKIN
+  int aio_write_traced(const object_t &oid, AioCompletionImpl *c,
+               const bufferlist& bl, size_t len, uint64_t off,
+               struct blkin_trace_info *info);
+#endif
   int aio_append(const object_t &oid, AioCompletionImpl *c,
                 const bufferlist& bl, size_t len);
   int aio_write_full(const object_t &oid, AioCompletionImpl *c,
diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc
index 8e63fce..f19bf69 100644
--- a/src/librados/RadosClient.cc
+++ b/src/librados/RadosClient.cc
@@ -79,6 +79,7 @@ librados::RadosClient::RadosClient(CephContext *cct_)
     log_last_version(0), log_cb(NULL), log_cb_arg(NULL),
     finisher(cct)
 {
+  BLKIN_ZTRACE_INIT();
 }
 
 int64_t librados::RadosClient::lookup_pool(const char *name)
diff --git a/src/librados/librados.cc b/src/librados/librados.cc
index cbefe0b..918bce7 100644
--- a/src/librados/librados.cc
+++ b/src/librados/librados.cc
@@ -3744,6 +3744,20 @@ extern "C" int rados_aio_read(rados_ioctx_t io, const 
char *o,
   return retval;
 }
 
+#ifdef WITH_BLKIN
+extern "C" int rados_aio_read_traced(rados_ioctx_t io, const char *o,
+                               rados_completion_t completion,
+                               char *buf, size_t len, uint64_t off,
+                               struct blkin_trace_info *info)
+{
+       librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
+       object_t oid(o);
+       return ctx->aio_read_traced(oid,
+                       (librados::AioCompletionImpl*)completion, buf, len,
+                       off, ctx->snap_seq, info);
+}
+#endif
+
 extern "C" int rados_aio_write(rados_ioctx_t io, const char *o,
                                rados_completion_t completion,
                                const char *buf, size_t len, uint64_t off)
@@ -3761,6 +3775,22 @@ extern "C" int rados_aio_write(rados_ioctx_t io, const 
char *o,
   return retval;
 }
 
+#ifdef WITH_BLKIN
+extern "C" int rados_aio_write_traced(rados_ioctx_t io, const char *o,
+               rados_completion_t completion,
+               const char *buf, size_t len, uint64_t off,
+               struct blkin_trace_info *info)
+{
+       librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
+       object_t oid(o);
+       bufferlist bl;
+       bl.append(buf, len);
+       return ctx->aio_write_traced(oid,
+                       (librados::AioCompletionImpl*)completion,bl, len, off,
+                       info);
+}
+#endif
+
 extern "C" int rados_aio_append(rados_ioctx_t io, const char *o,
                                rados_completion_t completion,
                                const char *buf, size_t len)
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to