We'll need this to scan segments for live blocks.
Signed-off-by: Samuel Just <sjust@redhat.com>
if (i->get_type() == extent_types_t::ROOT) {
assert(0 == "ROOT never gets written as a fresh block");
}
- record.extents.push_back(extent_t{std::move(bl)});
+
+ assert(bl.length() == i->get_length());
+ record.extents.push_back(extent_t{
+ i->get_type(),
+ i->is_logical()
+ ? i->cast<LogicalCachedExtent>()->get_laddr()
+ : L_ADDR_NULL,
+ std::move(bl)
+ });
}
return std::make_optional<record_t>(std::move(record));
record.extents.size()
};
::encode(header, metadatabl);
+ for (const auto &i: record.extents) {
+ ::encode(extent_info_t(i), metadatabl);
+ }
for (const auto &i: record.deltas) {
::encode(i, metadatabl);
}
const record_t &record) const {
extent_len_t metadata =
(extent_len_t)ceph::encoded_sizeof_bounded<record_header_t>();
+ metadata += record.extents.size() *
+ ceph::encoded_sizeof_bounded<extent_info_t>();
extent_len_t data = 0;
for (const auto &i: record.deltas) {
metadata += ceph::encoded_sizeof(i);
{
auto bliter = bl.cbegin();
bliter += ceph::encoded_sizeof_bounded<record_header_t>();
+ bliter += header.extents * ceph::encoded_sizeof_bounded<extent_info_t>();
logger().debug("{}: decoding {} deltas", __func__, header.deltas);
std::vector<delta_info_t> deltas(header.deltas);
for (auto &&i : deltas) {
}
};
+struct extent_info_t {
+ extent_types_t type = extent_types_t::NONE;
+ laddr_t addr = L_ADDR_NULL;
+ extent_len_t len = 0;
+
+ extent_info_t() = default;
+ extent_info_t(const extent_t &et)
+ : type(et.type), addr(et.addr), len(et.bl.length()) {}
+
+ DENC(extent_info_t, v, p) {
+ DENC_START(1, 1, p);
+ denc(v.type, p);
+ denc(v.addr, p);
+ denc(v.len, p);
+ DENC_FINISH(p);
+ }
+};
+
/**
* Callback interface for managing available segments
*/
}
WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::segment_header_t)
WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::record_header_t)
+WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::extent_info_t)
/* description of a new physical extent */
struct extent_t {
+ extent_types_t type; ///< type of extent
+ laddr_t addr; ///< laddr of extent (L_ADDR_NULL for non-logical)
ceph::bufferlist bl; ///< payload, bl.length() == length, aligned
};
char contents = distribution(generator);
bufferlist bl;
bl.append(buffer::ptr(buffer::create(blocks * block_size, contents)));
- return extent_t{bl};
+ return extent_t{extent_types_t::TEST_BLOCK, L_ADDR_NULL, bl};
}
delta_info_t generate_delta(size_t bytes) {