if (segment_info.is_empty()) {
auto old_usage = calc_utilization(seg_id);
segments.mark_open(seg_id, seq, type, category, generation);
+ if (type == segment_type_t::JOURNAL) {
+ set_journal_head(segments.get_journal_head());
+ } else {
+ gc_process.maybe_wake_on_space_used();
+ }
auto new_usage = calc_utilization(seg_id);
adjust_segment_util(old_usage, new_usage);
INFO("opened, should_block_on_trim {}, should_block_on_reclaim {}, "
journal_seq_t target = std::min(dirty_replay_from, alloc_replay_from);
ceph_assert(target != JOURNAL_SEQ_NULL);
- auto journal_head = segments.get_journal_head();
ceph_assert(journal_head == JOURNAL_SEQ_NULL ||
journal_head >= target);
if (journal_tail_target == JOURNAL_SEQ_NULL ||
if (committed == JOURNAL_SEQ_NULL) {
return;
}
- auto journal_head = segments.get_journal_head();
ceph_assert(journal_head == JOURNAL_SEQ_NULL ||
journal_head >= committed);
}
INFO("done, start GC, time_bound={}",
sea_time_point_printer_t{segments.get_time_bound()});
- ceph_assert(segments.get_journal_head() != JOURNAL_SEQ_NULL);
+ ceph_assert(journal_head != JOURNAL_SEQ_NULL);
init_complete = true;
gc_process.start();
}
should_block_on_trim(),
should_block_on_reclaim(),
gc_should_reclaim_space(),
- segments.get_journal_head(),
+ journal_head,
journal_tail_target,
journal_tail_committed,
get_dirty_tail(),
*/
class SegmentProvider {
public:
+ virtual void set_journal_head(journal_seq_t) = 0;
+
virtual journal_seq_t get_journal_tail_target() const = 0;
virtual const segment_info_t& get_seg_info(segment_id_t id) const = 0;
/// most recently committed journal_tail
journal_seq_t journal_tail_committed;
+ /// head of journal
+ journal_seq_t journal_head;
+
ExtentCallbackInterface *ecb = nullptr;
/// populated if there is an IO blocked on hard limits
return segments[id];
}
+ void set_journal_head(journal_seq_t head) final {
+ ceph_assert(head != JOURNAL_SEQ_NULL);
+ ceph_assert(journal_head == JOURNAL_SEQ_NULL ||
+ head >= journal_head);
+ journal_head = head;
+ gc_process.maybe_wake_on_space_used();
+ }
+
segment_id_t allocate_segment(
segment_seq_t, segment_type_t, data_category_t, reclaim_gen_t) final;
void update_segment_avail_bytes(segment_type_t type, paddr_t offset) final {
segments.update_written_to(type, offset);
- gc_process.maybe_wake_on_space_used();
+ if (type == segment_type_t::JOURNAL) {
+ set_journal_head(segments.get_journal_head());
+ } else {
+ gc_process.maybe_wake_on_space_used();
+ }
}
void update_modify_time(
journal_seq_t alloc_replay_from);
void init_mkfs() {
- auto journal_head = segments.get_journal_head();
ceph_assert(disable_trim || journal_head != JOURNAL_SEQ_NULL);
journal_tail_target = journal_head;
journal_tail_committed = journal_head;
journal_seq_t limit);
journal_seq_t get_dirty_tail() const {
- auto ret = segments.get_journal_head();
+ auto ret = journal_head;
ceph_assert(ret != JOURNAL_SEQ_NULL);
if (ret.segment_seq >= config.target_journal_segments) {
ret.segment_seq -= config.target_journal_segments;
}
journal_seq_t get_dirty_tail_limit() const {
- auto ret = segments.get_journal_head();
+ auto ret = journal_head;
ceph_assert(ret != JOURNAL_SEQ_NULL);
if (ret.segment_seq >= config.max_journal_segments) {
ret.segment_seq -= config.max_journal_segments;
}
journal_seq_t get_backref_tail() const {
- auto ret = segments.get_journal_head();
+ auto ret = journal_head;
ceph_assert(ret != JOURNAL_SEQ_NULL);
if (ret.segment_seq >= config.target_backref_inflight_segments) {
ret.segment_seq -= config.target_backref_inflight_segments;
if (journal_tail_committed == JOURNAL_SEQ_NULL) {
return segments.get_num_type_journal();
}
- auto journal_head = segments.get_journal_head();
assert(journal_head != JOURNAL_SEQ_NULL);
assert(journal_head.segment_seq >= journal_tail_committed.segment_seq);
return journal_head.segment_seq + 1 - journal_tail_committed.segment_seq;
* Journal sizes
*/
std::size_t get_dirty_journal_size() const {
- auto journal_head = segments.get_journal_head();
if (journal_head == JOURNAL_SEQ_NULL ||
dirty_extents_replay_from == JOURNAL_SEQ_NULL) {
return 0;
}
std::size_t get_alloc_journal_size() const {
- auto journal_head = segments.get_journal_head();
if (journal_head == JOURNAL_SEQ_NULL ||
alloc_info_replay_from == JOURNAL_SEQ_NULL) {
return 0;