]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/segment_manager: add seastore_meta_t with uuid
authorSamuel Just <sjust@redhat.com>
Wed, 4 Nov 2020 03:37:10 +0000 (19:37 -0800)
committerSamuel Just <sjust@redhat.com>
Fri, 11 Dec 2020 21:31:39 +0000 (13:31 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/seastore_types.h
src/crimson/os/seastore/segment_manager.h
src/crimson/os/seastore/segment_manager/block.cc
src/crimson/os/seastore/segment_manager/block.h
src/crimson/os/seastore/segment_manager/ephemeral.cc
src/crimson/os/seastore/segment_manager/ephemeral.h

index 56bf53b72fbffd9a409d0a19d41a8c2098f6d233..fd05767faf18b14cb4d7f84ddc9b9b3184d5941c 100644 (file)
@@ -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)
index 79b1240c3dc5a7142221b05af60501051dacfed1..00b3cfc0c42d1af70a3d8920b442284b83557ca5 100644 (file)
@@ -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() {}
 };
index 8c8fa717014ac618bdf18e8a452837d210c55226..6b74fc62f848a0592d7823ec707b9826671dcc34 100644 (file)
@@ -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
   };
 }
 
index 0a8c3173400f61e388cd36851be9277a68204c43..927b13e4e94b59d6d26c1e4773984c8d0b75fc58 100644 (file)
@@ -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_t> segment_state;
 
   char *buffer = nullptr;
index b58e842bb144effb76808a3c28b12f97457262e4..3250303adfbfe74edbf542e8abbfdb1d644139f1 100644 (file)
@@ -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();
   }
index 41e3591a2bcc50b233a72a37301b3e7ae17fa032..9f19cb4d0c7473ce9ea0d520a5a44d21b4fc5c3a 100644 (file)
@@ -53,6 +53,7 @@ class EphemeralSegmentManager final : public SegmentManager {
   using segment_state_t = Segment::segment_state_t;
 
   const ephemeral_config_t config;
+  std::optional<seastore_meta_t> 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