Skip to content

Commit

Permalink
Don't loop forever when reading data from 0 sized segment.
Browse files Browse the repository at this point in the history
The 0 sized segment can arise depending on how
the client uploads the object in the first place.
The cpu loop then happens during a swift `GET'.

Signed-off-by: Marcus Watts <mwatts@redhat.com>
(cherry picked from commit 46c5f97)
  • Loading branch information
mdw-at-linuxbox authored and oritwas committed Nov 24, 2016
1 parent 9bf08dd commit 03af4aa
Showing 1 changed file with 15 additions and 0 deletions.
15 changes: 15 additions & 0 deletions src/rgw/rgw_op.cc
Expand Up @@ -722,6 +722,10 @@ int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket, RGWObjEnt& ent, RGWAc
return -EPERM;
}

if (ent.size == 0) {
return 0;
}

perfcounter->inc(l_rgw_get_b, cur_end - cur_ofs);
while (cur_ofs <= cur_end) {
bufferlist bl;
Expand All @@ -731,6 +735,12 @@ int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket, RGWObjEnt& ent, RGWAc

off_t len = bl.length();
cur_ofs += len;
if (!len) {
ldout(s->cct, 0) << "ERROR: read 0 bytes; ofs=" << cur_ofs
<< " end=" << cur_end << " from obj=" << ent.key.name
<< "[" << ent.key.instance << "]" << dendl;
return -EIO;
}
ret = 0;
perfcounter->tinc(l_rgw_get_lat,
(ceph_clock_now(s->cct) - start_time));
Expand Down Expand Up @@ -881,6 +891,11 @@ int RGWGetObj::handle_user_manifest(const char *prefix)
if (r < 0)
return r;

if (!total_len) {
bufferlist bl;
send_response_data(bl, 0, 0);
}

return 0;
}

Expand Down

0 comments on commit 03af4aa

Please sign in to comment.