From cdd2b53a96d8d71278f97925d88bd4a0e509597f Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 3 Nov 2020 19:37:10 -0800 Subject: [PATCH] crimson/os/seastore/segment_manager: add seastore_meta_t with uuid Signed-off-by: Samuel Just --- src/crimson/os/seastore/seastore_types.h | 13 +++++++++++++ src/crimson/os/seastore/segment_manager.h | 2 +- src/crimson/os/seastore/segment_manager/block.cc | 3 ++- src/crimson/os/seastore/segment_manager/block.h | 8 ++++++++ .../os/seastore/segment_manager/ephemeral.cc | 2 ++ src/crimson/os/seastore/segment_manager/ephemeral.h | 6 ++++++ 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index 56bf53b72fb..fd05767faf1 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -10,6 +10,7 @@ #include "include/denc.h" #include "include/buffer.h" #include "include/cmp.h" +#include "include/uuid.h" namespace crimson::os::seastore { @@ -18,6 +19,17 @@ using depth_le_t = ceph_les32; using checksum_t = uint32_t; +// Immutable metadata for seastore set a mkfs time +struct seastore_meta_t { + uuid_d seastore_id; + + DENC(seastore_meta_t, v, p) { + DENC_START(1, 1, p); + denc(v.seastore_id, p); + DENC_FINISH(p); + } +}; + // Identifies segment location on disk, see SegmentManager, using segment_id_t = uint32_t; constexpr segment_id_t NULL_SEG_ID = @@ -350,6 +362,7 @@ struct record_t { } +WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::seastore_meta_t) WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::paddr_t) WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::journal_seq_t) WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::delta_info_t) diff --git a/src/crimson/os/seastore/segment_manager.h b/src/crimson/os/seastore/segment_manager.h index 79b1240c3dc..00b3cfc0c42 100644 --- a/src/crimson/os/seastore/segment_manager.h +++ b/src/crimson/os/seastore/segment_manager.h @@ -118,7 +118,7 @@ public: ceph_assert(get_size() % get_segment_size() == 0); return ((segment_id_t)(get_size() / get_segment_size())); } - + virtual const seastore_meta_t &get_meta() const = 0; virtual ~SegmentManager() {} }; diff --git a/src/crimson/os/seastore/segment_manager/block.cc b/src/crimson/os/seastore/segment_manager/block.cc index 8c8fa717014..6b74fc62f84 100644 --- a/src/crimson/os/seastore/segment_manager/block.cc +++ b/src/crimson/os/seastore/segment_manager/block.cc @@ -115,7 +115,8 @@ block_sm_superblock_t make_superblock( data.block_size, segments, data.block_size, - tracker_size + data.block_size + tracker_size + data.block_size, + config.meta }; } diff --git a/src/crimson/os/seastore/segment_manager/block.h b/src/crimson/os/seastore/segment_manager/block.h index 0a8c3173400..927b13e4e94 100644 --- a/src/crimson/os/seastore/segment_manager/block.h +++ b/src/crimson/os/seastore/segment_manager/block.h @@ -24,6 +24,8 @@ struct block_sm_superblock_t { size_t segments = 0; uint64_t tracker_offset = 0; uint64_t first_segment_offset = 0; + + seastore_meta_t meta; DENC(block_sm_superblock_t, v, p) { DENC_START(1, 1, p); @@ -33,6 +35,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_FINISH(p); } }; @@ -146,6 +149,7 @@ public: std::string path; size_t segment_size = 0; size_t total_size = 0; + seastore_meta_t meta; }; using mkfs_ertr = access_ertr; using mkfs_ret = mkfs_ertr::future<>; @@ -199,6 +203,10 @@ private: addr.offset; } + const seastore_meta_t &get_meta() const { + return superblock.meta; + } + std::vector segment_state; char *buffer = nullptr; diff --git a/src/crimson/os/seastore/segment_manager/ephemeral.cc b/src/crimson/os/seastore/segment_manager/ephemeral.cc index b58e842bb14..3250303adfb 100644 --- a/src/crimson/os/seastore/segment_manager/ephemeral.cc +++ b/src/crimson/os/seastore/segment_manager/ephemeral.cc @@ -96,6 +96,8 @@ EphemeralSegmentManager::init_ertr::future<> EphemeralSegmentManager::init() "Initing ephemeral segment manager with config {}", config); + meta = seastore_meta_t{}; + if (config.block_size % (4<<10) != 0) { return crimson::ct_error::invarg::make(); } diff --git a/src/crimson/os/seastore/segment_manager/ephemeral.h b/src/crimson/os/seastore/segment_manager/ephemeral.h index 41e3591a2bc..9f19cb4d0c7 100644 --- a/src/crimson/os/seastore/segment_manager/ephemeral.h +++ b/src/crimson/os/seastore/segment_manager/ephemeral.h @@ -53,6 +53,7 @@ class EphemeralSegmentManager final : public SegmentManager { using segment_state_t = Segment::segment_state_t; const ephemeral_config_t config; + std::optional meta; size_t get_offset(paddr_t addr) { return (addr.segment * config.segment_size) + addr.offset; @@ -93,6 +94,11 @@ public: return config.segment_size; } + const seastore_meta_t &get_meta() const final { + assert(meta); + return *meta; + } + void remount(); // public so tests can bypass segment interface when simpler -- 2.39.5