From c6a2e156b1328bd05eb6c27b76d3c40a4717beb9 Mon Sep 17 00:00:00 2001 From: sageweil Date: Wed, 21 Mar 2007 21:03:07 +0000 Subject: [PATCH] grr try this git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1277 29311d96-e01e-0410-9327-a35deaab8ce9 --- .../security1/ceph/msg/SimpleMessenger.cc | 95 ++++++++++++------- 1 file changed, 62 insertions(+), 33 deletions(-) diff --git a/branches/aleung/security1/ceph/msg/SimpleMessenger.cc b/branches/aleung/security1/ceph/msg/SimpleMessenger.cc index ce3a08a84e7ba..73632fc2f74e2 100644 --- a/branches/aleung/security1/ceph/msg/SimpleMessenger.cc +++ b/branches/aleung/security1/ceph/msg/SimpleMessenger.cc @@ -621,40 +621,69 @@ int Rank::Pipe::write_message(Message *m) } #else - // one big chunk - env->nchunks = -blist.length(); - - // set up msghdr and iovecs - struct msghdr msg; - memset(&msg, 0, sizeof(msg)); - struct iovec msgvec[1+blist.buffers().size()]; - msg.msg_iov = msgvec; - - // envelope - msgvec[0].iov_base = (char*)env; - msgvec[0].iov_len = sizeof(*env); - msg.msg_iovlen++; - - // buffers - for (list::const_iterator it = blist.buffers().begin(); - it != blist.buffers().end(); - it++) { - if ((*it).length() == 0) continue; // skip blank buffer. - msgvec[msg.msg_iovlen].iov_base = (char*)(*it).c_str(); - msgvec[msg.msg_iovlen].iov_len = (*it).length(); + if (0) { + // one big chunk + env->nchunks = -blist.length(); + + // set up msghdr and iovecs + struct msghdr msg; + memset(&msg, 0, sizeof(msg)); + struct iovec msgvec[1+blist.buffers().size()]; + msg.msg_iov = msgvec; + + // envelope + msgvec[0].iov_base = (char*)env; + msgvec[0].iov_len = sizeof(*env); msg.msg_iovlen++; - } - - // send - int r = sendmsg(sd, &msg, 0); - if (r < 0) { - assert(r == -1); - derr(1) << "pipe(" << peer_addr << ' ' << this << ").writer error on sendmsg for " << *m - << " to " << m->get_dest() - << ", " << strerror(errno) - << endl; - need_to_send_close = false; - return -1; + + // buffers + for (list::const_iterator it = blist.buffers().begin(); + it != blist.buffers().end(); + it++) { + if ((*it).length() == 0) continue; // skip blank buffer. + msgvec[msg.msg_iovlen].iov_base = (char*)(*it).c_str(); + msgvec[msg.msg_iovlen].iov_len = (*it).length(); + msg.msg_iovlen++; + } + + // send + int r = sendmsg(sd, &msg, 0); + if (r < 0) { + assert(r == -1); + derr(1) << "pipe(" << peer_addr << ' ' << this << ").writer error on sendmsg for " << *m + << " to " << m->get_dest() + << ", " << strerror(errno) + << endl; + need_to_send_close = false; + return -1; + } + } else { + // OLD way. + int size = blist.length(); + env->nchunks = -blist.length(); + + // send envelope + int r = tcp_write( sd, (char*)env, sizeof(*env), true ); // MORE + if (r < 0) { + derr(1) << "pipe(" << peer_addr << ' ' << this << ").writer error sending envelope for " << *m + << " to " << m->get_dest() << endl; + need_to_send_close = false; + return -1; + } + + dout(20) << "pipe(" << peer_addr << ' ' << this << ").writer data len is " << size << " in " << blist.buffers().size() << " buffers" << endl; + + for (list::const_iterator it = blist.buffers().begin(); + it != blist.buffers().end(); + it++) { + if ((*it).length() == 0) continue; // blank buffer. + r = tcp_write( sd, (char*)(*it).c_str(), (*it).length() ); + if (r < 0) { + derr(10) << "pipe(" << peer_addr << ' ' << this << ").writer error sending data megachunk for " << *m << " to " << m->get_dest() << " : len " << (*it).length() << endl; + need_to_send_close = false; + return -1; + } + } } #endif -- 2.39.5