]> 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)
committerNathan Cutler <ncutler@suse.com>
Tue, 19 Sep 2017 16:46:56 +0000 (18:46 +0200)
Fixes: http://tracker.ceph.com/issues/17934
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
(cherry picked from commit 9e53c14a3398dfe55f6b816bb57c4b1b6d01c8ec)

src/common/options.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest_swift.cc

index 08ac1d39f513c08b77392365ddf4132cfbf0c1bb..01a1d66929b185bdc96f16c8c8b9171385628d23 100644 (file)
@@ -4165,6 +4165,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 d740317b950ce93bf820d95d9f10c92e25c87525..a6dfa95f522a66639b2ef4518fe472bfd9413916 100644 (file)
@@ -1900,6 +1900,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;
@@ -1930,6 +1931,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();