From: Adam C. Emerson Date: Tue, 19 Dec 2017 17:53:05 +0000 (-0500) Subject: rgw: retry CORS put/delete operations on ECANCELLED X-Git-Tag: v12.2.3~205^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=767fec1e22247ec1c6010c308d51ba77dd31cb39;p=ceph.git rgw: retry CORS put/delete operations on ECANCELLED Fixes: http://tracker.ceph.com/issues/22517 Signed-off-by: Adam C. Emerson (cherry picked from commit bff7e61ca5a66b301ec49c1cf9054d1b74535832) --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 89aa1ec3018..b6921039030 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -5059,9 +5059,11 @@ void RGWPutCORS::execute() } } - map attrs = s->bucket_attrs; - attrs[RGW_ATTR_CORS] = cors_bl; - op_ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, &s->bucket_info.objv_tracker); + op_ret = retry_raced_bucket_write(store, s, [this] { + map attrs = s->bucket_attrs; + attrs[RGW_ATTR_CORS] = cors_bl; + return rgw_bucket_set_attrs(store, s->bucket_info, attrs, &s->bucket_info.objv_tracker); + }); } int RGWDeleteCORS::verify_permission() @@ -5080,32 +5082,35 @@ void RGWDeleteCORS::execute() return; bufferlist bl; - rgw_raw_obj obj; if (!cors_exist) { dout(2) << "No CORS configuration set yet for this bucket" << dendl; op_ret = -ENOENT; return; } - store->get_bucket_instance_obj(s->bucket, obj); - store->set_prefetch_data(s->obj_ctx, obj); - map orig_attrs, attrs, rmattrs; - map::iterator iter; + op_ret = retry_raced_bucket_write(store, s, [this] { + rgw_raw_obj obj; + store->get_bucket_instance_obj(s->bucket, obj); + store->set_prefetch_data(s->obj_ctx, obj); + map orig_attrs, attrs, rmattrs; + map::iterator iter; - op_ret = get_system_obj_attrs(store, s, obj, orig_attrs, NULL, &s->bucket_info.objv_tracker); - if (op_ret < 0) - return; + op_ret = get_system_obj_attrs(store, s, obj, orig_attrs, NULL, &s->bucket_info.objv_tracker); + if (op_ret < 0) + return op_ret; - /* only remove meta attrs */ - for (iter = orig_attrs.begin(); iter != orig_attrs.end(); ++iter) { - const string& name = iter->first; - dout(10) << "DeleteCORS : attr: " << name << dendl; - if (name.compare(0, (sizeof(RGW_ATTR_CORS) - 1), RGW_ATTR_CORS) == 0) { - rmattrs[name] = iter->second; - } else if (attrs.find(name) == attrs.end()) { - attrs[name] = iter->second; - } - } - op_ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, &s->bucket_info.objv_tracker); + /* only remove meta attrs */ + for (iter = orig_attrs.begin(); iter != orig_attrs.end(); ++iter) { + const string& name = iter->first; + dout(10) << "DeleteCORS : attr: " << name << dendl; + if (name.compare(0, (sizeof(RGW_ATTR_CORS) - 1), RGW_ATTR_CORS) == 0) { + rmattrs[name] = iter->second; + } else if (attrs.find(name) == attrs.end()) { + attrs[name] = iter->second; + } + } + return rgw_bucket_set_attrs(store, s->bucket_info, attrs, + &s->bucket_info.objv_tracker); + }); } void RGWOptionsCORS::get_response_params(string& hdrs, string& exp_hdrs, unsigned *max_age) {