]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: add support for max_meta_count of Swift API's /info.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Tue, 30 May 2017 14:36:06 +0000 (16:36 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Sun, 27 Aug 2017 21:29:33 +0000 (23:29 +0200)
Fixes: http://tracker.ceph.com/issues/17934
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/common/options.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest_swift.cc

index e44d6b974e6479cc575e17e1bc9e4062b8beef59..318597e4432a84634eeb6f3fcab20fb7cae83210 100644 (file)
@@ -4163,6 +4163,10 @@ std::vector<Option> get_rgw_options() {
     .set_default(1 * 1024 * 1024)
     .set_description(""),
 
+    Option("rgw_max_attrs_num_in_req", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
+    .set_default(0)
+    .set_description("The maximum number of metadata items that can be put via single request"),
+
     Option("rgw_override_bucket_index_max_shards", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
     .set_default(0)
     .set_description(""),
index 1d34ad9f517f34c2c16bfbdb4c94d2345ec0defe..38990bbce2c030f067a82c1d981e7d68ceb9aa34 100644 (file)
@@ -1899,6 +1899,7 @@ static inline int rgw_get_request_metadata(CephContext* const cct,
       "x-amz-server-side-encryption-customer-key-md5"
   };
 
+  size_t valid_meta_count = 0;
   for (auto& kv : info.x_meta_map) {
     const std::string& name = kv.first;
     std::string& xattr = kv.second;
@@ -1929,6 +1930,15 @@ static inline int rgw_get_request_metadata(CephContext* const cct,
         return -EFBIG;
       }
 
+      /* Swift allows administrators to limit the number of metadats items
+       * send _in a single request_. */
+      const auto rgw_max_attrs_num_in_req = \
+        cct->_conf->get_val<size_t>("rgw_max_attrs_num_in_req");
+      if (rgw_max_attrs_num_in_req &&
+          ++valid_meta_count > rgw_max_attrs_num_in_req) {
+        return -E2BIG;
+      }
+
       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. */
index 64b932a65277afd5af790302dc89e11110d4f44a..5b1b1a8cfaefe464e637149db7de2c8988cf2a69 100644 (file)
@@ -657,6 +657,12 @@ static inline int handle_metadata_errors(req_state* const s, const int op_ret)
         % int(s->cct->_conf->osd_max_attr_size));
     set_req_state_err(s, EINVAL, error_message);
     return -EINVAL;
+  } else if (op_ret == -E2BIG) {
+    const auto error_message = boost::str(
+      boost::format("Too many metadata items; max %lld")
+        % s->cct->_conf->get_val<size_t>("rgw_max_attrs_num_in_req"));
+    set_req_state_err(s, EINVAL, error_message);
+    return -EINVAL;
   }
 
   return op_ret;
@@ -1718,6 +1724,12 @@ void RGWInfo_ObjStore_SWIFT::list_swift_data(Formatter& formatter,
     formatter.dump_int("max_meta_value_length", meta_value_limit);
   }
 
+  const size_t meta_num_limit = \
+    g_conf->get_val<size_t>("rgw_max_attrs_num_in_req");
+  if (meta_num_limit) {
+    formatter.dump_int("max_meta_count", meta_num_limit);
+  }
+
   formatter.open_array_section("policies");
   RGWZoneGroup& zonegroup = store.get_zonegroup();