]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msgr: put msgvec on heap
authorSage Weil <sage@newdream.net>
Tue, 11 May 2010 23:52:48 +0000 (16:52 -0700)
committerSage Weil <sage@newdream.net>
Wed, 12 May 2010 04:30:19 +0000 (21:30 -0700)
It can get too big for the stack.

src/msg/SimpleMessenger.cc

index 5a9eb02e1181d258ca60be683c51faeee5ca1d7c..5874b829d5042a0a1944043e59f0964a1961c053 100644 (file)
@@ -1951,6 +1951,7 @@ int SimpleMessenger::Pipe::write_message(Message *m)
 {
   ceph_msg_header& header = m->get_header();
   ceph_msg_footer& footer = m->get_footer();
+  int ret;
 
   // get envelope, buffers
   header.front_len = m->get_payload().length();
@@ -1968,7 +1969,7 @@ int SimpleMessenger::Pipe::write_message(Message *m)
   // set up msghdr and iovecs
   struct msghdr msg;
   memset(&msg, 0, sizeof(msg));
-  struct iovec msgvec[3 + blist.buffers().size()];  // conservative upper bound
+  struct iovec *msgvec = new iovec[3 + blist.buffers().size()];  // conservative upper bound
   msg.msg_iov = msgvec;
   int msglen = 0;
   
@@ -2009,7 +2010,8 @@ int SimpleMessenger::Pipe::write_message(Message *m)
   while (left > 0) {
     int donow = MIN(left, (int)pb->length()-b_off);
     if (donow == 0) {
-      dout(0) << "donow = " << donow << " left " << left << " pb->length " << pb->length() << " b_off " << b_off << dendl;
+      dout(0) << "donow = " << donow << " left " << left << " pb->length " << pb->length()
+             << " b_off " << b_off << dendl;
     }
     assert(donow > 0);
     dout(30) << " bl_pos " << bl_pos << " b_off " << b_off
@@ -2020,7 +2022,7 @@ int SimpleMessenger::Pipe::write_message(Message *m)
     
     if (msg.msg_iovlen >= IOV_MAX-2) {
       if (do_sendmsg(sd, &msg, msglen, true)) 
-       return -1;      
+       goto fail;
       
       // and restart the iov
       msg.msg_iov = msgvec;
@@ -2037,7 +2039,8 @@ int SimpleMessenger::Pipe::write_message(Message *m)
     assert(left >= 0);
     b_off += donow;
     bl_pos += donow;
-    if (left == 0) break;
+    if (left == 0)
+      break;
     while (b_off == (int)pb->length()) {
       pb++;
       b_off = 0;
@@ -2053,9 +2056,17 @@ int SimpleMessenger::Pipe::write_message(Message *m)
 
   // send
   if (do_sendmsg(sd, &msg, msglen)) 
-    return -1; 
+    goto fail;
 
-  return 0;
+  ret = 0;
+
+ out:
+  delete[] msgvec;
+  return ret;
+
+ fail:
+  ret = -1;
+  goto out;
 }