#include "include/denc.h"
#include "include/buffer.h"
#include "include/cmp.h"
+#include "include/uuid.h"
namespace crimson::os::seastore {
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 =
}
+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)
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() {}
};
data.block_size,
segments,
data.block_size,
- tracker_size + data.block_size
+ tracker_size + data.block_size,
+ config.meta
};
}
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);
denc(v.segments, p);
denc(v.tracker_offset, p);
denc(v.first_segment_offset, p);
+ denc(v.meta, p);
DENC_FINISH(p);
}
};
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<>;
addr.offset;
}
+ const seastore_meta_t &get_meta() const {
+ return superblock.meta;
+ }
+
std::vector<segment_state_t> segment_state;
char *buffer = nullptr;
"Initing ephemeral segment manager with config {}",
config);
+ meta = seastore_meta_t{};
+
if (config.block_size % (4<<10) != 0) {
return crimson::ct_error::invarg::make();
}
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;
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