Journal::initialize_segment(Segment &segment)
{
auto new_tail = segment_provider->get_journal_tail_target();
- logger().debug(
- "initialize_segment {} journal_tail_target {}",
- segment.get_segment_id(),
- new_tail);
// write out header
ceph_assert(segment.get_write_ptr() == 0);
bufferlist bl;
segment_provider->get_journal_tail_target(),
current_segment_nonce,
false};
+ logger().debug(
+ "initialize_segment {} journal_tail_target {}, header {}",
+ segment.get_segment_id(),
+ new_tail,
+ header);
encode(header, bl);
bufferptr bp(
[this](auto &seg) {
segment_provider->init_mark_segment_closed(
seg.first,
- seg.second.journal_segment_seq);
+ seg.second.journal_segment_seq,
+ false);
});
auto journal_tail = segments.rbegin()->second.journal_tail;
void SegmentCleaner::update_journal_tail_target(journal_seq_t target)
{
logger().debug(
- "{}: {}",
+ "{}: {}, current tail target {}",
__func__,
- target);
+ target,
+ journal_tail_target);
assert(journal_tail_target == journal_seq_t() || target >= journal_tail_target);
if (journal_tail_target == journal_seq_t() || target > journal_tail_target) {
journal_tail_target = target;
logger().debug("Scanner::init_segments: out-of-line segment {}", segment_id);
init_mark_segment_closed(
segment_id,
- header.journal_segment_seq);
+ header.journal_segment_seq,
+ true);
} else {
logger().debug("Scanner::init_segments: journal segment {}", segment_id);
segments.emplace_back(std::make_pair(segment_id, std::move(header)));
segment_seq_t journal_segment_seq = NULL_SEG_SEQ;
+ bool out_of_line = false;
+
bool is_in_journal(journal_seq_t tail_committed) const {
- return journal_segment_seq != NULL_SEG_SEQ &&
+ return !out_of_line &&
+ journal_segment_seq != NULL_SEG_SEQ &&
tail_committed.segment_seq <= journal_segment_seq;
}
virtual void update_journal_tail_committed(journal_seq_t tail_committed) = 0;
virtual void init_mark_segment_closed(
- segment_id_t segment, segment_seq_t seq) {}
+ segment_id_t segment,
+ segment_seq_t seq,
+ bool out_of_line) {}
virtual segment_seq_t get_seq(segment_id_t id) { return 0; }
return journal_head;
}
- void init_mark_segment_closed(segment_id_t segment, segment_seq_t seq) final {
+ void init_mark_segment_closed(
+ segment_id_t segment,
+ segment_seq_t seq,
+ bool out_of_line) final
+ {
crimson::get_logger(ceph_subsys_seastore).debug(
"SegmentCleaner::init_mark_segment_closed: segment {}, seq {}",
segment,
seq);
mark_closed(segment);
segments[segment].journal_segment_seq = seq;
+ segments[segment].out_of_line = out_of_line;
}
segment_seq_t get_seq(segment_id_t id) final {
"gc_should_reclaim_space {}, "
"journal_head {}, "
"journal_tail_target {}, "
+ "journal_tail_commit {}, "
"dirty_tail {}, "
"dirty_tail_limit {}, "
"gc_should_trim_journal {}, ",
gc_should_reclaim_space(),
journal_head,
journal_tail_target,
+ journal_tail_committed,
get_dirty_tail(),
get_dirty_tail_limit(),
gc_should_trim_journal()