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)
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();