]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/crimson/os/seastore/random_block_manager.h
update ceph source to reef 18.2.1
[ceph.git] / ceph / src / crimson / os / seastore / random_block_manager.h
index 0478f5d0e5a633efe10e2a310f4e3e45a09f73b6..d9be1b5e6d9cafafc9eeb66bc548c39b57fe6d63 100644 (file)
 
 namespace crimson::os::seastore {
 
+struct rbm_shard_info_t {
+  std::size_t size = 0;
+  uint64_t start_offset = 0;
+
+  DENC(rbm_shard_info_t, v, p) {
+    DENC_START(1, 1, p);
+    denc(v.size, p);
+    denc(v.start_offset, p);
+    DENC_FINISH(p);
+  }
+};
+
 struct rbm_metadata_header_t {
   size_t size = 0;
   size_t block_size = 0;
@@ -29,6 +41,8 @@ struct rbm_metadata_header_t {
   uint64_t journal_size = 0;
   checksum_t crc = 0;
   device_config_t config;
+  unsigned int shard_num = 0;
+  std::vector<rbm_shard_info_t> shard_infos;
 
   DENC(rbm_metadata_header_t, v, p) {
     DENC_START(1, 1, p);
@@ -39,9 +53,28 @@ struct rbm_metadata_header_t {
     denc(v.journal_size, p);
     denc(v.crc, p);
     denc(v.config, p);
+    denc(v.shard_num, p);
+    denc(v.shard_infos, p);
     DENC_FINISH(p);
   }
 
+  void validate() const {
+    ceph_assert(shard_num == seastar::smp::count);
+    ceph_assert(block_size > 0);
+    for (unsigned int i = 0; i < seastar::smp::count; i ++) {
+      ceph_assert(shard_infos[i].size > block_size &&
+                  shard_infos[i].size % block_size == 0);
+      ceph_assert_always(shard_infos[i].size <= DEVICE_OFF_MAX);
+      ceph_assert(journal_size > 0 &&
+                  journal_size % block_size == 0);
+      ceph_assert(shard_infos[i].start_offset < size &&
+                 shard_infos[i].start_offset % block_size == 0);
+    }
+    ceph_assert(config.spec.magic != 0);
+    ceph_assert(get_default_backend_of_device(config.spec.dtype) ==
+               backend_type_t::RANDOM_BLOCK);
+    ceph_assert(config.spec.id <= DEVICE_ID_MAX_VALID);
+  }
 };
 
 enum class rbm_extent_state_t {
@@ -127,12 +160,17 @@ seastar::future<std::unique_ptr<random_block_device::RBMDevice>>
   get_rb_device(const std::string &device);
 
 std::ostream &operator<<(std::ostream &out, const rbm_metadata_header_t &header);
+std::ostream &operator<<(std::ostream &out, const rbm_shard_info_t &shard);
 }
 
+WRITE_CLASS_DENC_BOUNDED(
+  crimson::os::seastore::rbm_shard_info_t
+)
 WRITE_CLASS_DENC_BOUNDED(
   crimson::os::seastore::rbm_metadata_header_t
 )
 
 #if FMT_VERSION >= 90000
 template<> struct fmt::formatter<crimson::os::seastore::rbm_metadata_header_t> : fmt::ostream_formatter {};
+template<> struct fmt::formatter<crimson::os::seastore::rbm_shard_info_t> : fmt::ostream_formatter {};
 #endif