]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: error out if frontend did not send all data 5231/head
authorYehuda Sadeh <yehuda@redhat.com>
Thu, 25 Jun 2015 21:31:03 +0000 (14:31 -0700)
committerAbhishek Lekshmanan <abhishek.lekshmanan@ril.com>
Tue, 14 Jul 2015 09:27:07 +0000 (14:57 +0530)
Fixes: #11851
The civetweb mg_write() doesn't return error when it can't flush all data
to the user, it just sends the total number of bytes written. Modified the
client io to return total number of bytes and return an error if didn't
send anything.

Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
(cherry picked from commit daa679c3dd3770a6d5421e2cc9a36924f4550439)

src/rgw/rgw_civetweb.cc
src/rgw/rgw_client_io.cc

index 901b2ded8ac692c8ef1fea3234e5b281c5199c32..089250fd4f7ac8ed831d45f1b1a632a81dd144e6 100644 (file)
@@ -13,13 +13,18 @@ int RGWMongoose::write_data(const char *buf, int len)
 {
   if (!header_done) {
     header_data.append(buf, len);
-    return 0;
+    return len;
   }
   if (!sent_header) {
     data.append(buf, len);
-    return 0;
+    return len;
+  }
+  int r = mg_write(conn, buf, len);
+  if (r == 0) {
+    /* didn't send anything, error out */
+    return -EIO;
   }
-  return mg_write(conn, buf, len);
+  return r;
 }
 
 RGWMongoose::RGWMongoose(mg_connection *_conn, int _port) : conn(_conn), port(_port), header_done(false), sent_header(false), has_content_length(false),
index 5e8edbf311236708e46c6cbaa461fb2390d60f03..1f8b803a3d405e65c483296ffe6b47caaa90a781 100644 (file)
@@ -56,7 +56,12 @@ int RGWClientIO::write(const char *buf, int len)
     return ret;
 
   if (account)
-    bytes_sent += len;
+    bytes_sent += ret;
+
+  if (ret < len) {
+    /* sent less than tried to send, error out */
+    return -EIO;
+  }
 
   return 0;
 }