From: Radoslaw Zarzynski Date: Mon, 29 May 2017 16:02:23 +0000 (+0200) Subject: rgw: add support for max_meta_value_length of Swift API's /info. X-Git-Tag: v13.0.1~865^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=06b1f25021924e0c55da0bc22216f31344735dfe;p=ceph.git rgw: add support for max_meta_value_length of Swift API's /info. Fixes: http://tracker.ceph.com/issues/17936 Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 5621279676c..1d34ad9f517 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -1922,6 +1922,13 @@ static inline int rgw_get_request_metadata(CephContext* const cct, return -ENAMETOOLONG; } + /* Similar remarks apply to the check for value size. We're veryfing + * it early at the RGW's side as it's being claimed in /info. */ + if (cct->_conf->osd_max_attr_size && + xattr.length() > cct->_conf->osd_max_attr_size) { + return -EFBIG; + } + auto rval = attrs.emplace(std::move(attr_name), ceph::bufferlist()); /* At the moment the value of the freshly created attribute key-value * pair is an empty bufferlist. */ diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 68bc2053ceb..64b932a6527 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -647,13 +647,35 @@ int RGWCreateBucket_ObjStore_SWIFT::get_params() return get_swift_versioning_settings(s, swift_ver_location); } +static inline int handle_metadata_errors(req_state* const s, const int op_ret) +{ + if (op_ret == -EFBIG) { + /* Handle the custom error message of exceeding maximum custom attribute + * (stored as xattr) size. */ + const auto error_message = boost::str( + boost::format("Metadata value longer than %lld") + % int(s->cct->_conf->osd_max_attr_size)); + set_req_state_err(s, EINVAL, error_message); + return -EINVAL; + } + + return op_ret; +} + void RGWCreateBucket_ObjStore_SWIFT::send_response() { - if (! op_ret) - op_ret = STATUS_CREATED; - else if (op_ret == -ERR_BUCKET_EXISTS) - op_ret = STATUS_ACCEPTED; - set_req_state_err(s, op_ret); + const auto meta_ret = handle_metadata_errors(s, op_ret); + if (meta_ret != op_ret) { + op_ret = meta_ret; + } else { + if (!op_ret) { + op_ret = STATUS_CREATED; + } else if (op_ret == -ERR_BUCKET_EXISTS) { + op_ret = STATUS_ACCEPTED; + } + set_req_state_err(s, op_ret); + } + dump_errno(s); /* Propose ending HTTP header with 0 Content-Length header. */ end_header(s, NULL, NULL, 0); @@ -820,8 +842,14 @@ int RGWPutObj_ObjStore_SWIFT::get_params() void RGWPutObj_ObjStore_SWIFT::send_response() { - if (! op_ret) { - op_ret = STATUS_CREATED; + const auto meta_ret = handle_metadata_errors(s, op_ret); + if (meta_ret) { + op_ret = meta_ret; + } else { + if (!op_ret) { + op_ret = STATUS_CREATED; + } + set_req_state_err(s, op_ret); } if (! lo_etag.empty()) { @@ -893,10 +921,16 @@ int RGWPutMetadataAccount_ObjStore_SWIFT::get_params() void RGWPutMetadataAccount_ObjStore_SWIFT::send_response() { - if (! op_ret) { - op_ret = STATUS_NO_CONTENT; + const auto meta_ret = handle_metadata_errors(s, op_ret); + if (meta_ret != op_ret) { + op_ret = meta_ret; + } else { + if (!op_ret) { + op_ret = STATUS_NO_CONTENT; + } + set_req_state_err(s, op_ret); } - set_req_state_err(s, op_ret); + dump_errno(s); end_header(s, this); rgw_flush_formatter_and_reset(s, s->formatter); @@ -923,10 +957,16 @@ int RGWPutMetadataBucket_ObjStore_SWIFT::get_params() void RGWPutMetadataBucket_ObjStore_SWIFT::send_response() { - if (!op_ret && (op_ret != -EINVAL)) { - op_ret = STATUS_NO_CONTENT; + const auto meta_ret = handle_metadata_errors(s, op_ret); + if (meta_ret != op_ret) { + op_ret = meta_ret; + } else { + if (!op_ret && (op_ret != -EINVAL)) { + op_ret = STATUS_NO_CONTENT; + } + set_req_state_err(s, op_ret); } - set_req_state_err(s, op_ret); + dump_errno(s); end_header(s, this); rgw_flush_formatter_and_reset(s, s->formatter); @@ -953,13 +993,20 @@ int RGWPutMetadataObject_ObjStore_SWIFT::get_params() void RGWPutMetadataObject_ObjStore_SWIFT::send_response() { - if (! op_ret) { - op_ret = STATUS_ACCEPTED; + const auto meta_ret = handle_metadata_errors(s, op_ret); + if (meta_ret != op_ret) { + op_ret = meta_ret; + } else { + if (!op_ret) { + op_ret = STATUS_ACCEPTED; + } + set_req_state_err(s, op_ret); } - set_req_state_err(s, op_ret); + if (!s->is_err()) { dump_content_length(s, 0); } + dump_errno(s); end_header(s, this); rgw_flush_formatter_and_reset(s, s->formatter); @@ -1666,6 +1713,11 @@ void RGWInfo_ObjStore_SWIFT::list_swift_data(Formatter& formatter, - strlen(RGW_ATTR_PREFIX RGW_AMZ_META_PREFIX); formatter.dump_int("max_meta_name_length", meta_name_limit); + const size_t meta_value_limit = g_conf->osd_max_attr_size; + if (meta_value_limit) { + formatter.dump_int("max_meta_value_length", meta_value_limit); + } + formatter.open_array_section("policies"); RGWZoneGroup& zonegroup = store.get_zonegroup();