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;
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);
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 {
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