]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix handling empty metadata items on Swift container. 4580/head
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Tue, 10 Mar 2015 18:36:59 +0000 (19:36 +0100)
committerLoic Dachary <ldachary@redhat.com>
Wed, 6 May 2015 12:13:40 +0000 (14:13 +0200)
Fixes: #11088
Backport: hammer
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
(cherry picked from commit 1660d8625212f7b5fb30568ed640f467297e36cb)

src/rgw/rgw_op.cc

index 3ec8dbae08260e10bf81cd5730223946ba3cd484..82e79e63f01cf8e00388b80af9ae2e6de17ebd4d 100644 (file)
@@ -146,20 +146,26 @@ static void format_xattr(std::string &xattr)
  * attrs: will be filled up with attrs mapped as <attr_name, attr_contents>
  *
  */
-static void rgw_get_request_metadata(CephContext *cct, struct req_info& info, map<string, bufferlist>& attrs)
+static void rgw_get_request_metadata(CephContext *cct,
+                                     struct req_info& info,
+                                     map<string, bufferlist>& attrs,
+                                     const bool allow_empty_attrs = true)
 {
   map<string, string>::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<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);
+
+    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<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);
+    }
   }
 }
 
@@ -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);