namespace crimson::os::seastore {
-void segment_info_set_t::segment_info_t::set_open() {
+void segment_info_set_t::segment_info_t::set_open(segment_seq_t seq) {
assert(state == Segment::segment_state_t::EMPTY);
+ assert(segment_seq_to_type(seq) != segment_type_t::NULL_SEG);
state = Segment::segment_state_t::OPEN;
+ journal_segment_seq = seq;
}
void segment_info_set_t::segment_info_t::set_empty() {
assert(state == Segment::segment_state_t::CLOSED);
state = Segment::segment_state_t::EMPTY;
+ journal_segment_seq = NULL_SEG_SEQ;
}
void segment_info_set_t::segment_info_t::set_closed() {
});
}
-SegmentCleaner::get_segment_ret SegmentCleaner::get_segment(device_id_t id)
+SegmentCleaner::get_segment_ret SegmentCleaner::get_segment(
+ device_id_t id, segment_seq_t seq)
{
+ assert(segment_seq_to_type(seq) != segment_type_t::NULL_SEG);
for (auto it = segments.device_begin(id);
it != segments.device_end(id);
++it) {
auto id = it->first;
auto& segment_info = it->second;
if (segment_info.is_empty()) {
- mark_open(id);
- logger().debug("{}: returning segment {}", __func__, id);
+ logger().debug("{}: returning segment {} {}",
+ __func__, id, segment_seq_printer_t{seq});
+ mark_open(id, seq);
return get_segment_ret(
get_segment_ertr::ready_future_marker{},
id);
void SegmentCleaner::close_segment(segment_id_t segment)
{
+ ceph_assert(segment_seq_to_type(segments[segment].journal_segment_seq) !=
+ segment_type_t::NULL_SEG);
mark_closed(segment);
}
return segment_seq_to_type(journal_segment_seq);
}
- void set_open();
+ void set_open(segment_seq_t);
void set_empty();
void set_closed();
using get_segment_ertr = crimson::errorator<
crimson::ct_error::input_output_error>;
using get_segment_ret = get_segment_ertr::future<segment_id_t>;
- virtual get_segment_ret get_segment(device_id_t id) = 0;
+ virtual get_segment_ret get_segment(
+ device_id_t id, segment_seq_t seq) = 0;
virtual void close_segment(segment_id_t) {}
- virtual void set_journal_segment(
- segment_id_t segment,
- segment_seq_t seq) {}
-
virtual journal_seq_t get_journal_tail_target() const = 0;
+
virtual void update_journal_tail_committed(journal_seq_t tail_committed) = 0;
virtual segment_seq_t get_seq(segment_id_t id) { return 0; }
using init_segments_ret = init_segments_ertr::future<init_segments_ret_bare>;
init_segments_ret init_segments();
- get_segment_ret get_segment(device_id_t id) final;
+ get_segment_ret get_segment(
+ device_id_t id, segment_seq_t seq) final;
void close_segment(segment_id_t segment) final;
- void set_journal_segment(
- segment_id_t segment, segment_seq_t seq) final {
- assert(segment.device_id() ==
- segments[segment.device_id()]->device_id);
- assert(segment.device_segment_id() <
- segments[segment.device_id()]->num_segments);
- segments[segment].journal_segment_seq = seq;
- segments[segment].out_of_line = false;
- segments.new_journal_segment();
- assert(segments[segment].is_open());
- }
-
journal_seq_t get_journal_tail_target() const final {
return journal_tail_target;
}
"SegmentCleaner::init_mark_segment_closed: segment {}, seq {}",
segment,
segment_seq_printer_t{seq});
+ ceph_assert(segment_seq_to_type(seq) != segment_type_t::NULL_SEG);
mark_closed(segment);
segments[segment].journal_segment_seq = seq;
auto s_type = segments[segment].get_type();
space_tracker->dump_usage(segment);
assert(space_tracker->get_usage(segment) == 0);
}
+ auto s_type = segment_info.get_type();
segment_info.set_empty();
stats.empty_segments++;
crimson::get_logger(ceph_subsys_seastore_cleaner
should_block_on_gc(),
get_projected_available_ratio(),
get_projected_reclaim_ratio());
- auto s_type = segment_info.get_type();
ceph_assert(s_type != segment_type_t::NULL_SEG);
if (s_type == segment_type_t::JOURNAL) {
segments.journal_segment_emptied();
maybe_wake_gc_blocked_io();
}
- void mark_open(segment_id_t segment) {
+ void mark_open(segment_id_t segment, segment_seq_t seq) {
assert(segment.device_id() ==
segments[segment.device_id()]->device_id);
assert(segment.device_segment_id() <
assert(segments[segment].is_empty());
assert(segments.get_empty_segments(segment.device_id()) > 0);
segments.segment_opened(segment);
- segments[segment].set_open();
+ auto& segment_info = segments[segment];
+ segment_info.set_open(seq);
+
+ auto s_type = segment_info.get_type();
+ ceph_assert(s_type != segment_type_t::NULL_SEG);
+ if (s_type == segment_type_t::JOURNAL) {
+ segments.new_journal_segment();
+ }
assert(stats.empty_segments > 0);
stats.empty_segments--;
crimson::get_logger(ceph_subsys_seastore_cleaner
- ).info("mark open: {}, empty_segments {}"
+ ).info("mark open: {} {}, empty_segments {}"
", opened_segments {}, should_block_on_gc {}"
", projected_avail_ratio {}, projected_reclaim_ratio {}",
segment,
+ segment_seq_printer_t{seq},
stats.empty_segments,
segments.get_opened_segments(),
should_block_on_gc(),