convert_abs_addr_to_paddr(
device->get_block_size(),
config.device_id)};
+ head.alloc_tail = head.journal_tail;
head.device_id = config.device_id;
encode(head, bl);
header = head;
DEBUG("header : {}", header);
initialized = true;
written_to.segment_seq = NULL_SEG_SEQ;
- set_written_to(get_journal_tail());
+ auto tail = get_journal_tail() <= get_alloc_tail() ?
+ get_journal_tail() : get_alloc_tail();
+ set_written_to(tail);
return seastar::do_with(
bool(false),
- rbm_abs_addr(get_rbm_addr(get_journal_tail())),
+ rbm_abs_addr(get_rbm_addr(tail)),
std::move(delta_handler),
segment_seq_t(NULL_SEG_SEQ),
[this, FNAME](auto &is_rolled, auto &cursor_addr, auto &d_handler, auto &expected_seq) {
journal_seq_t{expected_seq, addr});
return seastar::do_with(
std::move(*maybe_record_deltas_list),
- [write_result,
+ [this,
+ write_result,
&d_handler,
FNAME](auto& record_deltas_list) {
return crimson::do_for_each(
record_deltas_list,
- [write_result,
+ [this,
+ write_result,
&d_handler, FNAME](record_deltas_t& record_deltas) {
auto locator = record_locator_t{
record_deltas.record_block_base,
locator);
return crimson::do_for_each(
record_deltas.deltas,
- [locator,
+ [this,
+ locator,
&d_handler](auto& p) {
auto& modify_time = p.first;
auto& delta = p.second;
return d_handler(
locator,
delta,
- locator.write_result.start_seq,
- locator.write_result.start_seq,
+ header.journal_tail,
+ header.alloc_tail,
modify_time).discard_result();
});
}).safe_then([]() {
// start offset of CircularBoundedJournal in the device
journal_seq_t journal_tail;
+ journal_seq_t alloc_tail;
device_id_t device_id;
denc(v.size, p);
denc(v.journal_tail, p);
+ denc(v.alloc_tail, p);
denc(v.device_id, p);
return get_total_size() - get_used_size();
}
- write_ertr::future<> update_journal_tail(journal_seq_t seq) {
+ write_ertr::future<> update_journal_tail(
+ journal_seq_t seq,
+ journal_seq_t alloc_info) {
header.journal_tail = seq;
+ header.alloc_tail = alloc_info;
return write_header();
}
journal_seq_t get_journal_tail() const {
return header.journal_tail;
}
+ journal_seq_t get_alloc_tail() const {
+ return header.alloc_tail;
+ }
write_ertr::future<> write_header();
return cbj->get_used_size();
}
void update_journal_tail(rbm_abs_addr addr, uint32_t len) {
- cbj->update_journal_tail(
- journal_seq_t{0,
- convert_abs_addr_to_paddr(
+ paddr_t paddr =
+ convert_abs_addr_to_paddr(
addr + len,
- cbj->get_device_id())}).unsafe_get0();
+ cbj->get_device_id());
+ journal_seq_t seq = {0, paddr};
+ cbj->update_journal_tail(
+ seq,
+ seq
+ ).unsafe_get0();
}
void set_written_to(journal_seq_t seq) {
cbj->set_written_to(seq);