From 272ab67600a2751d47fcc23e1ecb924cb5390168 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Fri, 8 Apr 2022 11:50:10 +0800 Subject: [PATCH] crimson/os/seastore: cleanup, reuse device_spec/config_t Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/device.cc | 11 ++++--- src/crimson/os/seastore/device.h | 23 ++++++++------ src/crimson/os/seastore/seastore.cc | 14 +++++---- src/crimson/os/seastore/segment_manager.cc | 13 ++------ src/crimson/os/seastore/segment_manager.h | 30 +++++++------------ .../os/seastore/segment_manager/block.cc | 11 ++----- .../os/seastore/segment_manager/block.h | 6 ++-- 7 files changed, 46 insertions(+), 62 deletions(-) diff --git a/src/crimson/os/seastore/device.cc b/src/crimson/os/seastore/device.cc index 3997216fc0ccf..c1b5617206a26 100644 --- a/src/crimson/os/seastore/device.cc +++ b/src/crimson/os/seastore/device.cc @@ -11,8 +11,8 @@ std::ostream& operator<<(std::ostream& out, const device_spec_t& ds) { return out << "device_spec(" << "magic=" << ds.magic - << ", device_type=" << ds.dtype - << ", device_id=" << device_id_printer_t{ds.id} + << ", dtype=" << ds.dtype + << ", id=" << device_id_printer_t{ds.id} << ")"; } @@ -20,13 +20,12 @@ std::ostream& operator<<(std::ostream& out, const device_config_t& conf) { out << "device_config_t(" << "major_dev=" << conf.major_dev - << ", magic=" << conf.magic - << ", device_type=" << conf.dtype - << ", device_id=" << device_id_printer_t{conf.device_id} + << ", spec=" << conf.spec << ", meta=" << conf.meta << ", secondary("; for (const auto& [k, v] : conf.secondary_devices) { - out << std::to_string(k) << ": " << v; + out << device_id_printer_t{k} + << ": " << v; } return out << "))"; } diff --git a/src/crimson/os/seastore/device.h b/src/crimson/os/seastore/device.h index 3b365eb7dcef3..e3ad303c1461a 100644 --- a/src/crimson/os/seastore/device.h +++ b/src/crimson/os/seastore/device.h @@ -15,9 +15,9 @@ namespace crimson::os::seastore { using magic_t = uint64_t; struct device_spec_t{ - magic_t magic; - device_type_t dtype; - device_id_t id; + magic_t magic = 0; + device_type_t dtype = device_type_t::NONE; + device_id_t id = DEVICE_ID_NULL; DENC(device_spec_t, v, p) { DENC_START(1, 1, p); denc(v.magic, p); @@ -34,11 +34,17 @@ using secondary_device_set_t = struct device_config_t { bool major_dev = false; - magic_t magic = 0; - device_type_t dtype = device_type_t::NONE; - device_id_t device_id = DEVICE_ID_NULL; + device_spec_t spec; seastore_meta_t meta; secondary_device_set_t secondary_devices; + DENC(device_config_t, v, p) { + DENC_START(1, 1, p); + denc(v.major_dev, p); + denc(v.spec, p); + denc(v.meta, p); + denc(v.secondary_devices, p); + DENC_FINISH(p); + } }; std::ostream& operator<<(std::ostream&, const device_config_t&); @@ -113,6 +119,5 @@ public: } -WRITE_CLASS_DENC( - crimson::os::seastore::device_spec_t -) +WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::device_spec_t) +WRITE_CLASS_DENC(crimson::os::seastore::device_config_t) diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 56e31ac19e01c..916fe7a40df5c 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -297,9 +297,10 @@ SeaStore::mkfs_ertr::future<> SeaStore::mkfs(uuid_d new_osd_fsid) device_spec_t{magic, dtype, (device_id_t)id}); return sec_dev->mkfs(device_config_t{ false, - magic, - dtype, - (device_id_t)id, + device_spec_t{ + magic, + dtype, + (device_id_t)id}, seastore_meta_t{new_osd_fsid}, secondary_device_set_t()} ).safe_then([this, sec_dev=std::move(sec_dev), id]() mutable { @@ -318,9 +319,10 @@ SeaStore::mkfs_ertr::future<> SeaStore::mkfs(uuid_d new_osd_fsid) return device->mkfs( device_config_t{ true, - (magic_t)std::rand(), - device_type_t::SEGMENTED, - 0, + device_spec_t{ + (magic_t)std::rand(), + device_type_t::SEGMENTED, + 0}, seastore_meta_t{new_osd_fsid}, sds} ); diff --git a/src/crimson/os/seastore/segment_manager.cc b/src/crimson/os/seastore/segment_manager.cc index 4d445313a01f3..6fc8f0f3e1922 100644 --- a/src/crimson/os/seastore/segment_manager.cc +++ b/src/crimson/os/seastore/segment_manager.cc @@ -31,16 +31,9 @@ std::ostream& operator<<(std::ostream& out, const block_sm_superblock_t& sb) << ", 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 << "))"; + << ", config=" << sb.config + << ")"; + return out; } std::ostream& operator<<(std::ostream &out, Segment::segment_state_t s) diff --git a/src/crimson/os/seastore/segment_manager.h b/src/crimson/os/seastore/segment_manager.h index 44d249dcac9fc..b565125c50bb7 100644 --- a/src/crimson/os/seastore/segment_manager.h +++ b/src/crimson/os/seastore/segment_manager.h @@ -29,14 +29,8 @@ struct block_sm_superblock_t { uint64_t tracker_offset = 0; uint64_t first_segment_offset = 0; - bool major_dev = false; - magic_t magic = 0; - device_type_t dtype = device_type_t::NONE; - device_id_t device_id = DEVICE_ID_NULL; + device_config_t config; - seastore_meta_t meta; - - secondary_device_set_t secondary_devices; DENC(block_sm_superblock_t, v, p) { DENC_START(1, 1, p); denc(v.size, p); @@ -45,14 +39,7 @@ struct block_sm_superblock_t { denc(v.segments, p); denc(v.tracker_offset, p); denc(v.first_segment_offset, p); - denc(v.meta, p); - denc(v.major_dev, p); - denc(v.magic, p); - denc(v.dtype, p); - denc(v.device_id, p); - if (v.major_dev) { - denc(v.secondary_devices, p); - } + denc(v.config, p); DENC_FINISH(p); } @@ -67,11 +54,14 @@ struct block_sm_superblock_t { tracker_offset % block_size == 0); ceph_assert(first_segment_offset > tracker_offset && first_segment_offset % block_size == 0); - ceph_assert(magic != 0); - ceph_assert(dtype == device_type_t::SEGMENTED); - ceph_assert(device_id <= DEVICE_ID_MAX_VALID); - for (const auto& [k, v] : secondary_devices) { - ceph_assert(k != device_id); + ceph_assert(config.spec.magic != 0); + ceph_assert(config.spec.dtype == device_type_t::SEGMENTED); + ceph_assert(config.spec.id <= DEVICE_ID_MAX_VALID); + if (!config.major_dev) { + ceph_assert(config.secondary_devices.size() == 0); + } + for (const auto& [k, v] : config.secondary_devices) { + ceph_assert(k != config.spec.id); ceph_assert(k <= DEVICE_ID_MAX_VALID); ceph_assert(k == v.id); ceph_assert(v.magic != 0); diff --git a/src/crimson/os/seastore/segment_manager/block.cc b/src/crimson/os/seastore/segment_manager/block.cc index 65403cdcd2f59..124be2cbdccbe 100644 --- a/src/crimson/os/seastore/segment_manager/block.cc +++ b/src/crimson/os/seastore/segment_manager/block.cc @@ -234,12 +234,7 @@ block_sm_superblock_t make_superblock( segments, tracker_off, first_seg_off, - sm_config.major_dev, - sm_config.magic, - sm_config.dtype, - sm_config.device_id, - sm_config.meta, - std::move(sm_config.secondary_devices) + std::move(sm_config) }; } @@ -486,7 +481,7 @@ BlockSegmentManager::mount_ret BlockSegmentManager::mount() auto sd = p.second; return read_superblock(device, sd); }).safe_then([=](auto sb) { - set_device_id(sb.device_id); + set_device_id(sb.config.spec.id); INFO("D{} read {}", get_device_id(), sb); sb.validate(); superblock = sb; @@ -520,7 +515,7 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::mkfs( device_config_t sm_config) { LOG_PREFIX(BlockSegmentManager::mkfs); - set_device_id(sm_config.device_id); + set_device_id(sm_config.spec.id); INFO("D{} path={}, {}", get_device_id(), device_path, sm_config); return seastar::do_with( seastar::file{}, diff --git a/src/crimson/os/seastore/segment_manager/block.h b/src/crimson/os/seastore/segment_manager/block.h index 363c7c5f23de0..6150f8c177dd9 100644 --- a/src/crimson/os/seastore/segment_manager/block.h +++ b/src/crimson/os/seastore/segment_manager/block.h @@ -146,7 +146,7 @@ public: return device_id; } secondary_device_set_t& get_secondary_devices() final { - return superblock.secondary_devices; + return superblock.config.secondary_devices; } // public so tests can bypass segment interface when simpler Segment::write_ertr::future<> segment_write( @@ -155,7 +155,7 @@ public: bool ignore_check=false); magic_t get_magic() const final { - return superblock.magic; + return superblock.config.spec.magic; } private: @@ -216,7 +216,7 @@ private: } const seastore_meta_t &get_meta() const { - return superblock.meta; + return superblock.config.meta; } std::vector segment_state; -- 2.39.5