From 50d1afd7a2b588e0b1797031af7bcf241830c5fb Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Wed, 2 Jun 2021 13:18:48 +0800 Subject: [PATCH] crimson/onode-staged-tree: implement size upper-bounds to value Signed-off-by: Yingxin Cheng --- .../onode_manager/staged-fltree/fltree_onode_manager.h | 3 ++- .../os/seastore/onode_manager/staged-fltree/tree.h | 6 ++++++ .../os/seastore/onode_manager/staged-fltree/value.cc | 4 +++- .../os/seastore/onode_manager/staged-fltree/value.h | 5 +++++ src/test/crimson/seastore/onode_tree/test_value.h | 10 ++++++---- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h index a1f73e4a71168..d075364af1993 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h @@ -13,7 +13,8 @@ struct FLTreeOnode final : Onode, Value { static constexpr tree_conf_t TREE_CONF = { value_magic_t::ONODE, 128, // max_ns_size - 320 // max_oid_size + 320, // max_oid_size + 1200 // max_value_payload_size }; enum class status_t { diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/tree.h b/src/crimson/os/seastore/onode_manager/staged-fltree/tree.h index 7fa41b03df6b6..c1568461d4b43 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/tree.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/tree.h @@ -246,6 +246,12 @@ class Btree { crimson::ct_error::value_too_large>; insert_ertr::future> insert(Transaction& t, const ghobject_t& obj, tree_value_config_t _vconf) { + LOG_PREFIX(OTree::insert); + if (_vconf.payload_size > value_builder.get_max_value_payload_size()) { + ERRORT("value payload size {} too large to insert {}", + t, _vconf.payload_size, key_hobj_t{obj}); + return crimson::ct_error::value_too_large::make(); + } if (obj.hobj.nspace.size() > value_builder.get_max_ns_size()) { ERRORT("namespace size {} too large to insert {}", t, obj.hobj.nspace.size(), key_hobj_t{obj}); diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/value.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/value.cc index 03e3f8792b3cf..a61436a521350 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/value.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/value.cc @@ -71,7 +71,9 @@ eagain_future<> Value::trim(Transaction& t, value_size_t trim_size) const value_header_t* Value::read_value_header() const { - return p_cursor->read_value_header(vb.get_header_magic()); + auto ret = p_cursor->read_value_header(vb.get_header_magic()); + assert(ret->payload_size <= vb.get_max_value_payload_size()); + return ret; } std::pair diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/value.h b/src/crimson/os/seastore/onode_manager/staged-fltree/value.h index 2a0ef8a43e870..1833d4b2b2dc8 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/value.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/value.h @@ -159,6 +159,7 @@ struct tree_conf_t { value_magic_t value_magic; string_size_t max_ns_size; string_size_t max_oid_size; + value_size_t max_value_payload_size; }; class tree_cursor_t; @@ -256,6 +257,7 @@ struct ValueBuilder { virtual value_magic_t get_header_magic() const = 0; virtual string_size_t get_max_ns_size() const = 0; virtual string_size_t get_max_oid_size() const = 0; + virtual value_size_t get_max_value_payload_size() const = 0; virtual std::unique_ptr build_value_recorder(ceph::bufferlist&) const = 0; }; @@ -280,6 +282,9 @@ struct ValueBuilderImpl final : public ValueBuilder { string_size_t get_max_oid_size() const override { return ValueImpl::TREE_CONF.max_oid_size; } + value_size_t get_max_value_payload_size() const override { + return ValueImpl::TREE_CONF.max_value_payload_size; + } std::unique_ptr build_value_recorder(ceph::bufferlist& encoded) const override { diff --git a/src/test/crimson/seastore/onode_tree/test_value.h b/src/test/crimson/seastore/onode_tree/test_value.h index 6501047e67162..fec4c54c85187 100644 --- a/src/test/crimson/seastore/onode_tree/test_value.h +++ b/src/test/crimson/seastore/onode_tree/test_value.h @@ -38,13 +38,15 @@ inline std::ostream& operator<<(std::ostream& os, const test_item_t& item) { template + string_size_t MAX_OID_SIZE, + value_size_t MAX_VALUE_PAYLOAD_SIZE> class TestValue final : public Value { public: static constexpr tree_conf_t TREE_CONF = { MAGIC, MAX_NS_SIZE, - MAX_OID_SIZE + MAX_OID_SIZE, + MAX_VALUE_PAYLOAD_SIZE }; using id_t = test_item_t::id_t; @@ -195,8 +197,8 @@ class TestValue final : public Value { }; using UnboundedValue = TestValue< - value_magic_t::TEST_UNBOUND, 4096, 4096>; + value_magic_t::TEST_UNBOUND, 4096, 4096, 4096>; using BoundedValue = TestValue< - value_magic_t::TEST_BOUNDED, 320, 320>; + value_magic_t::TEST_BOUNDED, 320, 320, 640>; } -- 2.39.5