]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/onode_manager: populate delta recorders for each
authorXuehan Xu <xuxuehan@qianxin.com>
Wed, 27 Sep 2023 09:13:44 +0000 (17:13 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Sun, 8 Oct 2023 09:09:51 +0000 (17:09 +0800)
onode modification

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/object_data_handler.cc
src/crimson/os/seastore/onode.h
src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc
src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/seastore.h
src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc
src/test/crimson/seastore/test_object_data_handler.cc

index 0d852696b7144a6a5e3068d1f45e991159409b1f..025f91993efaf8967de3035401bb607080792af1 100644 (file)
@@ -888,7 +888,7 @@ auto with_object_data(
       return std::invoke(f, object_data
       ).si_then([ctx, &object_data] {
        if (object_data.must_update()) {
-         ctx.onode.get_mutable_layout(ctx.t).object_data.update(object_data);
+         ctx.onode.update_object_data(ctx.t, object_data);
        }
        return seastar::now();
       });
@@ -909,11 +909,10 @@ auto with_objects_data(
       return std::invoke(f, object_data, d_object_data
       ).si_then([ctx, &object_data, &d_object_data] {
        if (object_data.must_update()) {
-         ctx.onode.get_mutable_layout(ctx.t).object_data.update(object_data);
+         ctx.onode.update_object_data(ctx.t, object_data);
        }
        if (d_object_data.must_update()) {
-         ctx.d_onode->get_mutable_layout(
-           ctx.t).object_data.update(d_object_data);
+         ctx.d_onode->update_object_data(ctx.t, d_object_data);
        }
        return seastar::now();
       });
index 069daa3df5b56ba231128a728f152fa177908664..e803a2e4e74fc13e258c6184e0c6767db0c15eff 100644 (file)
@@ -64,9 +64,17 @@ public:
 
   virtual bool is_alive() const = 0;
   virtual const onode_layout_t &get_layout() const = 0;
-  virtual onode_layout_t &get_mutable_layout(Transaction &t) = 0;
   virtual ~Onode() = default;
 
+  virtual void update_onode_size(Transaction&, uint32_t) = 0;
+  virtual void update_omap_root(Transaction&, omap_root_t&) = 0;
+  virtual void update_xattr_root(Transaction&, omap_root_t&) = 0;
+  virtual void update_object_data(Transaction&, object_data_t&) = 0;
+  virtual void update_object_info(Transaction&, ceph::bufferlist&) = 0;
+  virtual void update_snapset(Transaction&, ceph::bufferlist&) = 0;
+  virtual void clear_object_info(Transaction&) = 0;
+  virtual void clear_snapset(Transaction&) = 0;
+
   laddr_t get_metadata_hint(uint64_t block_size) const {
     assert(default_metadata_offset);
     assert(default_metadata_range);
index bff27ab65178652c427f89a60584e4d1352ad7ce..a1f593889d523c1d817ea4a6d0ce417843e70ac6 100644 (file)
@@ -51,17 +51,17 @@ FLTreeOnodeManager::get_or_create_onode(
   ).si_then([this, &trans, &hoid, FNAME](auto p)
               -> get_or_create_onode_ret {
     auto [cursor, created] = std::move(p);
-    auto val = OnodeRef(new FLTreeOnode(
+    auto onode = new FLTreeOnode(
        default_data_reservation,
        default_metadata_range,
-       cursor.value()));
+       cursor.value());
     if (created) {
       DEBUGT("created onode for entry for {}", trans, hoid);
-      val->get_mutable_layout(trans) = onode_layout_t{};
+      onode->with_mutable_layout(trans, [](onode_layout_t &mlayout) {
+       mlayout = onode_layout_t{};
+      });
     }
-    return get_or_create_onode_iertr::make_ready_future<OnodeRef>(
-      val
-    );
+    return get_or_create_onode_iertr::make_ready_future<OnodeRef>(onode);
   });
 }
 
index 09998fbfaea9f04da2deb73a5f2c4d189829b655..619609419ad8e0812e22674899a5649f583b7b14 100644 (file)
@@ -78,14 +78,16 @@ struct FLTreeOnode final : Onode, Value {
     return *read_payload<onode_layout_t>();
   }
 
-  onode_layout_t &get_mutable_layout(Transaction &t) final {
+  template <typename Func>
+  void with_mutable_layout(Transaction &t, Func&& f) {
     assert(status != status_t::DELETED);
     auto p = prepare_mutate_payload<
       onode_layout_t,
       Recorder>(t);
     status = status_t::MUTATED;
-    return *reinterpret_cast<onode_layout_t*>(p.first.get_write());
-  };
+    f(*reinterpret_cast<onode_layout_t*>(p.first.get_write()));
+    populate_recorder(t);
+  }
 
   void populate_recorder(Transaction &t) {
     assert(status == status_t::MUTATED);
@@ -99,6 +101,66 @@ struct FLTreeOnode final : Onode, Value {
     status = status_t::STABLE;
   }
 
+  void update_onode_size(Transaction &t, uint32_t size) final {
+    with_mutable_layout(t, [size](onode_layout_t &mlayout) {
+      mlayout.size = size;
+    });
+  }
+
+  void update_omap_root(Transaction &t, omap_root_t &oroot) final {
+    with_mutable_layout(t, [&oroot](onode_layout_t &mlayout) {
+      mlayout.omap_root.update(oroot);
+    });
+  }
+
+  void update_xattr_root(Transaction &t, omap_root_t &xroot) final {
+    with_mutable_layout(t, [&xroot](onode_layout_t &mlayout) {
+      mlayout.xattr_root.update(xroot);
+    });
+  }
+
+  void update_object_data(Transaction &t, object_data_t &odata) final {
+    with_mutable_layout(t, [&odata](onode_layout_t &mlayout) {
+      mlayout.object_data.update(odata);
+    });
+  }
+
+  void update_object_info(Transaction &t, ceph::bufferlist &oi_bl) final {
+    with_mutable_layout(t, [&oi_bl](onode_layout_t &mlayout) {
+      maybe_inline_memcpy(
+       &mlayout.oi[0],
+       oi_bl.c_str(),
+       oi_bl.length(),
+       onode_layout_t::MAX_OI_LENGTH);
+      mlayout.oi_size = oi_bl.length();
+    });
+  }
+
+  void clear_object_info(Transaction &t) final {
+    with_mutable_layout(t, [](onode_layout_t &mlayout) {
+      memset(&mlayout.oi[0], 0, mlayout.oi_size);
+      mlayout.oi_size = 0;
+    });
+  }
+
+  void update_snapset(Transaction &t, ceph::bufferlist &ss_bl) final {
+    with_mutable_layout(t, [&ss_bl](onode_layout_t &mlayout) {
+      maybe_inline_memcpy(
+       &mlayout.ss[0],
+       ss_bl.c_str(),
+       ss_bl.length(),
+       onode_layout_t::MAX_OI_LENGTH);
+      mlayout.ss_size = ss_bl.length();
+    });
+  }
+
+  void clear_snapset(Transaction &t) final {
+    with_mutable_layout(t, [](onode_layout_t &mlayout) {
+      memset(&mlayout.ss[0], 0, mlayout.ss_size);
+      mlayout.ss_size = 0;
+    });
+  }
+
   void mark_delete() {
     assert(status != status_t::DELETED);
     status = status_t::DELETED;
index 897a063e0fe6369bf1186c6e65f253276acae07c..edbc9a0115ecb3269e0a8a65eee5be885c70b714 100644 (file)
@@ -1529,10 +1529,10 @@ SeaStore::Shard::_write(
   LOG_PREFIX(SeaStore::_write);
   DEBUGT("onode={} {}~{}", *ctx.transaction, *onode, offset, len);
   {
-    auto &object_size = onode->get_mutable_layout(*ctx.transaction).size;
-    object_size = std::max<uint64_t>(
-      offset + len,
-      object_size);
+    const auto &object_size = onode->get_layout().size;
+    onode->update_onode_size(
+      *ctx.transaction,
+      std::max<uint64_t>(offset + len, object_size));
   }
   return seastar::do_with(
     std::move(_bl),
@@ -1563,8 +1563,7 @@ SeaStore::Shard::_clone(
     //TODO: currently, we only care about object data, leaving cloning
     //      of xattr/omap for future work
     auto &object_size = onode->get_layout().size;
-    auto &d_object_size = d_onode->get_mutable_layout(*ctx.transaction).size;
-    d_object_size = object_size;
+    d_onode->update_onode_size(*ctx.transaction, object_size);
     return objHandler.clone(
       ObjectDataHandler::context_t{
        *transaction_manager,
@@ -1586,8 +1585,10 @@ SeaStore::Shard::_zero(
   if (offset + len >= max_object_size) {
     return crimson::ct_error::input_output_error::make();
   }
-  auto &object_size = onode->get_mutable_layout(*ctx.transaction).size;
-  object_size = std::max<uint64_t>(offset + len, object_size);
+  const auto &object_size = onode->get_layout().size;
+  onode->update_onode_size(
+    *ctx.transaction,
+    std::max<uint64_t>(offset + len, object_size));
   return seastar::do_with(
     ObjectDataHandler(max_object_size),
     [=, this, &ctx, &onode](auto &objhandler) {
@@ -1607,7 +1608,6 @@ SeaStore::Shard::_omap_set_kvs(
   OnodeRef &onode,
   const omap_root_le_t& omap_root,
   Transaction& t,
-  omap_root_le_t& mutable_omap_root,
   std::map<std::string, ceph::bufferlist>&& kvs)
 {
   return seastar::do_with(
@@ -1627,10 +1627,6 @@ SeaStore::Shard::_omap_set_kvs(
           return omap_manager.omap_set_keys(root, t, std::move(keys));
       }).si_then([&] {
         return tm_iertr::make_ready_future<omap_root_t>(std::move(root));
-      }).si_then([&mutable_omap_root](auto root) {
-        if (root.must_update()) {
-          mutable_omap_root.update(root);
-        }
       });
     }
   );
@@ -1648,8 +1644,12 @@ SeaStore::Shard::_omap_set_values(
     onode,
     onode->get_layout().omap_root,
     *ctx.transaction,
-    onode->get_mutable_layout(*ctx.transaction).omap_root,
-    std::move(aset));
+    std::move(aset)
+  ).si_then([onode, &ctx](auto root) {
+    if (root.must_update()) {
+      onode->update_omap_root(*ctx.transaction, root);
+    }
+  });
 }
 
 SeaStore::Shard::tm_ret
@@ -1691,8 +1691,7 @@ SeaStore::Shard::_omap_clear(
           *ctx.transaction)
         .si_then([&] {
           if (omap_root.must_update()) {
-            onode->get_mutable_layout(*ctx.transaction
-            ).omap_root.update(omap_root);
+           onode->update_omap_root(*ctx.transaction, omap_root);
           }
         });
       });
@@ -1733,8 +1732,7 @@ SeaStore::Shard::_omap_rmkeys(
             }
           ).si_then([&] {
             if (omap_root.must_update()) {
-              onode->get_mutable_layout(*ctx.transaction
-              ).omap_root.update(omap_root);
+             onode->update_omap_root(*ctx.transaction, omap_root);
             }
           });
       }
@@ -1782,8 +1780,7 @@ SeaStore::Shard::_omap_rmkeyrange(
        config
       ).si_then([&] {
         if (omap_root.must_update()) {
-          onode->get_mutable_layout(*ctx.transaction
-          ).omap_root.update(omap_root);
+         onode->update_omap_root(*ctx.transaction, omap_root);
         }
       });
     });
@@ -1798,7 +1795,7 @@ SeaStore::Shard::_truncate(
 {
   LOG_PREFIX(SeaStore::_truncate);
   DEBUGT("onode={} size={}", *ctx.transaction, *onode, size);
-  onode->get_mutable_layout(*ctx.transaction).size = size;
+  onode->update_onode_size(*ctx.transaction, size);
   return seastar::do_with(
     ObjectDataHandler(max_object_size),
     [=, this, &ctx, &onode](auto &objhandler) {
@@ -1822,45 +1819,34 @@ SeaStore::Shard::_setattrs(
   DEBUGT("onode={}", *ctx.transaction, *onode);
 
   auto fut = tm_iertr::now();
-  auto& layout = onode->get_mutable_layout(*ctx.transaction);
+  auto& layout = onode->get_layout();
   if (auto it = aset.find(OI_ATTR); it != aset.end()) {
     auto& val = it->second;
     if (likely(val.length() <= onode_layout_t::MAX_OI_LENGTH)) {
-      maybe_inline_memcpy(
-       &layout.oi[0],
-       val.c_str(),
-       val.length(),
-       onode_layout_t::MAX_OI_LENGTH);
 
       if (!layout.oi_size) {
        // if oi was not in the layout, it probably exists in the omap,
        // need to remove it first
        fut = _xattr_rmattr(ctx, onode, OI_ATTR);
       }
-      layout.oi_size = val.length();
+      onode->update_object_info(*ctx.transaction, val);
       aset.erase(it);
     } else {
-      layout.oi_size = 0;
+      onode->clear_object_info(*ctx.transaction);
     }
   }
 
   if (auto it = aset.find(SS_ATTR); it != aset.end()) {
     auto& val = it->second;
     if (likely(val.length() <= onode_layout_t::MAX_SS_LENGTH)) {
-      maybe_inline_memcpy(
-       &layout.ss[0],
-       val.c_str(),
-       val.length(),
-       onode_layout_t::MAX_SS_LENGTH);
 
       if (!layout.ss_size) {
        fut = _xattr_rmattr(ctx, onode, SS_ATTR);
       }
-      layout.ss_size = val.length();
-
+      onode->update_snapset(*ctx.transaction, val);
       aset.erase(it);
     } else {
-      layout.ss_size = 0;
+      onode->clear_snapset(*ctx.transaction);
     }
   }
 
@@ -1869,14 +1855,17 @@ SeaStore::Shard::_setattrs(
   }
 
   return fut.si_then(
-    [this, onode, &ctx, &layout,
-    aset=std::move(aset)]() mutable {
+    [this, onode, &ctx, aset=std::move(aset)]() mutable {
     return _omap_set_kvs(
       onode,
       onode->get_layout().xattr_root,
       *ctx.transaction,
-      layout.xattr_root,
-      std::move(aset));
+      std::move(aset)
+    ).si_then([onode, &ctx](auto root) {
+      if (root.must_update()) {
+       onode->update_xattr_root(*ctx.transaction, root);
+      }
+    });
   });
 }
 
@@ -1888,14 +1877,12 @@ SeaStore::Shard::_rmattr(
 {
   LOG_PREFIX(SeaStore::_rmattr);
   DEBUGT("onode={}", *ctx.transaction, *onode);
-  auto& layout = onode->get_mutable_layout(*ctx.transaction);
+  auto& layout = onode->get_layout();
   if ((name == OI_ATTR) && (layout.oi_size > 0)) {
-    memset(&layout.oi[0], 0, layout.oi_size);
-    layout.oi_size = 0;
+    onode->clear_object_info(*ctx.transaction);
     return tm_iertr::now();
   } else if ((name == SS_ATTR) && (layout.ss_size > 0)) {
-    memset(&layout.ss[0], 0, layout.ss_size);
-    layout.ss_size = 0;
+    onode->clear_snapset(*ctx.transaction);
     return tm_iertr::now();
   } else {
     return _xattr_rmattr(
@@ -1927,8 +1914,7 @@ SeaStore::Shard::_xattr_rmattr(
         return omap_manager.omap_rm_key(xattr_root, *ctx.transaction, name)
           .si_then([&] {
           if (xattr_root.must_update()) {
-              onode->get_mutable_layout(*ctx.transaction
-              ).xattr_root.update(xattr_root);
+           onode->update_xattr_root(*ctx.transaction, xattr_root);
           }
         });
     });
@@ -1942,11 +1928,8 @@ SeaStore::Shard::_rmattrs(
 {
   LOG_PREFIX(SeaStore::_rmattrs);
   DEBUGT("onode={}", *ctx.transaction, *onode);
-  auto& layout = onode->get_mutable_layout(*ctx.transaction);
-  memset(&layout.oi[0], 0, layout.oi_size);
-  layout.oi_size = 0;
-  memset(&layout.ss[0], 0, layout.ss_size);
-  layout.ss_size = 0;
+  onode->clear_object_info(*ctx.transaction);
+  onode->clear_snapset(*ctx.transaction);
   return _xattr_clear(ctx, onode);
 }
 
@@ -1970,8 +1953,7 @@ SeaStore::Shard::_xattr_clear(
         return omap_manager.omap_clear(xattr_root, *ctx.transaction)
          .si_then([&] {
          if (xattr_root.must_update()) {
-              onode->get_mutable_layout(*ctx.transaction
-              ).xattr_root.update(xattr_root);
+           onode->update_xattr_root(*ctx.transaction, xattr_root);
           }
         });
     });
index 876fadca8c78753511cf99ee4d9e90c7eddb2e89..def40a282208bb4801353b1aa4634de9b17503f7 100644 (file)
@@ -408,12 +408,11 @@ public:
     tm_ret _remove_collection(
       internal_context_t &ctx,
       const coll_t& cid);
-    using omap_set_kvs_ret = tm_iertr::future<>;
+    using omap_set_kvs_ret = tm_iertr::future<omap_root_t>;
     omap_set_kvs_ret _omap_set_kvs(
       OnodeRef &onode,
       const omap_root_le_t& omap_root,
       Transaction& t,
-      omap_root_le_t& mutable_omap_root,
       std::map<std::string, ceph::bufferlist>&& kvs);
 
     boost::intrusive_ptr<SeastoreCollection> _get_collection(const coll_t& cid);
index 17ad975d5e87e1393caedfc9cd289e30b32334a3..3d98dcf5aef2480d8c073ffaf21193cd5599a89a 100644 (file)
@@ -30,10 +30,12 @@ struct onode_item_t {
   uint32_t cnt_modify = 0;
 
   void initialize(Transaction& t, Onode& value) const {
-    auto& layout = value.get_mutable_layout(t);
-    layout.size = size;
-    layout.omap_root.update(omap_root_t(id, cnt_modify,
-      value.get_metadata_hint(block_size)));
+    auto &ftvalue = static_cast<FLTreeOnode&>(value);
+    ftvalue.with_mutable_layout(t, [this, &value](auto &mlayout) {
+      mlayout.size = size;
+      mlayout.omap_root.update(omap_root_t(id, cnt_modify,
+       value.get_metadata_hint(block_size)));
+    });
     validate(value);
   }
 
index 6510cb5d93fecb09386d26398cfa9a471b9843e0..47607643946ec38bd40de45a0e07f63d4d6755ef 100644 (file)
@@ -30,9 +30,9 @@ public:
   const onode_layout_t &get_layout() const final {
     return layout;
   }
-  onode_layout_t &get_mutable_layout(Transaction &t) final {
-    dirty = true;
-    return layout;
+  template <typename Func>
+  void with_mutable_layout(Transaction &t, Func&& f) {
+    f(layout);
   }
   bool is_alive() const {
     return true;
@@ -40,6 +40,67 @@ public:
   bool is_dirty() const { return dirty; }
   laddr_t get_hint() const final {return L_ADDR_MIN; }
   ~TestOnode() final = default;
+
+  void update_onode_size(Transaction &t, uint32_t size) final {
+    with_mutable_layout(t, [size](onode_layout_t &mlayout) {
+      mlayout.size = size;
+    });
+  }
+
+  void update_omap_root(Transaction &t, omap_root_t &oroot) final {
+    with_mutable_layout(t, [&oroot](onode_layout_t &mlayout) {
+      mlayout.omap_root.update(oroot);
+    });
+  }
+
+  void update_xattr_root(Transaction &t, omap_root_t &xroot) final {
+    with_mutable_layout(t, [&xroot](onode_layout_t &mlayout) {
+      mlayout.xattr_root.update(xroot);
+    });
+  }
+
+  void update_object_data(Transaction &t, object_data_t &odata) final {
+    with_mutable_layout(t, [&odata](onode_layout_t &mlayout) {
+      mlayout.object_data.update(odata);
+    });
+  }
+
+  void update_object_info(Transaction &t, ceph::bufferlist &oi_bl) final {
+    with_mutable_layout(t, [&oi_bl](onode_layout_t &mlayout) {
+      maybe_inline_memcpy(
+       &mlayout.oi[0],
+       oi_bl.c_str(),
+       oi_bl.length(),
+       onode_layout_t::MAX_OI_LENGTH);
+      mlayout.oi_size = oi_bl.length();
+    });
+  }
+
+  void clear_object_info(Transaction &t) final {
+    with_mutable_layout(t, [](onode_layout_t &mlayout) {
+      memset(&mlayout.oi[0], 0, mlayout.oi_size);
+      mlayout.oi_size = 0;
+    });
+  }
+
+  void update_snapset(Transaction &t, ceph::bufferlist &ss_bl) final {
+    with_mutable_layout(t, [&ss_bl](onode_layout_t &mlayout) {
+      maybe_inline_memcpy(
+       &mlayout.ss[0],
+       ss_bl.c_str(),
+       ss_bl.length(),
+       onode_layout_t::MAX_OI_LENGTH);
+      mlayout.ss_size = ss_bl.length();
+    });
+  }
+
+  void clear_snapset(Transaction &t) final {
+    with_mutable_layout(t, [](onode_layout_t &mlayout) {
+      memset(&mlayout.ss[0], 0, mlayout.ss_size);
+      mlayout.ss_size = 0;
+    });
+  }
+
 };
 
 struct object_data_handler_test_t: