void XioConnection::msg_send_fail(XioMsg *xmsg, int code)
{
ldout(msgr->cct,2) << "xio_send_msg FAILED xcon: " << this <<
- " xmsg: " << &xmsg->req_0.msg << " code=" << code <<
+ " xmsg: " << xmsg->get_xio_msg() << " code=" << code <<
" (" << xio_strerror(code) << ")" << dendl;
/* return refs taken for each xio_msg */
xmsg->put_msg_refs();
xmsg = static_cast<XioMsg*>(xs);
deferred_q.erase(q_iter);
// release once for each chained xio_msg
- xmsg->put(xmsg->hdr.msg_cnt);
+ xmsg->put(xmsg->get_msg_count());
break;
case XioSubmit::INCOMING_MSG_RELEASE:
deferred_q.erase(q_iter);
ldout(cct,4) << __func__ << " " << m << " new XioMsg " << xmsg
<< " tag " << (int)xmsg->hdr.tag
- << " req_0 " << &xmsg->req_0.msg << " msg type " << m->get_type()
+ << " req_0 " << xmsg->get_xio_msg() << " msg type " << m->get_type()
<< " features: " << xcon->get_features()
<< " conn " << xcon->conn << " sess " << xcon->session << dendl;
}
}
- struct xio_msg *req = &xmsg->req_0.msg;
+ struct xio_msg *req = xmsg->get_xio_msg();
struct xio_iovec_ex *msg_iov = req->out.pdata_iov.sglist;
if (magic & (MSG_MAGIC_XIO)) {
xio_place_buffers(data, xmsg, req, msg_iov, req_size, ex_cnt, msg_off,
req_off, BUFFER_DATA);
ldout(cct,10) << "ex_cnt " << ex_cnt << ", req_off " << req_off
- << ", msg_cnt " << xmsg->hdr.msg_cnt << dendl;
+ << ", msg_cnt " << xmsg->get_msg_count() << dendl;
/* finalize request */
if (msg_off)
req->out.pdata_iov.nents = msg_off;
/* fixup first msg */
- req = &xmsg->req_0.msg;
+ req = xmsg->get_xio_msg();
const std::list<buffer::ptr>& header = xmsg->hdr.get_bl().buffers();
assert(header.size() == 1); /* XXX */
req->out.header.iov_len = pb->length();
/* deliver via xio, preserve ordering */
- if (xmsg->hdr.msg_cnt > 1) {
- struct xio_msg *head = &xmsg->req_0.msg;
+ if (xmsg->get_msg_count() > 1) {
+ struct xio_msg *head = xmsg->get_xio_msg();
struct xio_msg *tail = head;
- for (req_off = 0; ((unsigned) req_off) < xmsg->hdr.msg_cnt-1; ++req_off) {
+ for (req_off = 0; ((unsigned) req_off) < xmsg->get_msg_count()-1; ++req_off) {
req = &xmsg->req_arr[req_off].msg;
assert(!req->in.pdata_iov.nents);
assert(req->out.pdata_iov.nents || !nbuffers);
assert(hdr_buffers.size() == 1); /* accelio header is small without scatter gather */
return hdr_buffers.begin()->length();
}
+
+void XioMsg::print_debug(CephContext *cct, const char *tag) const {
+ print_xio_msg_hdr(cct, tag, hdr, get_xio_msg());
+ print_ceph_msg(cct, tag, m);
+}
xcon->get();
}
+ void print_debug(CephContext *cct, const char *tag) const;
+ const struct xio_msg * get_xio_msg() const {return &req_0.msg;}
+ struct xio_msg * get_xio_msg() {return &req_0.msg;}
+ size_t get_msg_count() const {return hdr.msg_cnt;}
+
XioMsg* get() { nrefs.inc(); return this; };
void put(int n) {
}
void put_msg_refs() {
- put(hdr.msg_cnt);
+ put(get_msg_count());
}
void alloc_trailers(int cnt) {
~XioMsg()
{
if (unlikely(!!req_arr)) {
- for (unsigned int ix = 0; ix < hdr.msg_cnt-1; ++ix) {
+ for (unsigned int ix = 0; ix < get_msg_count()-1; ++ix) {
xio_msg_ex* xreq = &(req_arr[ix]);
xreq->~xio_msg_ex();
}
* on Accelio's check on below, but this assures that
* all chained xio_msg are accounted) */
xio_qdepth_high = xcon->xio_qdepth_high_mark();
- if (unlikely((xcon->send_ctr + xmsg->hdr.msg_cnt) >
+ if (unlikely((xcon->send_ctr + xmsg->get_msg_count()) >
xio_qdepth_high)) {
requeue_all_xcon(xcon, q_iter, send_q);
goto restart;
}
- msg = &xmsg->req_0.msg;
+ msg = xmsg->get_xio_msg();
code = xio_send_msg(xcon->conn, msg);
/* header trace moved here to capture xio serial# */
if (ldlog_p1(msgr->cct, ceph_subsys_xio, 11)) {
- print_xio_msg_hdr(msgr->cct, "xio_send_msg", xmsg->hdr, msg);
- print_ceph_msg(msgr->cct, "xio_send_msg", xmsg->m);
+ xmsg->print_debug(msgr->cct, "xio_send_msg");
}
/* get the right Accelio's errno code */
if (unlikely(code)) {
};
} else {
xcon->send.set(msg->timestamp); // need atomic?
- xcon->send_ctr += xmsg->hdr.msg_cnt; // only inc if cb promised
+ xcon->send_ctr += xmsg->get_msg_count(); // only inc if cb promised
}
break;
default: