friend std::ostream &operator<<(std::ostream &, extent_state_t);
virtual std::ostream &print_detail(std::ostream &out) const { return out; }
std::ostream &print(std::ostream &out) const {
+ std::string prior_poffset_str = prior_poffset
+ ? fmt::format("{}", *prior_poffset)
+ : "nullopt";
out << "CachedExtent(addr=" << this
<< ", type=" << get_type()
<< ", version=" << version
<< ", dirty_from_or_retired_at=" << dirty_from_or_retired_at
<< ", modify_time=" << sea_time_point_printer_t{modify_time}
<< ", paddr=" << get_paddr()
+ << ", prior_paddr=" << prior_poffset_str
<< ", length=" << get_length()
<< ", state=" << state
<< ", last_committed_crc=" << last_committed_crc
bool is_inline() const {
return poffset.is_relative();
}
+
+ paddr_t get_prior_paddr_and_reset() {
+ assert(prior_poffset);
+ auto ret = *prior_poffset;
+ prior_poffset.reset();
+ return ret;
+ }
+
private:
template <typename T>
friend class read_set_item_t;
/// address of original block -- relative iff is_pending() and is_clean()
paddr_t poffset;
+ /// relative address before ool write, used to update mapping
+ std::optional<paddr_t> prior_poffset = std::nullopt;
+
/// used to wait while in-progress commit completes
std::optional<seastar::shared_promise<>> io_wait_promise;
void set_io_wait() {
last_committed_crc = crc;
}
- void set_paddr(paddr_t offset) { poffset = offset; }
+ void set_paddr(paddr_t offset, bool need_update_mapping = false) {
+ if (need_update_mapping) {
+ assert(!prior_poffset);
+ prior_poffset = poffset;
+ }
+ poffset = offset;
+ }
/**
* maybe_generate_relative
void mark_delayed_extent_inline(LogicalCachedExtentRef& ref) {
write_set.erase(*ref);
assert(ref->get_paddr().is_delayed());
- ref->set_paddr(make_record_relative_paddr(offset));
+ ref->set_paddr(make_record_relative_paddr(offset),
+ /* need_update_mapping: */ true);
offset += ref->get_length();
inline_block_list.push_back(ref);
write_set.insert(*ref);
void mark_delayed_extent_ool(LogicalCachedExtentRef& ref, paddr_t final_addr) {
write_set.erase(*ref);
assert(ref->get_paddr().is_delayed());
- ref->set_paddr(final_addr);
+ ref->set_paddr(final_addr, /* need_update_mapping: */ true);
assert(!ref->get_paddr().is_null());
assert(!ref->is_inline());
written_ool_block_list.push_back(ref);