Skip to content

Commit adf4aca

Browse files
authored
Merge pull request ceph#57711 from cyx1231st/wip-seastore-fix-incorrent-reclaimable-segments
crimson/os/seastore/async_cleaner: fix incorrect get_num_rolls() Reviewed-by: Xuehan Xu <[email protected]>
2 parents c0f6e1d + 5ae59cf commit adf4aca

File tree

5 files changed

+52
-2
lines changed

5 files changed

+52
-2
lines changed

src/crimson/os/seastore/async_cleaner.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,18 @@ void JournalTrimmerImpl::set_journal_head(journal_seq_t head)
443443
background_callback->maybe_wake_background();
444444
}
445445

446+
void JournalTrimmerImpl::set_journal_head_sequence(
447+
segment_seq_t seq)
448+
{
449+
if (journal_head != JOURNAL_SEQ_NULL) {
450+
ceph_assert(seq == journal_head.segment_seq + 1);
451+
}
452+
if (journal_head_seq != NULL_SEG_SEQ) {
453+
ceph_assert(seq == journal_head_seq + 1);
454+
}
455+
journal_head_seq = seq;
456+
}
457+
446458
void JournalTrimmerImpl::update_journal_tails(
447459
journal_seq_t dirty_tail,
448460
journal_seq_t alloc_tail)
@@ -976,6 +988,10 @@ segment_id_t SegmentCleaner::allocate_segment(
976988
if (segment_info.is_empty()) {
977989
auto old_usage = calc_utilization(seg_id);
978990
segments.mark_open(seg_id, seq, type, category, generation);
991+
if (type == segment_type_t::JOURNAL) {
992+
assert(trimmer != nullptr);
993+
trimmer->set_journal_head_sequence(seq);
994+
}
979995
background_callback->maybe_wake_background();
980996
auto new_usage = calc_utilization(seg_id);
981997
adjust_segment_util(old_usage, new_usage);

src/crimson/os/seastore/async_cleaner.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,12 @@ class JournalTrimmer {
414414
// set the committed journal head
415415
virtual void set_journal_head(journal_seq_t) = 0;
416416

417+
// get the opened journal head sequence
418+
virtual segment_seq_t get_journal_head_sequence() const = 0;
419+
420+
// set the opened journal head sequence
421+
virtual void set_journal_head_sequence(segment_seq_t) = 0;
422+
417423
// get the committed journal dirty tail
418424
virtual journal_seq_t get_dirty_tail() const = 0;
419425

@@ -453,7 +459,9 @@ class JournalTrimmer {
453459
}
454460
assert(get_journal_head().segment_seq >=
455461
get_journal_tail().segment_seq);
456-
return get_journal_head().segment_seq + 1 -
462+
assert(get_journal_head_sequence() >=
463+
get_journal_head().segment_seq);
464+
return get_journal_head_sequence() + 1 -
457465
get_journal_tail().segment_seq;
458466
}
459467
};
@@ -508,6 +516,12 @@ class JournalTrimmerImpl : public JournalTrimmer {
508516

509517
void set_journal_head(journal_seq_t) final;
510518

519+
segment_seq_t get_journal_head_sequence() const final {
520+
return journal_head_seq;
521+
}
522+
523+
void set_journal_head_sequence(segment_seq_t) final;
524+
511525
journal_seq_t get_dirty_tail() const final {
512526
return journal_dirty_tail;
513527
}
@@ -537,6 +551,7 @@ class JournalTrimmerImpl : public JournalTrimmer {
537551
}
538552

539553
void reset() {
554+
journal_head_seq = NULL_SEG_SEQ;
540555
journal_head = JOURNAL_SEQ_NULL;
541556
journal_dirty_tail = JOURNAL_SEQ_NULL;
542557
journal_alloc_tail = JOURNAL_SEQ_NULL;
@@ -616,6 +631,7 @@ class JournalTrimmerImpl : public JournalTrimmer {
616631
device_off_t roll_start;
617632
device_off_t roll_size;
618633

634+
segment_seq_t journal_head_seq = NULL_SEG_SEQ;
619635
journal_seq_t journal_head;
620636
journal_seq_t journal_dirty_tail;
621637
journal_seq_t journal_alloc_tail;

src/test/crimson/seastore/test_btree_lba_manager.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ struct btree_test_base :
5555

5656
void set_journal_head(journal_seq_t) final {}
5757

58+
segment_seq_t get_journal_head_sequence() const final {
59+
return NULL_SEG_SEQ;
60+
}
61+
62+
void set_journal_head_sequence(segment_seq_t) final {}
63+
5864
journal_seq_t get_dirty_tail() const final { return dummy_tail; }
5965

6066
journal_seq_t get_alloc_tail() const final { return dummy_tail; }

src/test/crimson/seastore/test_cbjournal.cc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,14 @@ struct cbjournal_test_t : public seastar_test_suite_t, JournalTrimmer
147147
/*
148148
* JournalTrimmer interfaces
149149
*/
150-
journal_seq_t get_journal_head() const {
150+
journal_seq_t get_journal_head() const final {
151151
return JOURNAL_SEQ_NULL;
152152
}
153153

154+
segment_seq_t get_journal_head_sequence() const final {
155+
return NULL_SEG_SEQ;
156+
}
157+
154158
journal_seq_t get_dirty_tail() const final {
155159
return JOURNAL_SEQ_NULL;
156160
}
@@ -161,6 +165,8 @@ struct cbjournal_test_t : public seastar_test_suite_t, JournalTrimmer
161165

162166
void set_journal_head(journal_seq_t head) final {}
163167

168+
void set_journal_head_sequence(segment_seq_t) final {}
169+
164170
void update_journal_tails(
165171
journal_seq_t dirty_tail,
166172
journal_seq_t alloc_tail) final {}

src/test/crimson/seastore/test_seastore_journal.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@ struct journal_test_t : seastar_test_suite_t, SegmentProvider, JournalTrimmer {
9494

9595
void set_journal_head(journal_seq_t) final {}
9696

97+
segment_seq_t get_journal_head_sequence() const final {
98+
return NULL_SEG_SEQ;
99+
}
100+
101+
void set_journal_head_sequence(segment_seq_t) final {}
102+
97103
journal_seq_t get_dirty_tail() const final { return dummy_tail; }
98104

99105
journal_seq_t get_alloc_tail() const final { return dummy_tail; }

0 commit comments

Comments
 (0)