]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/../segment_manager: pretty print data structures
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 5 Jan 2022 14:56:13 +0000 (22:56 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Wed, 12 Jan 2022 05:43:43 +0000 (13:43 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/extent_placement_manager.h
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/seastore_types.cc
src/crimson/os/seastore/seastore_types.h
src/crimson/os/seastore/segment_manager.cc
src/crimson/os/seastore/segment_manager.h
src/crimson/os/seastore/segment_manager/block.cc

index e3269538c2e0b2ccb65785bed3e1f07e924058e8..687c4514684fbca220b371b16fb2fdcf74cce719 100644 (file)
@@ -381,7 +381,7 @@ public:
     allocators[type].emplace_back(std::move(allocator));
     LOG_PREFIX(ExtentPlacementManager::add_allocator);
     SUBDEBUG(seastore_tm, "allocators for {}: {}",
-      device_type_to_string(type),
+      type,
       allocators[type].size());
   }
 
index 954e0ad02deb4d97ce76690116a29d9800620c88..eb166b1ad3258ee005eb6049774c099b2774cfed 100644 (file)
@@ -155,10 +155,10 @@ SeaStore::mount_ertr::future<> SeaStore::mount()
       device_id_t id = device_entry.first;
       magic_t magic = device_entry.second.magic;
       device_type_t dtype = device_entry.second.dtype;
+      std::ostringstream oss;
+      oss << root << "/block." << dtype << "." << std::to_string(id);
       auto sm = std::make_unique<
-       segment_manager::block::BlockSegmentManager>(
-         root + "/block." + device_type_to_string(dtype)
-         + "." + std::to_string(id));
+       segment_manager::block::BlockSegmentManager>(oss.str());
       return sm->mount().safe_then([this, sm=std::move(sm), magic]() mutable {
        assert(sm->get_magic() == magic);
        transaction_manager->add_segment_manager(sm.get());
@@ -241,7 +241,7 @@ SeaStore::mkfs_ertr::future<> SeaStore::mkfs(uuid_d new_osd_fsid)
                 device_type_t dtype =
                   string_to_device_type(
                     entry_name.substr(6, dtype_end - 6));
-                if (!dtype) {
+                if (dtype == device_type_t::NONE) {
                   // invalid device type
                   return seastar::now();
                 }
index 849140c89b2fe6b3a2592116deb6890338cccd6d..9b7970552d8a964350ba0b40367d240ba120ab9c 100644 (file)
@@ -14,6 +14,11 @@ seastar::logger& logger() {
 
 namespace crimson::os::seastore {
 
+std::ostream& operator<<(std::ostream& out, const seastore_meta_t& meta)
+{
+  return out << meta.seastore_id;
+}
+
 std::ostream &segment_to_stream(std::ostream &out, const segment_id_t &t)
 {
   if (t == NULL_SEG_ID)
@@ -458,7 +463,7 @@ try_decode_deltas(
 
 bool can_delay_allocation(device_type_t type) {
   // Some types of device may not support delayed allocation, for example PMEM.
-  return type <= RANDOM_BLOCK;
+  return type <= device_type_t::RANDOM_BLOCK;
 }
 
 device_type_t string_to_device_type(std::string type) {
@@ -474,18 +479,22 @@ device_type_t string_to_device_type(std::string type) {
   return device_type_t::NONE;
 }
 
-std::string device_type_to_string(device_type_t dtype) {
-  switch (dtype) {
+std::ostream& operator<<(std::ostream& out, device_type_t t)
+{
+  switch (t) {
+  case device_type_t::NONE:
+    return out << "NONE";
   case device_type_t::SEGMENTED:
-    return "segmented";
+    return out << "SEGMENTED";
   case device_type_t::RANDOM_BLOCK:
-    return "random_block";
+    return out << "RANDOM_BLOCK";
   case device_type_t::PMEM:
-    return "pmem";
+    return out << "PMEM";
   default:
-    ceph_assert(0 == "impossible");
+    return out << "INVALID_DEVICE_TYPE!";
   }
 }
+
 paddr_t convert_blk_paddr_to_paddr(blk_paddr_t addr, size_t block_size,
     uint32_t blocks_per_segment, device_id_t d_id)
 {
index b205b77089e8ea219e371e2811bbb0e5da6829d8..3ac349d2bc594b2d5f53fc25e2222307d44ca01a 100644 (file)
@@ -38,6 +38,8 @@ struct seastore_meta_t {
   }
 };
 
+std::ostream& operator<<(std::ostream& out, const seastore_meta_t& meta);
+
 // identifies a specific physical device within seastore
 using device_id_t = uint8_t;
 
@@ -644,7 +646,7 @@ enum class placement_hint_t {
   NUM_HINTS  // Constant for number of hints
 };
 
-enum device_type_t {
+enum class device_type_t {
   NONE = 0,
   SEGMENTED, // i.e. Hard_Disk, SATA_SSD, NAND_NVME
   RANDOM_BLOCK, // i.e. RANDOM_BD
@@ -652,9 +654,10 @@ enum device_type_t {
   NUM_TYPES
 };
 
+std::ostream& operator<<(std::ostream& out, device_type_t t);
+
 bool can_delay_allocation(device_type_t type);
 device_type_t string_to_device_type(std::string type);
-std::string device_type_to_string(device_type_t type);
 
 /* Monotonically increasing identifier for the location of a
  * journal_record.
index e5c4df6f8fcb16715f407f1b1ca7ac9fa3e7bbaa..2ed74625242f3eca82df9140603bade291911709 100644 (file)
@@ -22,6 +22,66 @@ seastar::logger &logger(){
 
 namespace crimson::os::seastore {
 
+std::ostream& operator<<(std::ostream& out, const device_spec_t& ds)
+{
+  return out << "device_spec("
+             << "magic=" << ds.magic
+             << ", device_type=" << ds.dtype
+             << ", device_id=" << std::to_string(ds.id)
+             << ")";
+}
+
+std::ostream& operator<<(std::ostream& out, const block_sm_superblock_t& sb)
+{
+  out << "superblock("
+      << "size=" << sb.size
+      << ", segment_size=" << sb.segment_size
+      << ", block_size=" << sb.block_size
+      << ", segments=" << sb.segments
+      << ", tracker_offset=" << sb.tracker_offset
+      << ", first_segment_offset=" << sb.first_segment_offset
+      << ", major_dev=" << sb.major_dev
+      << ", magic=" << sb.magic
+      << ", device_type=" << sb.dtype
+      << ", device_id=" << std::to_string(sb.device_id)
+      << ", meta=" << sb.meta
+      << ", secondary(";
+  for (const auto& [k, v] : sb.secondary_devices) {
+    out << std::to_string(k) << ": " << v;
+  }
+  return out << "))";
+}
+
+std::ostream& operator<<(std::ostream& out, const segment_manager_config_t& conf)
+{
+  out << "sm_config_t("
+      << "major_dev=" << conf.major_dev
+      << ", magic=" << conf.magic
+      << ", device_type=" << conf.dtype
+      << ", device_id=" << std::to_string(conf.device_id)
+      << ", meta=" << conf.meta
+      << ", secondary(";
+  for (const auto& [k, v] : conf.secondary_devices) {
+    out << std::to_string(k) << ": " << v;
+  }
+  return out << "))";
+}
+
+std::ostream& operator<<(std::ostream &out, Segment::segment_state_t s)
+{
+  using state_t = Segment::segment_state_t;
+  switch (s) {
+  case state_t::EMPTY:
+    return out << "EMPTY";
+  case state_t::OPEN:
+    return out << "OPEN";
+  case state_t::CLOSED:
+    return out << "CLOSED";
+  default:
+    return out << "INVALID_SEGMENT_STATE!";
+  }
+}
+
 seastar::future<crimson::os::seastore::SegmentManagerRef>
 SegmentManager::get_segment_manager(
   const std::string &device)
index 4315829618c24b7d5a3bbc77239255cd51328a70..9ac314c080ea9c8a66e09a520caf2e244ffe7214 100644 (file)
@@ -33,6 +33,8 @@ struct device_spec_t{
   }
 };
 
+std::ostream& operator<<(std::ostream&, const device_spec_t&);
+
 using secondary_device_set_t =
   std::map<device_id_t, device_spec_t>;
 
@@ -73,6 +75,8 @@ struct block_sm_superblock_t {
   }
 };
 
+std::ostream& operator<<(std::ostream&, const block_sm_superblock_t&);
+
 struct segment_manager_config_t {
   bool major_dev = false;
   magic_t magic = 0;
@@ -82,6 +86,8 @@ struct segment_manager_config_t {
   secondary_device_set_t secondary_devices;
 };
 
+std::ostream& operator<<(std::ostream&, const segment_manager_config_t&);
+
 class Segment : public boost::intrusive_ref_counter<
   Segment,
   boost::thread_unsafe_counter>{
@@ -141,6 +147,8 @@ public:
 };
 using SegmentRef = boost::intrusive_ptr<Segment>;
 
+std::ostream& operator<<(std::ostream& out, Segment::segment_state_t);
+
 constexpr size_t PADDR_SIZE = sizeof(paddr_t);
 class SegmentManager;
 
index 8c0e3bcd658815d6ab41d2e405d9c53aa4263de3..6a8e2d7f87be0b70b7bf6d501d60ddb2b36d7c71 100644 (file)
@@ -137,8 +137,6 @@ block_sm_superblock_t make_superblock(
   segment_manager_config_t sm_config,
   const seastar::stat_data &data)
 {
-  LOG_PREFIX(block_make_superblock);
-
   using crimson::common::get_conf;
 
   auto config_size = get_conf<Option::size_t>(
@@ -155,16 +153,6 @@ block_sm_superblock_t make_superblock(
   size_t segments = (size - tracker_size - data.block_size)
     / config_segment_size;
 
-  DEBUG(
-    "size {}, block_size {}, allocated_size {}, configured_size {}, "
-    "segment_size {}",
-    data.size,
-    data.block_size,
-    data.allocated_size,
-    config_size,
-    config_segment_size
-  );
-
   return block_sm_superblock_t{
     size,
     config_segment_size,
@@ -262,7 +250,6 @@ static
 BlockSegmentManager::access_ertr::future<>
 write_superblock(seastar::file &device, block_sm_superblock_t sb)
 {
-  LOG_PREFIX(block_write_superblock);
   assert(ceph::encoded_sizeof<block_sm_superblock_t>(sb) <
         sb.block_size);
   return seastar::do_with(
@@ -274,7 +261,6 @@ write_superblock(seastar::file &device, block_sm_superblock_t sb)
     auto iter = bl.begin();
     assert(bl.length() < sb.block_size);
     iter.copy(bl.length(), bp.c_str());
-    DEBUG("doing writeout");
     return do_write(device, 0, bp);
   });
 }
@@ -388,6 +374,7 @@ BlockSegmentManager::mount_ret BlockSegmentManager::mount()
     auto sd = p.second;
     return read_superblock(device, sd);
   }).safe_then([=](auto sb) {
+    INFO("device {} path={} read {}", get_device_id(), device_path, sb);
     superblock = sb;
     stats.data_read.increment(
         ceph::encoded_sizeof<block_sm_superblock_t>(superblock));
@@ -417,8 +404,7 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::mkfs(
   segment_manager_config_t sm_config)
 {
   LOG_PREFIX(BlockSegmentManager::mkfs);
-  DEBUG("magic={}, dtype={}, id={}",
-    sm_config.magic, sm_config.dtype, sm_config.device_id);
+  DEBUG("path={}, {}", device_path, sm_config);
   return seastar::do_with(
     seastar::file{},
     seastar::stat_data{},
@@ -426,7 +412,6 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::mkfs(
     std::unique_ptr<SegmentStateTracker>(),
     [=](auto &device, auto &stat, auto &sb, auto &tracker)
   {
-    ERROR("path {}", device_path);
     check_create_device_ret maybe_create = check_create_device_ertr::now();
     using crimson::common::get_conf;
     if (get_conf<bool>("seastore_block_create")) {
@@ -436,12 +421,13 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::mkfs(
 
     return maybe_create.safe_then([this] {
       return open_device(device_path);
-    }).safe_then([&, sm_config](auto p) {
+    }).safe_then([&, sm_config, FNAME](auto p) {
       device = p.first;
       stat = p.second;
       sb = make_superblock(sm_config, stat);
       stats.metadata_write.increment(
           ceph::encoded_sizeof<block_sm_superblock_t>(sb));
+      INFO("device {} path={},  writing {}", get_device_id(), device_path, sb);
       return write_superblock(device, sb);
     }).safe_then([&, FNAME] {
       DEBUG("superblock written");
@@ -477,7 +463,7 @@ SegmentManager::open_ertr::future<SegmentRef> BlockSegmentManager::open(
   }
 
   if (tracker->get(s_id) != segment_state_t::EMPTY) {
-    ERROR("invalid segment {} state {}", id, tracker->get(s_id));
+    ERROR("invalid segment {} state {} != EMPTY", id, tracker->get(s_id));
     return crimson::ct_error::invarg::make();
   }
 
@@ -506,7 +492,7 @@ SegmentManager::release_ertr::future<> BlockSegmentManager::release(
   }
 
   if (tracker->get(s_id) != segment_state_t::CLOSED) {
-    ERROR("invalid segment {} state {}", id, tracker->get(s_id));
+    ERROR("invalid segment {} state {} != CLOSED", id, tracker->get(s_id));
     return crimson::ct_error::invarg::make();
   }