]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/onode-staged-tree: print NodeExtent with the header
authorYingxin Cheng <yingxin.cheng@intel.com>
Fri, 18 Jun 2021 08:47:05 +0000 (16:47 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Mon, 21 Jun 2021 02:08:46 +0000 (10:08 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/onode_manager/staged-fltree/node_delta_recorder.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_accessor.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.cc
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/test_replay.h
src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage_layout.h

index a37fdb6d509623a1be97ba585bad6e0c0e70538f..27df8e23a19b3b655c3682e08d247c0aa86c93ad 100644 (file)
@@ -42,7 +42,7 @@ class DeltaRecorder {
   virtual field_type_t field_type() const = 0;
   virtual void apply_delta(ceph::bufferlist::const_iterator&,
                            NodeExtentMutable&,
-                           laddr_t) = 0;
+                           const NodeExtent&) = 0;
 
  protected:
   DeltaRecorder() = default;
index 51d4b9d7e53e6da96a45b1c9a22495c26ec4a354..ef0c7292b28d8bdc6280067081c51394ead4dc4d 100644 (file)
@@ -110,12 +110,12 @@ class DeltaRecorderT final: public DeltaRecorder {
   node_type_t node_type() const override { return NODE_TYPE; }
   field_type_t field_type() const override { return FIELD_TYPE; }
   void apply_delta(ceph::bufferlist::const_iterator& delta,
-                   NodeExtentMutable& node,
-                   laddr_t node_laddr) override {
+                   NodeExtentMutable& mut,
+                   const NodeExtent& node) override {
     LOG_PREFIX(OTree::Extent::Replay);
     assert(is_empty());
-    node_stage_t stage(reinterpret_cast<const FieldType*>(node.get_read()),
-                       node.get_length());
+    node_stage_t stage(reinterpret_cast<const FieldType*>(mut.get_read()),
+                       mut.get_length());
     node_delta_op_t op;
     try {
       ceph::decode(op, delta);
@@ -133,21 +133,21 @@ class DeltaRecorderT final: public DeltaRecorder {
               "insert_size={}B ...",
               key, value, insert_pos, insert_stage, insert_size);
         layout_t::template insert<KeyT::HOBJ>(
-          node, stage, key, value, insert_pos, insert_stage, insert_size);
+          mut, stage, key, value, insert_pos, insert_stage, insert_size);
         break;
       }
       case node_delta_op_t::SPLIT: {
         DEBUG("decoding SPLIT ...");
         auto split_at = StagedIterator::decode(
-            node.get_read(), node.get_length(), delta);
+            mut.get_read(), mut.get_length(), delta);
         DEBUG("apply split_at={} ...", split_at);
-        layout_t::split(node, stage, split_at);
+        layout_t::split(mut, stage, split_at);
         break;
       }
       case node_delta_op_t::SPLIT_INSERT: {
         DEBUG("decoding SPLIT_INSERT ...");
         auto split_at = StagedIterator::decode(
-            node.get_read(), node.get_length(), delta);
+            mut.get_read(), mut.get_length(), delta);
         auto key = key_hobj_t::decode(delta);
         auto value = decode_value(delta);
         auto insert_pos = position_t::decode(delta);
@@ -159,7 +159,7 @@ class DeltaRecorderT final: public DeltaRecorder {
               "insert_size={}B ...",
               split_at, key, value, insert_pos, insert_stage, insert_size);
         layout_t::template split_insert<KeyT::HOBJ>(
-          node, stage, split_at, key, value, insert_pos, insert_stage, insert_size);
+          mut, stage, split_at, key, value, insert_pos, insert_stage, insert_size);
         break;
       }
       case node_delta_op_t::UPDATE_CHILD_ADDR: {
@@ -169,46 +169,46 @@ class DeltaRecorderT final: public DeltaRecorder {
         node_offset_t update_offset;
         ceph::decode(update_offset, delta);
         auto p_addr = reinterpret_cast<laddr_packed_t*>(
-            node.get_write() + update_offset);
+            mut.get_write() + update_offset);
         DEBUG("apply {:#x} to offset {:#x} ...",
               new_addr, update_offset);
-        layout_t::update_child_addr(node, new_addr, p_addr);
+        layout_t::update_child_addr(mut, new_addr, p_addr);
         break;
       }
       case node_delta_op_t::ERASE: {
         DEBUG("decoding ERASE ...");
         auto erase_pos = position_t::decode(delta);
         DEBUG("apply erase_pos({}) ...", erase_pos);
-        layout_t::erase(node, stage, erase_pos);
+        layout_t::erase(mut, stage, erase_pos);
         break;
       }
       case node_delta_op_t::MAKE_TAIL: {
         DEBUG("decoded MAKE_TAIL, apply ...");
-        layout_t::make_tail(node, stage);
+        layout_t::make_tail(mut, stage);
         break;
       }
       case node_delta_op_t::SUBOP_UPDATE_VALUE: {
         DEBUG("decoding SUBOP_UPDATE_VALUE ...");
         node_offset_t value_header_offset;
         ceph::decode(value_header_offset, delta);
-        auto p_header = node.get_read() + value_header_offset;
+        auto p_header = mut.get_read() + value_header_offset;
         auto p_header_ = reinterpret_cast<const value_header_t*>(p_header);
         DEBUG("update {} at {:#x} ...", *p_header_, value_header_offset);
-        auto payload_mut = p_header_->get_payload_mutable(node);
-        auto value_addr = node_laddr + payload_mut.get_node_offset();
+        auto payload_mut = p_header_->get_payload_mutable(mut);
+        auto value_addr = node.get_laddr() + payload_mut.get_node_offset();
         get_value_replayer(p_header_->magic)->apply_value_delta(
             delta, payload_mut, value_addr);
         break;
       }
       default:
