rgw: fix memory fragmentation problem reading data from client.
mg_read returns 0 on EOF. In some versions of civetweb, mg_read can
return "short" reads. The logic in the rest of ceph depends on a read
always filling its buffer when possible. So loop here and fill the
buffer. Looping to fill the buffer means we must also track when
mg_read returns EOF, because after that further calls to mg_read will return -1.
Fixes: https://tracker.ceph.com/issues/23207
Signed-off-by: Marcus Watts <mwatts@redhat.com>
(cherry picked from commit
d9a150b1f1f9ec3952555186722c9b13d7448e2d)
Conflicts:
src/rgw/rgw_civetweb.cc:
- master RGWCivetWeb::RGWCivetWeb() becomes RGWMongoose::RGWMongoose() in jewel,
with slightly different initializer list; adapt mg_read() call for jewel
- master RGWCivetWeb::read_data() becomes RGWMongoose::read_data() in jewel,
and inside this function we return -EIO in jewel, instead of throwing an exception