]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/collection_manager: fill CollectionNode::decoded on 52221/head
authorXuehan Xu <xuxuehan@qianxin.com>
Wed, 28 Jun 2023 07:18:27 +0000 (15:18 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Tue, 18 Jul 2023 09:09:09 +0000 (17:09 +0800)
clean reads

Otherwise, deltas of collection nodes can't be replayed correctly,
because the data of nodes is not loaded to CollectionNode::decoded

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/collection_manager/collection_flat_node.cc
src/crimson/os/seastore/collection_manager/collection_flat_node.h
src/crimson/os/seastore/collection_manager/flat_collection_manager.cc

index 9eaeefc72a67108200b8bcceca35096733a4104a..ed17e2b12ef7efbebbf04936e1322cdb5908985a 100644 (file)
@@ -46,7 +46,6 @@ std::ostream &CollectionNode::print_detail_l(std::ostream &out) const
 CollectionNode::list_ret
 CollectionNode::list()
 {
-  read_to_local();
   logger().debug("CollectionNode:{}, {}", __func__, *this);
   CollectionManager::list_ret_bare list_result;
   for (auto &[coll, bits] : decoded) {
@@ -60,7 +59,6 @@ CollectionNode::list()
 CollectionNode::create_ret
 CollectionNode::create(coll_context_t cc, coll_t coll, unsigned bits)
 {
-  read_to_local();
   logger().debug("CollectionNode:{}", __func__);
   if (!is_mutable()) {
     auto mut = cc.tm.get_mutable_extent(cc.t, this)->cast<CollectionNode>();
@@ -88,8 +86,8 @@ CollectionNode::create(coll_context_t cc, coll_t coll, unsigned bits)
 CollectionNode::update_ret
 CollectionNode::update(coll_context_t cc, coll_t coll, unsigned bits)
 {
-  read_to_local();
-  logger().debug("CollectionNode:{}", __func__);
+  logger().debug("trans.{} CollectionNode:{} {} {}",
+    cc.t.get_trans_id(), __func__, coll, bits);
   if (!is_mutable()) {
     auto mut = cc.tm.get_mutable_extent(cc.t, this)->cast<CollectionNode>();
     return mut->update(cc, coll, bits);
@@ -105,8 +103,8 @@ CollectionNode::update(coll_context_t cc, coll_t coll, unsigned bits)
 CollectionNode::remove_ret
 CollectionNode::remove(coll_context_t cc, coll_t coll)
 {
-  read_to_local();
-  logger().debug("CollectionNode:{}", __func__);
+  logger().debug("trans.{} CollectionNode:{} {}",
+    cc.t.get_trans_id(),__func__, coll);
   if (!is_mutable()) {
     auto mut = cc.tm.get_mutable_extent(cc.t, this)->cast<CollectionNode>();
     return mut->remove(cc, coll);
index 1652eb92f227ba3f7e3d0cd344df488638cc8eea..2690fb5fdf464bd64a48cb7935a8bb58367f255d 100644 (file)
@@ -94,11 +94,11 @@ struct CollectionNode
   : LogicalCachedExtent {
   using CollectionNodeRef = TCachedExtentRef<CollectionNode>;
 
-  bool loaded = false;
-
-  template <typename... T>
-  CollectionNode(T&&... t)
-    : LogicalCachedExtent(std::forward<T>(t)...) {}
+  explicit CollectionNode(ceph::bufferptr &&ptr)
+    : LogicalCachedExtent(std::move(ptr)) {}
+  explicit CollectionNode(const CollectionNode &other)
+    : LogicalCachedExtent(other),
+      decoded(other.decoded) {}
 
   static constexpr extent_types_t type = extent_types_t::COLL_BLOCK;
 
@@ -134,13 +134,11 @@ struct CollectionNode
   using update_ret = CollectionManager::update_ret;
   update_ret update(coll_context_t cc, coll_t coll, unsigned bits);
 
-  void read_to_local() {
-    if (loaded) return;
+  void on_clean_read() final {
     bufferlist bl;
     bl.append(get_bptr());
     auto iter = bl.cbegin();
     decode((base_coll_map_t&)decoded, iter);
-    loaded = true;
   }
 
   void copy_to_node() {
index 15ce920ec0a6eff361e51185aab0706349878a0b..decb095f6f98b711ba5f77fe6fdb84232ad671e4 100644 (file)
@@ -80,7 +80,6 @@ FlatCollectionManager::create(coll_root_t &coll_root, Transaction &t,
           coll_root.update(root_extent->get_laddr(), root_extent->get_length());
 
          root_extent->decoded = extent->decoded;
-         root_extent->loaded = true;
          return root_extent->create(
            get_coll_context(t), cid, info.split_bits
          ).si_then([=, this, &t](auto result) {