SegmentedAllocator::Writer::write_iertr::future<>
SegmentedAllocator::Writer::_write(
Transaction& t,
- ool_record_t& record)
+ ool_record_t& record,
+ const record_size_t& record_size)
{
- bufferlist bl = record.encode(current_segment->segment->get_segment_id(), 0);
+ bufferlist bl = record.encode(
+ record_size,
+ current_segment->segment->get_segment_id(),
+ 0);
seastar::promise<> pr;
current_segment->inflight_writes.emplace_back(pr.get_future());
LOG_PREFIX(SegmentedAllocator::Writer::_write);
// account transactional ool writes before write()
auto& stats = t.get_ool_write_stats();
stats.extents.num += record.get_num_extents();
- auto extent_bytes = record.get_raw_data_size();
- stats.extents.bytes += extent_bytes;
- assert(bl.length() > extent_bytes);
- stats.header_bytes += (bl.length() - extent_bytes);
+ stats.extents.bytes += record_size.dlength;
+ stats.header_bytes += record_size.mdlength;
stats.num_records += 1;
return trans_intr::make_interruptible(
num_extents,
current_segment->segment->get_segment_id(),
allocated_to);
+ auto rsize = record.get_encoded_record_length();
return (num_extents ?
- _write(t, record) :
+ _write(t, record, rsize) :
write_iertr::now()
).si_then([this]() mutable {
return roll_segment(false);
current_segment->segment->get_segment_id(),
allocated_to);
allocated_to += rsize.mdlength + rsize.dlength;
- return _write(t, record);
+ return _write(t, record, rsize);
}
).si_then([]()
-> write_iertr::future<seastar::stop_iteration> {
public:
ool_record_t(size_t block_size) : block_size(block_size) {}
record_size_t get_encoded_record_length() {
+ assert(extents.size() == record.extents.size());
return crimson::os::seastore::get_encoded_record_length(record, block_size);
}
size_t get_wouldbe_encoded_record_length(LogicalCachedExtentRef& extent) {
block_size);
return wouldbe_mdlength + extent_buf_len + extent->get_bptr().length();
}
- ceph::bufferlist encode(segment_id_t segment, segment_nonce_t nonce) {
+ ceph::bufferlist encode(const record_size_t& rsize,
+ segment_id_t segment,
+ segment_nonce_t nonce) {
assert(extents.size() == record.extents.size());
- auto rsize = get_encoded_record_length();
segment_off_t extent_offset = base + rsize.mdlength;
for (auto& extent : extents) {
extent.set_ool_paddr(
uint64_t get_num_extents() const {
return extents.size();
}
- uint64_t get_raw_data_size() const {
- assert(extents.size() == record.extents.size());
- return record.get_raw_data_size();
- }
+
private:
std::vector<OolExtent> extents;
record_t record;
write_iertr::future<> _write(
Transaction& t,
- ool_record_t& record);
+ ool_record_t& record,
+ const record_size_t& record_size);
using roll_segment_ertr = crimson::errorator<
crimson::ct_error::input_output_error>;
record_size_t get_encoded_record_length(
const record_t &record,
size_t block_size) {
- extent_len_t metadata =
+ extent_len_t raw_mdlength =
get_encoded_record_raw_mdlength(record, block_size);
- extent_len_t data = 0;
+ extent_len_t mdlength =
+ p2roundup(raw_mdlength, (extent_len_t)block_size);
+ extent_len_t dlength = 0;
for (const auto &i: record.extents) {
- data += i.bl.length();
+ dlength += i.bl.length();
}
- metadata = p2roundup(metadata, (extent_len_t)block_size);
- return record_size_t{metadata, data};
+ return record_size_t{mdlength, dlength};
}
ceph::bufferlist encode_record(
}
ceph_assert(bl.length() == rsize.mdlength);
-
auto bliter = bl.cbegin();
auto metadata_crc = bliter.crc32c(
ceph::encoded_sizeof_bounded<record_header_t>(),
struct record_size_t {
extent_len_t mdlength = 0;
extent_len_t dlength = 0;
-
- record_size_t(
- extent_len_t mdlength,
- extent_len_t dlength)
- : mdlength(mdlength), dlength(dlength) {}
};
extent_len_t get_encoded_record_raw_mdlength(