From 7f2a9ed7a986145d4b34517a1a1bb44799ebf621 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 10 Mar 2015 19:36:59 +0100 Subject: [PATCH] rgw: fix handling empty metadata items on Swift container. Fixes: #11088 Backport: hammer Signed-off-by: Radoslaw Zarzynski (cherry picked from commit 1660d8625212f7b5fb30568ed640f467297e36cb) --- src/rgw/rgw_op.cc | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 3ec8dbae08260..82e79e63f01cf 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -146,20 +146,26 @@ static void format_xattr(std::string &xattr) * attrs: will be filled up with attrs mapped as * */ -static void rgw_get_request_metadata(CephContext *cct, struct req_info& info, map& attrs) +static void rgw_get_request_metadata(CephContext *cct, + struct req_info& info, + map& attrs, + const bool allow_empty_attrs = true) { map::iterator iter; for (iter = info.x_meta_map.begin(); iter != info.x_meta_map.end(); ++iter) { const string &name(iter->first); string &xattr(iter->second); - ldout(cct, 10) << "x>> " << name << ":" << xattr << dendl; - format_xattr(xattr); - string attr_name(RGW_ATTR_PREFIX); - attr_name.append(name); - map::value_type v(attr_name, bufferlist()); - std::pair < map::iterator, bool > rval(attrs.insert(v)); - bufferlist& bl(rval.first->second); - bl.append(xattr.c_str(), xattr.size() + 1); + + if (allow_empty_attrs || !xattr.empty()) { + ldout(cct, 10) << "x>> " << name << ":" << xattr << dendl; + format_xattr(xattr); + string attr_name(RGW_ATTR_PREFIX); + attr_name.append(name); + map::value_type v(attr_name, bufferlist()); + std::pair < map::iterator, bool > rval(attrs.insert(v)); + bufferlist& bl(rval.first->second); + bl.append(xattr.c_str(), xattr.size() + 1); + } } } @@ -2036,12 +2042,11 @@ void RGWPutMetadata::execute() if (ret < 0) return; - rgw_get_request_metadata(s->cct, s->info, attrs); - RGWObjVersionTracker *ptracker = NULL; - bool is_object_op = (!s->object.empty()); + rgw_get_request_metadata(s->cct, s->info, attrs, is_object_op); + if (is_object_op) { /* check if obj exists, read orig attrs */ ret = get_obj_attrs(store, s, obj, orig_attrs); -- 2.39.5