From: Yingxin Cheng Date: Wed, 5 Jan 2022 14:56:13 +0000 (+0800) Subject: crimson/os/seastore/../segment_manager: pretty print data structures X-Git-Tag: v17.1.0~80^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d5b0cd1392eacae23facef280d35c72a1336ff8c;p=ceph-ci.git crimson/os/seastore/../segment_manager: pretty print data structures Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index e3269538c2e..687c4514684 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -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()); } diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 954e0ad02de..eb166b1ad32 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -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(); } diff --git a/src/crimson/os/seastore/seastore_types.cc b/src/crimson/os/seastore/seastore_types.cc index 849140c89b2..9b7970552d8 100644 --- a/src/crimson/os/seastore/seastore_types.cc +++ b/src/crimson/os/seastore/seastore_types.cc @@ -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) { diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index b205b77089e..3ac349d2bc5 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -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. diff --git a/src/crimson/os/seastore/segment_manager.cc b/src/crimson/os/seastore/segment_manager.cc index e5c4df6f8fc..2ed74625242 100644 --- a/src/crimson/os/seastore/segment_manager.cc +++ b/src/crimson/os/seastore/segment_manager.cc @@ -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 SegmentManager::get_segment_manager( const std::string &device) diff --git a/src/crimson/os/seastore/segment_manager.h b/src/crimson/os/seastore/segment_manager.h index 4315829618c..9ac314c080e 100644 --- a/src/crimson/os/seastore/segment_manager.h +++ b/src/crimson/os/seastore/segment_manager.h @@ -33,6 +33,8 @@ struct device_spec_t{ } }; +std::ostream& operator<<(std::ostream&, const device_spec_t&); + using secondary_device_set_t = std::map; @@ -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; +std::ostream& operator<<(std::ostream& out, Segment::segment_state_t); + constexpr size_t PADDR_SIZE = sizeof(paddr_t); class SegmentManager; diff --git a/src/crimson/os/seastore/segment_manager/block.cc b/src/crimson/os/seastore/segment_manager/block.cc index 8c0e3bcd658..6a8e2d7f87b 100644 --- a/src/crimson/os/seastore/segment_manager/block.cc +++ b/src/crimson/os/seastore/segment_manager/block.cc @@ -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( @@ -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(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(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(), [=](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("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(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 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(); }