bufferlist data;
JSONParser jp;
int ret = rgw_forward_request_to_master(dpp, *s->penv.site, s->user->get_id(),
- &data, &jp, s->info, y);
+ &data, &jp, s->info, s->err, y);
if (ret < 0) {
ldpp_dout(dpp, 0) << "forward_request_to_master returned ret=" << ret << dendl;
return ret;
op_state.set_purge_data(purge_data);
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->user->get_id(),
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
op_state.set_key_type(key_type);
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->user->get_id(),
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
op_state.set_key_type(key_type);
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->user->get_id(),
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
op_state.set_purge_keys();
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->user->get_id(),
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
op_state.set_caps(caps);
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->user->get_id(),
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
op_state.set_caps(caps);
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->user->get_id(),
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
static constexpr auto S3_RESOURCE_TAG = "s3:ResourceTag";
static constexpr auto S3_RUNTIME_RESOURCE_VAL = "${s3:ResourceTag";
+// try to parse the xml <Error> response body
+bool parse_aws_s3_error(const std::string& input, rgw_err& err)
+{
+ RGWXMLParser parser;
+ if (!parser.init()) {
+ return false;
+ }
+ if (!parser.parse(input.c_str(), input.length(), 1)) {
+ return false;
+ }
+ auto error = parser.find_first("Error");
+ if (!error) {
+ return false;
+ }
+ if (auto code = error->find_first("Code"); code) {
+ err.err_code = code->get_data();
+ }
+ if (auto message = error->find_first("Message"); message) {
+ err.message = message->get_data();
+ }
+ return true;
+}
+
int rgw_forward_request_to_master(const DoutPrefixProvider* dpp,
const rgw::SiteConfig& site,
const rgw_owner& effective_owner,
bufferlist* indata, JSONParser* jp,
- req_info& req, optional_yield y)
+ const req_info& req, rgw_err& err,
+ optional_yield y)
{
const auto& period = site.get_period();
if (!period) {
if (!result) {
return result.error();
}
- int ret = rgw_http_error_to_errno(*result);
+ err.http_ret = *result;
+ if (err.is_err() && outdata.length()) { // 4xx or 5xx
+ std::ignore = parse_aws_s3_error(rgw_bl_str(outdata), err);
+ }
+ int ret = rgw_http_error_to_errno(err.http_ret);
if (ret < 0) {
return ret;
}
return;
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &in_data, nullptr, s->info, y);
+ &in_data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
void RGWDeleteBucketTags::execute(optional_yield y)
{
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
return;
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &in_data, nullptr, s->info, y);
+ &in_data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
void RGWDeleteBucketReplication::execute(optional_yield y)
{
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
}
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &in_data, nullptr, s->info, y);
+ &in_data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
}
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &in_data, nullptr, s->info, y);
+ &in_data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << " forward_request_to_master returned ret=" << op_ret << dendl;
return;
}
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "NOTICE: forward_to_master failed on bucket=" << s->bucket->get_name()
<< "returned err=" << op_ret << dendl;
// apply bucket creation on the master zone first
JSONParser jp;
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &in_data, &jp, s->info, y);
+ &in_data, &jp, s->info, s->err, y);
if (op_ret < 0) {
return;
}
}
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
if (op_ret == -ENOENT) {
/* adjust error, we want to return with NoSuchBucket and not
// forward bucket acl requests to meta master zone
if ((rgw::sal::Object::empty(s->object.get()))) {
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &data, nullptr, s->info, y);
+ &data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
}
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &data, nullptr, s->info, y);
+ &data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
void RGWDeleteLC::execute(optional_yield y)
{
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
return;
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &in_data, nullptr, s->info, y);
+ &in_data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
void RGWDeleteCORS::execute(optional_yield y)
{
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
return;
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &in_data, nullptr, s->info, y);
+ &in_data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
req_info req = s->info;
forward_req_info(dpp, s->cct, req, path.bucket_name);
+ rgw_err err; // unused
ret = rgw_forward_request_to_master(dpp, *s->penv.site, s->owner.id,
- nullptr, nullptr, req, y);
+ nullptr, nullptr, req, err, y);
if (ret < 0) {
goto delop_fail;
}
forward_req_info(this, s->cct, req, bucket_name);
ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &in_data, &jp, req, y);
+ &in_data, &jp, req, s->err, y);
if (ret < 0) {
return ret;
}
}
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &data, nullptr, s->info, y);
+ &data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 20) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
void RGWDeleteBucketPolicy::execute(optional_yield y)
{
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
}
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &data, nullptr, s->info, y);
+ &data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 20) << __func__ << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
}
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &data, nullptr, s->info, y);
+ &data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
void RGWDeleteBucketPublicAccessBlock::execute(optional_yield y)
{
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
}
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- &data, nullptr, s->info, y);
+ &data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 20) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
void RGWDeleteBucketEncryption::execute(optional_yield y)
{
op_ret = rgw_forward_request_to_master(this, *s->penv.site, s->owner.id,
- nullptr, nullptr, s->info, y);
+ nullptr, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl;
return;
// master request will replicate the topic creation.
if (should_forward_request_to_master(s, driver)) {
op_ret = rgw_forward_request_to_master(
- this, *s->penv.site, s->owner.id, &bl_post_body, nullptr, s->info, y);
+ this, *s->penv.site, s->owner.id, &bl_post_body, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 4)
<< "CreateTopic forward_request_to_master returned ret = " << op_ret
void RGWPSSetTopicAttributesOp::execute(optional_yield y) {
if (should_forward_request_to_master(s, driver)) {
op_ret = rgw_forward_request_to_master(
- this, *s->penv.site, s->owner.id, &bl_post_body, nullptr, s->info, y);
+ this, *s->penv.site, s->owner.id, &bl_post_body, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 4)
<< "SetTopicAttributes forward_request_to_master returned ret = "
void RGWPSDeleteTopicOp::execute(optional_yield y) {
if (should_forward_request_to_master(s, driver)) {
op_ret = rgw_forward_request_to_master(
- this, *s->penv.site, s->owner.id, &bl_post_body, nullptr, s->info, y);
+ this, *s->penv.site, s->owner.id, &bl_post_body, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 1)
void RGWPSCreateNotifOp::execute(optional_yield y) {
if (should_forward_request_to_master(s, driver)) {
op_ret = rgw_forward_request_to_master(
- this, *s->penv.site, s->owner.id, &data, nullptr, s->info, y);
+ this, *s->penv.site, s->owner.id, &data, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 4) << "CreateBucketNotification "
"forward_request_to_master returned ret = "
if (should_forward_request_to_master(s, driver)) {
bufferlist indata;
op_ret = rgw_forward_request_to_master(
- this, *s->penv.site, s->owner.id, &indata, nullptr, s->info, y);
+ this, *s->penv.site, s->owner.id, &indata, nullptr, s->info, s->err, y);
if (op_ret < 0) {
ldpp_dout(this, 4) << "DeleteBucketNotification "
"forward_request_to_master returned error ret= "