/* Monotonically increasing segment seq, uniquely identifies
* the incarnation of a segment */
-using segment_seq_t = uint32_t;
+using segment_seq_t = uint64_t;
static constexpr segment_seq_t MAX_SEG_SEQ =
std::numeric_limits<segment_seq_t>::max();
static constexpr segment_seq_t NULL_SEG_SEQ = MAX_SEG_SEQ;
struct seg_paddr_t;
struct blk_paddr_t;
struct res_paddr_t;
+struct pladdr_t;
struct paddr_t {
public:
// P_ADDR_MAX == P_ADDR_NULL == paddr_t{}
static_cast<u_device_off_t>(offset)) {}
friend struct paddr_le_t;
+ friend struct pladdr_le_t;
+
};
std::ostream &operator<<(std::ostream &out, const paddr_t &rhs);
NONE = 0,
HDD,
SSD,
- ZNS,
+ ZBD, // ZNS SSD or SMR HDD
EPHEMERAL_COLD,
EPHEMERAL_MAIN,
RANDOM_BLOCK_SSD,
device_type_t string_to_device_type(std::string type);
enum class backend_type_t {
- SEGMENTED, // SegmentManager: SSD, ZNS, HDD
+ SEGMENTED, // SegmentManager: SSD, ZBD, HDD
RANDOM_BLOCK // RBMDevice: RANDOM_BLOCK_SSD
};
}
};
+constexpr uint64_t PL_ADDR_NULL = std::numeric_limits<uint64_t>::max();
+
+struct pladdr_t {
+ std::variant<laddr_t, paddr_t> pladdr;
+
+ pladdr_t() = default;
+ pladdr_t(const pladdr_t &) = default;
+ pladdr_t(laddr_t laddr)
+ : pladdr(laddr) {}
+ pladdr_t(paddr_t paddr)
+ : pladdr(paddr) {}
+
+ bool is_laddr() const {
+ return pladdr.index() == 0;
+ }
+
+ bool is_paddr() const {
+ return pladdr.index() == 1;
+ }
+
+ pladdr_t& operator=(paddr_t paddr) {
+ pladdr = paddr;
+ return *this;
+ }
+
+ pladdr_t& operator=(laddr_t laddr) {
+ pladdr = laddr;
+ return *this;
+ }
+
+ bool operator==(const pladdr_t &) const = default;
+
+ paddr_t get_paddr() const {
+ assert(pladdr.index() == 1);
+ return paddr_t(std::get<1>(pladdr));
+ }
+
+ laddr_t get_laddr() const {
+ assert(pladdr.index() == 0);
+ return laddr_t(std::get<0>(pladdr));
+ }
+
+};
+
+std::ostream &operator<<(std::ostream &out, const pladdr_t &pladdr);
+
+enum class addr_type_t : uint8_t {
+ PADDR=0,
+ LADDR=1,
+ MAX=2 // or NONE
+};
+
+struct __attribute((packed)) pladdr_le_t {
+ ceph_le64 pladdr = ceph_le64(PL_ADDR_NULL);
+ addr_type_t addr_type = addr_type_t::MAX;
+
+ pladdr_le_t() = default;
+ pladdr_le_t(const pladdr_le_t &) = default;
+ explicit pladdr_le_t(const pladdr_t &addr)
+ : pladdr(
+ ceph_le64(
+ addr.is_laddr() ?
+ std::get<0>(addr.pladdr) :
+ std::get<1>(addr.pladdr).internal_paddr)),
+ addr_type(
+ addr.is_laddr() ?
+ addr_type_t::LADDR :
+ addr_type_t::PADDR)
+ {}
+
+ operator pladdr_t() const {
+ if (addr_type == addr_type_t::LADDR) {
+ return pladdr_t(laddr_t(pladdr));
+ } else {
+ assert(addr_type == addr_type_t::PADDR);
+ return pladdr_t(paddr_t(pladdr));
+ }
+ }
+};
+
+template <typename T>
+struct min_max_t {};
+
+template <>
+struct min_max_t<laddr_t> {
+ static constexpr laddr_t max = L_ADDR_MAX;
+ static constexpr laddr_t min = L_ADDR_MIN;
+ static constexpr laddr_t null = L_ADDR_NULL;
+};
+
+template <>
+struct min_max_t<paddr_t> {
+ static constexpr paddr_t max = P_ADDR_MAX;
+ static constexpr paddr_t min = P_ADDR_MIN;
+ static constexpr paddr_t null = P_ADDR_NULL;
+};
+
// logical offset, see LBAManager, TransactionManager
using extent_len_t = uint32_t;
constexpr extent_len_t EXTENT_LEN_MAX =
journal_seq_t seq;
journal_seq_t last_committed;
std::size_t num_consumed_records = 0;
+ extent_len_t block_size = 0;
struct found_record_group_t {
paddr_t offset;
return seq.offset.as_seg_paddr().get_segment_off();
}
+ extent_len_t get_block_size() const {
+ return block_size;
+ }
+
void increment_seq(segment_off_t off) {
- auto& seg_addr = seq.offset.as_seg_paddr();
- seg_addr.set_segment_off(
- seg_addr.get_segment_off() + off);
+ seq.offset = seq.offset.add_offset(off);
}
void emplace_record_group(const record_group_header_t&, ceph::bufferlist&&);
template <> struct fmt::formatter<crimson::os::seastore::omap_root_t> : fmt::ostream_formatter {};
template <> struct fmt::formatter<crimson::os::seastore::paddr_list_t> : fmt::ostream_formatter {};
template <> struct fmt::formatter<crimson::os::seastore::paddr_t> : fmt::ostream_formatter {};
+template <> struct fmt::formatter<crimson::os::seastore::pladdr_t> : fmt::ostream_formatter {};
template <> struct fmt::formatter<crimson::os::seastore::placement_hint_t> : fmt::ostream_formatter {};
template <> struct fmt::formatter<crimson::os::seastore::device_type_t> : fmt::ostream_formatter {};
template <> struct fmt::formatter<crimson::os::seastore::record_group_header_t> : fmt::ostream_formatter {};