Skip to content

Commit

Permalink
rgw: add support for max_meta_name_length of Swift API's /info.
Browse files Browse the repository at this point in the history
Fixes: http://tracker.ceph.com/issues/17938
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
  • Loading branch information
rzarzynski committed Aug 22, 2017
1 parent 1845e41 commit 593d656
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 14 deletions.
5 changes: 4 additions & 1 deletion src/rgw/rgw_file.cc
Expand Up @@ -1452,7 +1452,10 @@ namespace rgw {
attrbl.append(val.c_str(), val.size() + 1);
}

rgw_get_request_metadata(s->cct, s->info, attrs);
op_ret = rgw_get_request_metadata(s->cct, s->info, attrs);
if (op_ret < 0) {
goto done;
}
encode_delete_at_attr(delete_at, attrs);

/* Add a custom metadata to expose the information whether an object
Expand Down
41 changes: 33 additions & 8 deletions src/rgw/rgw_op.cc
Expand Up @@ -2652,7 +2652,10 @@ void RGWCreateBucket::execute()
if (need_metadata_upload()) {
/* It's supposed that following functions WILL NOT change any special
* attributes (like RGW_ATTR_ACL) if they are already present in attrs. */
rgw_get_request_metadata(s->cct, s->info, attrs, false);
op_ret = rgw_get_request_metadata(s->cct, s->info, attrs, false);
if (op_ret < 0) {
return;
}
prepare_add_del_attrs(s->bucket_attrs, rmattr_names, attrs);
populate_with_generic_attrs(s, attrs);

Expand Down Expand Up @@ -2745,7 +2748,10 @@ void RGWCreateBucket::execute()

attrs.clear();

rgw_get_request_metadata(s->cct, s->info, attrs, false);
op_ret = rgw_get_request_metadata(s->cct, s->info, attrs, false);
if (op_ret < 0) {
return;
}
prepare_add_del_attrs(s->bucket_attrs, rmattr_names, attrs);
populate_with_generic_attrs(s, attrs);
op_ret = filter_out_quota_info(attrs, rmattr_names, s->bucket_info.quota);
Expand Down Expand Up @@ -3543,7 +3549,10 @@ void RGWPutObj::execute()
emplace_attr(RGW_ATTR_ETAG, std::move(bl));

populate_with_generic_attrs(s, attrs);
rgw_get_request_metadata(s->cct, s->info, attrs);
op_ret = rgw_get_request_metadata(s->cct, s->info, attrs);
if (op_ret < 0) {
goto done;
}
encode_delete_at_attr(delete_at, attrs);
encode_obj_tags_attr(obj_tags.get(), attrs);

Expand Down Expand Up @@ -3857,7 +3866,10 @@ int RGWPutMetadataAccount::init_processing()
attrs.emplace(RGW_ATTR_ACL, std::move(acl_bl));
}

rgw_get_request_metadata(s->cct, s->info, attrs, false);
op_ret = rgw_get_request_metadata(s->cct, s->info, attrs, false);
if (op_ret < 0) {
return op_ret;
}
prepare_add_del_attrs(orig_attrs, rmattr_names, attrs);
populate_with_generic_attrs(s, attrs);

Expand Down Expand Up @@ -3949,7 +3961,10 @@ void RGWPutMetadataBucket::execute()
return;
}

rgw_get_request_metadata(s->cct, s->info, attrs, false);
op_ret = rgw_get_request_metadata(s->cct, s->info, attrs, false);
if (op_ret < 0) {
return;
}

if (!placement_rule.empty() &&
placement_rule != s->bucket_info.placement_rule) {
Expand Down Expand Up @@ -4036,7 +4051,11 @@ void RGWPutMetadataObject::execute()
return;
}

rgw_get_request_metadata(s->cct, s->info, attrs);
op_ret = rgw_get_request_metadata(s->cct, s->info, attrs);
if (op_ret < 0) {
return;
}

/* check if obj exists, read orig attrs */
op_ret = get_obj_attrs(store, s, obj, orig_attrs);
if (op_ret < 0) {
Expand Down Expand Up @@ -4410,7 +4429,10 @@ int RGWCopyObj::init_common()
dest_policy.encode(aclbl);
emplace_attr(RGW_ATTR_ACL, std::move(aclbl));

rgw_get_request_metadata(s->cct, s->info, attrs);
op_ret = rgw_get_request_metadata(s->cct, s->info, attrs);
if (op_ret < 0) {
return op_ret;
}
populate_with_generic_attrs(s, attrs);

return 0;
Expand Down Expand Up @@ -5114,7 +5136,10 @@ void RGWInitMultipart::execute()
if (op_ret != 0)
return;

rgw_get_request_metadata(s->cct, s->info, attrs);
op_ret = rgw_get_request_metadata(s->cct, s->info, attrs);
if (op_ret < 0) {
return;
}

do {
char buf[33];
Expand Down
22 changes: 18 additions & 4 deletions src/rgw/rgw_op.h
Expand Up @@ -1884,12 +1884,14 @@ static inline void format_xattr(std::string &xattr)
* map(<attr_name, attr_contents>, where attr_name is RGW_ATTR_PREFIX.HTTP_NAME)
* s: The request state
* attrs: will be filled up with attrs mapped as <attr_name, attr_contents>
* On success returns 0.
* On failure returns a negative error code.
*
*/
static inline void rgw_get_request_metadata(CephContext *cct,
struct req_info& info,
map<string, bufferlist>& attrs,
const bool allow_empty_attrs = true)
static inline int rgw_get_request_metadata(CephContext* const cct,
struct req_info& info,
std::map<std::string, ceph::bufferlist>& attrs,
const bool allow_empty_attrs = true)
{
static const std::set<std::string> blacklisted_headers = {
"x-amz-server-side-encryption-customer-algorithm",
Expand All @@ -1909,13 +1911,25 @@ static inline void rgw_get_request_metadata(CephContext *cct,
format_xattr(xattr);
string attr_name(RGW_ATTR_PREFIX);
attr_name.append(name);

/* Check early whether we aren't going behind the limit on attribute
* name. Passing here doesn't guarantee that an OSD will accept that
* as ObjectStore::get_max_attr_name_length() can set the limit even
* lower. However, we're claiming "max_meta_name_length" in /info as
* being dependent on the "osd_max_attr_name_len". */
if (attr_name.length() > cct->_conf->osd_max_attr_name_len) {
return -ENAMETOOLONG;
}

map<string, bufferlist>::value_type v(attr_name, bufferlist());
std::pair < map<string, bufferlist>::iterator, bool >
rval(attrs.insert(v));
bufferlist& bl(rval.first->second);
bl.append(xattr.c_str(), xattr.size() + 1);
}
}

return 0;
} /* rgw_get_request_metadata */

static inline void encode_delete_at_attr(boost::optional<ceph::real_time> delete_at,
Expand Down
5 changes: 4 additions & 1 deletion src/rgw/rgw_rest_swift.cc
Expand Up @@ -1661,7 +1661,10 @@ void RGWInfo_ObjStore_SWIFT::list_swift_data(Formatter& formatter,

string ceph_version(CEPH_GIT_NICE_VER);
formatter.dump_string("version", ceph_version);
formatter.dump_int("max_meta_name_length", 81);

const size_t meta_name_limit = g_conf->osd_max_attr_name_len
- strlen(RGW_ATTR_PREFIX RGW_AMZ_META_PREFIX);
formatter.dump_int("max_meta_name_length", meta_name_limit);

formatter.open_array_section("policies");
RGWZoneGroup& zonegroup = store.get_zonegroup();
Expand Down

0 comments on commit 593d656

Please sign in to comment.