rgw: do not ignore EEXIST in RGWPutObj::execute

The existing logic appears able to cause propagation of a failed
exclusive create to the client, when it should instead have been
retried, due to disagreement about the logical write offset. (The
value of ofs here could be > 0 due to the operation of a stacked
write filter [e.g., compressor], when the RADOS write offset was
0 and hence an exclusive write that should be retried).

Rationale for fix by Casey.

http://tracker.ceph.com/issues/22790

Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
This commit is contained in:
Matt Benjamin 2018-07-12 16:42:29 -04:00
parent 3e8ddaf301
commit 7c18258e54

View File

@ -3635,7 +3635,7 @@ void RGWPutObj::execute()
op_ret = put_data_and_throttle(filter, data, ofs, need_to_wait);
if (op_ret < 0) {
if (!need_to_wait || op_ret != -EEXIST) {
if (op_ret != -EEXIST) {
ldpp_dout(this, 20) << "processor->thottle_data() returned ret="
<< op_ret << dendl;
goto done;