-        ERROR("got unknown op {} when replay {:#x}",
-              op, node_laddr);
-        ceph_abort();
+        ERROR("got unknown op {} when replay {}",
+              op, node);
+        ceph_abort("fatal error");
       }
     } catch (buffer::error& e) {
-      ERROR("got decode error {} when replay {:#x}",
-            e, node_laddr);
-      ceph_abort();
+      ERROR("got decode error {} when replay {}",
+            e, node);
+      ceph_abort("fatal error");
     }
   }
 
index 924d6ee8770a14af7b9f2d5b73daa7dd9094401c..93c6cbe93a4baba588700ef202179289ba8fd699 100644 (file)
@@ -47,6 +47,10 @@ class NodeExtent : public LogicalCachedExtent {
     return NodeExtentMutable(get_bptr().c_str(), get_length());
   }
 
+  std::ostream& print_detail_l(std::ostream& out) const final {
+    return out << ", fltree_header=" << get_header();
+  }
+
   /**
    * Abstracted interfaces to implement:
    * - CacheExtent::duplicate_for_write() -> CachedExtentRef
index 1f385cf12d4aeb960acd4286726a0cd50a7b50d1..0f9f9bbd2fe0b5f51844f8504dd386ee241a0a74 100644 (file)
@@ -103,8 +103,8 @@ class DummyNodeExtentManager final: public NodeExtentManager {
 
   retire_ertr::future<> retire_extent(
       Transaction& t, NodeExtentRef extent) override {
-    TRACET("retiring {}B at {:#x} ...",
-           t, extent->get_length(), extent->get_laddr());
+    TRACET("retiring {}B at {:#x} -- {} ...",
+           t, extent->get_length(), extent->get_laddr(), *extent);
     if constexpr (SYNC) {
       return retire_extent_sync(t, extent);
     } else {
@@ -138,7 +138,8 @@ class DummyNodeExtentManager final: public NodeExtentManager {
     auto iter = allocate_map.find(addr);
     assert(iter != allocate_map.end());
     auto extent = iter->second;
-    TRACET("read {}B at {:#x}", t, extent->get_length(), extent->get_laddr());
+    TRACET("read {}B at {:#x} -- {}",
+           t, extent->get_length(), extent->get_laddr(), *extent);
     assert(extent->get_laddr() == addr);
     return read_ertr::make_ready_future<NodeExtentRef>(extent);
   }
@@ -153,7 +154,8 @@ class DummyNodeExtentManager final: public NodeExtentManager {
     extent->set_laddr(addr);
     assert(allocate_map.find(extent->get_laddr()) == allocate_map.end());
     allocate_map.insert({extent->get_laddr(), extent});
-    DEBUGT("allocated {}B at {:#x}", t, extent->get_length(), extent->get_laddr());
+    DEBUGT("allocated {}B at {:#x} -- {}",
+           t, extent->get_length(), extent->get_laddr(), *extent);
     assert(extent->get_length() == len);
     return alloc_ertr::make_ready_future<NodeExtentRef>(extent);
   }
index ba6eb63d7cfdfe96ae90d6770e21d3f5c7dd8182..208c9174b4de914c179cff450dbb6e1c83c0ece8 100644 (file)
@@ -47,7 +47,7 @@ static DeltaRecorderURef create_replay_recorder(
 NodeExtentRef SeastoreNodeExtent::mutate(
     context_t c, DeltaRecorderURef&& _recorder)
 {
-  DEBUGT("mutate {:#x} ...", c.t, get_laddr());
+  DEBUGT("mutate {} ...", c.t, *this);
   auto p_handle = static_cast<TransactionManagerHandle*>(&c.nm);
   auto extent = p_handle->tm.get_mutable_extent(c.t, this);
   auto ret = extent->cast<SeastoreNodeExtent>();
@@ -60,7 +60,7 @@ NodeExtentRef SeastoreNodeExtent::mutate(
 
 void SeastoreNodeExtent::apply_delta(const ceph::bufferlist& bl)
 {
-  DEBUG("replay {:#x} ...", get_laddr());
+  DEBUG("replay {} ...", *this);
   if (!recorder) {
     auto header = get_header();
     auto field_type = header.get_field_type();
@@ -77,11 +77,12 @@ void SeastoreNodeExtent::apply_delta(const ceph::bufferlist& bl)
     assert(recorder->field_type() == *header.get_field_type());
 #endif
   }
-  auto node = do_get_mutable();
+  auto mut = do_get_mutable();
   auto p = bl.cbegin();
   while (p != bl.end()) {
-    recorder->apply_delta(p, node, get_laddr());
+    recorder->apply_delta(p, mut, *this);
   }
+  DEBUG("relay done!");
 }
 
 }
index 7f46ac96f015c98539e2639b2b137736bef2b3e3..b63a362f845edeee634fd89f703302a3411c32d7 100644 (file)
@@ -30,7 +30,7 @@ class TestReplayExtent final: public NodeExtent {
     auto bl = recorder->get_delta();
     assert(bl.length());
     auto p = bl.cbegin();
-    recorder->apply_delta(p, mut, 0u);
+    recorder->apply_delta(p, mut, *this);
     assert(p == bl.end());
     auto cmp = std::memcmp(get_read(), replayed_extent->get_read(), get_length());
     ceph_assert(cmp == 0 && "replay mismatch!");
index f69b902dc33eda9bb74a3bc92f0cb09096cfe577..611b7dc1828ba9ddce9a934ac3e0b0157bf45cb6 100644 (file)
@@ -56,6 +56,17 @@ struct node_header_t {
     is_level_tail = static_cast<uint8_t>(value);
   }
 } __attribute__((packed));
+inline std::ostream& operator<<(std::ostream& os, const node_header_t& header) {
+  auto field_type = header.get_field_type();
+  if (field_type.has_value()) {
+    os << "header" << header.get_node_type() << *field_type
+       << "(is_level_tail=" << header.get_is_level_tail()
+       << ", level=" << (unsigned)header.level << ")";
+  } else {
+    os << "header(INVALID)";
+  }
+  return os;
+}
 
 template <typename FixedKeyType, field_type_t _FIELD_TYPE>
 struct _slot_t {