From b3808583484c96f62cd8c91dcf227b736738d347 Mon Sep 17 00:00:00 2001 From: sageweil Date: Thu, 15 Nov 2007 04:44:22 +0000 Subject: [PATCH] all chunk sizes come first, before payload git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@2069 29311d96-e01e-0410-9327-a35deaab8ce9 --- trunk/ceph/msg/SimpleMessenger.cc | 57 ++++++++++++++++++------------- trunk/ceph/msg/msg_types.h | 5 +++ 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/trunk/ceph/msg/SimpleMessenger.cc b/trunk/ceph/msg/SimpleMessenger.cc index 2842ab393846b..2276671f0376c 100644 --- a/trunk/ceph/msg/SimpleMessenger.cc +++ b/trunk/ceph/msg/SimpleMessenger.cc @@ -1294,15 +1294,18 @@ Message *Rank::Pipe::read_message() << " src " << env.src << " dst " << env.dst << " nchunks=" << env.nchunks << dendl; + + // read chunk lens + __u32 chunklens[4]; + if (tcp_read(sd, (char*)chunklens, sizeof(__u32)*env.nchunks) < 0) + return 0; - // payload + // read chunks bufferlist blist; int32_t pos = 0; list chunk_at; for (unsigned i=0; iget_payload() ); // chunk out page aligned buffers? + __u32 chunklens[4]; if (blist.length() == 0) env->nchunks = 0; else { env->nchunks = 1 + m->get_chunk_payload_at().size(); // header + explicit chunk points + + int pos = 0; + int c = 0; + for (list::const_iterator pc = m->get_chunk_payload_at().begin(); + pc != m->get_chunk_payload_at().end(); + pc++) { + chunklens[c] = *pc - pos; + dout(20) << "chunk bound at " << *pc << ", chunklen[" << c << "] = " << chunklens[c] << dendl; + pos = *pc; + c++; + } + chunklens[c] = blist.length() - pos; + dout(20) << "tail chunklen[" << c << "] = " << chunklens[c] << dendl; + if (!m->get_chunk_payload_at().empty()) - dout(20) << "chunking at " << m->get_chunk_payload_at() + dout(20) << "chunk bounds at " << m->get_chunk_payload_at() << " in " << *m << " len " << blist.length() << dendl; } @@ -1429,7 +1447,7 @@ int Rank::Pipe::write_message(Message *m) // set up msghdr and iovecs struct msghdr msg; memset(&msg, 0, sizeof(msg)); - struct iovec msgvec[2 + blist.buffers().size() + env->nchunks*2]; // conservative upper bound + struct iovec msgvec[3 + blist.buffers().size() + env->nchunks*2]; // conservative upper bound msg.msg_iov = msgvec; int msglen = 0; @@ -1445,6 +1463,12 @@ int Rank::Pipe::write_message(Message *m) msgvec[msg.msg_iovlen].iov_len = sizeof(*env); msglen += sizeof(*env); msg.msg_iovlen++; + + // send chunk sizes + msgvec[msg.msg_iovlen].iov_base = &chunklens; + msgvec[msg.msg_iovlen].iov_len = sizeof(__u32) * env->nchunks; + msglen += sizeof(__u32) * env->nchunks; + msg.msg_iovlen++; // payload list::const_iterator pb = blist.buffers().begin(); @@ -1452,29 +1476,14 @@ int Rank::Pipe::write_message(Message *m) int b_off = 0; // carry-over buffer offset, if any int bl_pos = 0; // blist pos int nchunks = env->nchunks; - int32_t chunksizes[nchunks]; for (int curchunk=0; curchunk < nchunks; curchunk++) { // start a chunk - int32_t size = blist.length() - bl_pos; - if (pc != m->get_chunk_payload_at().end()) { - assert(*pc > bl_pos); - size = *pc - bl_pos; - dout(30) << "pos " << bl_pos << " explicit chunk at " << *pc << " size " << size << " of " << blist.length() << dendl; - pc++; - } - assert(size > 0); - dout(30) << "chunk " << curchunk << " pos " << bl_pos << " size " << size << dendl; - - // chunk size - chunksizes[curchunk] = size; - msgvec[msg.msg_iovlen].iov_base = &chunksizes[curchunk]; - msgvec[msg.msg_iovlen].iov_len = sizeof(int32_t); - msglen += sizeof(int32_t); - msg.msg_iovlen++; + int left = chunklens[curchunk]; + assert(left > 0); + dout(30) << "chunk " << curchunk << " pos " << bl_pos << "/" << blist.length() << " size " << left << dendl; // chunk contents - int left = size; while (left > 0) { int donow = MIN(left, (int)pb->length()-b_off); assert(donow > 0); diff --git a/trunk/ceph/msg/msg_types.h b/trunk/ceph/msg/msg_types.h index 2019b6b2c3ff0..79de4fe43914f 100644 --- a/trunk/ceph/msg/msg_types.h +++ b/trunk/ceph/msg/msg_types.h @@ -20,6 +20,7 @@ #include "tcp.h" class entity_name_t { +public: struct ceph_entity_name v; public: @@ -163,6 +164,10 @@ struct entity_inst_t { entity_addr_t addr; entity_inst_t() {} entity_inst_t(entity_name_t n, const entity_addr_t& a) : name(n), addr(a) {} + entity_inst_t(const ceph_entity_inst& i) { + name.v = i.name; + addr.v = i.addr; + } }; -- 2.39.5