From patchwork Tue Mar 3 00:35:14 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Shewmaker X-Patchwork-Id: 5918491 Return-Path: X-Original-To: patchwork-ceph-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id D6BC3BF440 for ; Tue, 3 Mar 2015 00:35:30 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 95D9120222 for ; Tue, 3 Mar 2015 00:35:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 06D3120221 for ; Tue, 3 Mar 2015 00:35:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754883AbbCCAfW (ORCPT ); Mon, 2 Mar 2015 19:35:22 -0500 Received: from mail-pd0-f179.google.com ([209.85.192.179]:45669 "EHLO mail-pd0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754245AbbCCAfP (ORCPT ); Mon, 2 Mar 2015 19:35:15 -0500 Received: by pdjz10 with SMTP id z10so43656559pdj.12 for ; Mon, 02 Mar 2015 16:35:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=R6M6dnfGBo8f+VXoQ/ccFP774LdD1uLVwJmdXvM7lFU=; b=Pu5jiTTpJFu+rKT/VfvtCfTzLjP70yq11YDeDX5PSqy8ZrAz4QYgHIjnI51x8S5ilm PlSg0/BkOucy6sAAGcdkZaIAkj4yyEreOayBNuiYg9+iEqKGNwvFwUESyOPXRup+VAPf EPXkLMNe/mEaS/ROIpsaX8RTv1cgZA+fcK2bYLC3UydRIfZjkx395KB3d9k4u7tVoL6a QNgVF0m/cVY94akNN6oVk8o7FZ5F/DPz502nWcZYzVv1RtJPqQEL9S82DIwpdQaYbg6e azo0HVg+RtC336YSMquvCeOiIVxQVhLK8cS6X3SR/UuBoUfLjddjBFH7mNv7mNvpFIX9 bFJA== X-Received: by 10.68.190.101 with SMTP id gp5mr50754396pbc.30.1425342914572; Mon, 02 Mar 2015 16:35:14 -0800 (PST) Received: from scruffy.soe.ucsc.edu (scruffy.soe.ucsc.edu. [128.114.53.124]) by mx.google.com with ESMTPSA id jd10sm13090591pbd.23.2015.03.02.16.35.13 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 02 Mar 2015 16:35:13 -0800 (PST) From: Andrew Shewmaker To: ceph-devel@vger.kernel.org Cc: agshew@gmail.com, marioskogias@gmail.com, chendi.xue@intel.com Subject: [PATCH V5 5/6] Rados support for blkin (LTTng + Zipkin) tracing Date: Mon, 2 Mar 2015 16:35:14 -0800 Message-Id: <1425342915-12553-6-git-send-email-agshew@gmail.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1425342915-12553-1-git-send-email-agshew@gmail.com> References: <1425342915-12553-1-git-send-email-agshew@gmail.com> Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP * Adds traced versions of Rados aio_read/write Signed-off-by: Marios-Evaggelos Kogias Signed-off-by: Filippos Giannakos Signed-off-by: Andrew Shewmaker Signed-off-by: Chendi.Xue --- src/include/rados/librados.h | 13 +++++++ src/librados/IoCtxImpl.cc | 83 ++++++++++++++++++++++++++++++++++++++++++++ src/librados/IoCtxImpl.h | 12 +++++++ src/librados/RadosClient.cc | 1 + src/librados/librados.cc | 30 ++++++++++++++++ 5 files changed, 139 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..8106f10 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,44 @@ 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; + + 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 +746,48 @@ 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); + + 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..916c690 100644 --- a/src/librados/IoCtxImpl.h +++ b/src/librados/IoCtxImpl.h @@ -51,6 +51,8 @@ struct librados::IoCtxImpl { Objecter *objecter; + BLKIN_END_REF(ioctx_endpoint) + IoCtxImpl(); IoCtxImpl(RadosClient *c, Objecter *objecter, int64_t poolid, snapid_t s); @@ -174,11 +176,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 *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)