]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: limit the max size of objects' ns and oid 40664/head
authorXuehan Xu <xxhdx1985126@gmail.com>
Wed, 14 Apr 2021 06:11:19 +0000 (14:11 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Fri, 23 Apr 2021 03:33:00 +0000 (11:33 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/os/seastore/onode_manager.h
src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc
src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h

index c8b95a4bd424521ef064d980f5893598661df439..5031afd33dca2d59cf235e12f0f720c5c097368b 100644 (file)
@@ -37,7 +37,8 @@ public:
     return seastar::make_ready_future<OnodeRef>();
   }
 
-  using get_or_create_onode_ertr = base_ertr;
+  using get_or_create_onode_ertr = base_ertr::extend<
+    crimson::ct_error::value_too_large>;
   using get_or_create_onode_ret = get_or_create_onode_ertr::future<
     OnodeRef>;
   virtual get_or_create_onode_ret get_or_create_onode(
@@ -46,7 +47,8 @@ public:
     return seastar::make_ready_future<OnodeRef>();
   }
 
-  using get_or_create_onodes_ertr = base_ertr;
+  using get_or_create_onodes_ertr = base_ertr::extend<
+    crimson::ct_error::value_too_large>;
   using get_or_create_onodes_ret = get_or_create_onodes_ertr::future<
     std::vector<OnodeRef>>;
   virtual get_or_create_onodes_ret get_or_create_onodes(
index 6fd7fee5fe8eeb6422284c06441ea33ae6ad9031..b75f85e02eb3063b1e414d6ab5fe4b0bc28a14f3 100644 (file)
@@ -2,6 +2,7 @@
 // vim: ts=8 sw=2 smarttab
 
 #include "crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h"
+#include "crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h"
 
 namespace {
 [[maybe_unused]] seastar::logger& logger() {
@@ -41,6 +42,10 @@ FLTreeOnodeManager::get_or_create_onode_ret
 FLTreeOnodeManager::get_or_create_onode(
   Transaction &trans,
   const ghobject_t &hoid) {
+  if (hoid.hobj.oid.name.length() + hoid.hobj.nspace.length()
+      > key_view_t::MAX_NS_OID_LENGTH) {
+    return crimson::ct_error::value_too_large::make();
+  }
   return tree.insert(
     trans, hoid,
     OnodeTree::tree_value_config_t{sizeof(onode_layout_t)}
index ff3cc305e494c9ab24bc7494719f18a2e9f8115d..d5513cdce6897deab71f84f8439ff027b1b7ba90 100644 (file)
@@ -9,6 +9,7 @@
 #include <ostream>
 
 #include "common/hobject.h"
+#include "crimson/os/seastore/onode.h"
 #include "crimson/os/seastore/onode_manager/staged-fltree/fwd.h"
 
 namespace crimson::os::seastore::onode {
@@ -555,6 +556,13 @@ inline std::ostream& operator<<(std::ostream& os, const key_hobj_t& key) {
  */
 class key_view_t {
  public:
+  //FIXME: the length of ns and oid should be defined by osd_max_object_name_len
+  //       and object_max_object_namespace_len in the future
+  static constexpr int MAX_NS_OID_LENGTH =
+    (4096 - sizeof(onode_layout_t) * 2) / 4
+    - sizeof(shard_pool_t) - sizeof(crush_t) - sizeof(snap_gen_t)
+    - 8; // size of length field of oid and ns
+
   /**
    * common interfaces as a full_key_t
    */