Skip to content

Commit

Permalink
rgw: add support for max_meta_value_length of Swift API's /info.
Browse files Browse the repository at this point in the history
Fixes: http://tracker.ceph.com/issues/17936
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
  • Loading branch information
rzarzynski committed Aug 22, 2017
1 parent 64b7923 commit 06b1f25
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 16 deletions.
7 changes: 7 additions & 0 deletions src/rgw/rgw_op.h
Expand Up @@ -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. */
Expand Down
84 changes: 68 additions & 16 deletions src/rgw/rgw_rest_swift.cc
Expand Up @@ -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);
Expand Down Expand Up @@ -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()) {
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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();

Expand Down

0 comments on commit 06b1f25

Please sign in to comment.