]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: cut short object read if a chunk returns error
authorYehuda Sadeh <yehuda@inktank.com>
Tue, 6 May 2014 18:06:29 +0000 (11:06 -0700)
committerSage Weil <sage@inktank.com>
Wed, 7 May 2014 22:03:52 +0000 (15:03 -0700)
Fixes: #8289
Backport: firefly, dumpling
When reading an object, if we hit an error when trying to read one of
the rados objects then we should just stop. Otherwise we're just going
to continue reading the rest of the object, and since it can't be sent
back to the client (as we have a hole in the middle), we end up
accumulating everything in memory.

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
(cherry picked from commit 03b0d1cfb7bd30a77fedcf75eb06476b21b14e95)

src/rgw/rgw_rados.cc

index 405f00f1f004484a02a2e3a967cedccefc6f20b5..1ac77f449470100069456033e41797f6dbada05f 100644 (file)
@@ -4817,8 +4817,16 @@ void RGWRados::get_obj_aio_completion_cb(completion_t c, void *arg)
   ldout(cct, 20) << "get_obj_aio_completion_cb: io completion ofs=" << ofs << " len=" << len << dendl;
   d->throttle.put(len);
 
-  if (d->is_cancelled())
+  r = rados_aio_get_return_value(c);
+  if (r < 0) {
+    ldout(cct, 0) << "ERROR: got unexpected error when trying to read object: " << r << dendl;
+    d->set_cancelled(r);
     goto done;
+  }
+
+  if (d->is_cancelled()) {
+    goto done;
+  }
 
   d->data_lock.Lock();