Skip to content

Commit 44fc9fa

Browse files
authored
Merge pull request ceph#58787 from xxhdx1985126/wip-67106
crimson/os/seastore: consider segment_header_t::modify_time as the segments' modify_time for no-tail OOL segments Reviewed-by: Yingxin Cheng <[email protected]>
2 parents 5ba8c92 + a5329cb commit 44fc9fa

File tree

5 files changed

+63
-14
lines changed

5 files changed

+63
-14
lines changed

src/crimson/os/seastore/async_cleaner.cc

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,20 +1372,33 @@ SegmentCleaner::mount_ret SegmentCleaner::mount()
13721372
segment_id
13731373
).safe_then([this, FNAME, segment_id, header](auto tail)
13741374
-> scan_extents_ertr::future<> {
1375-
if (tail.segment_nonce != header.segment_nonce) {
1375+
bool tail_valid = (tail.segment_nonce == header.segment_nonce);
1376+
if (!tail_valid && header.type == segment_type_t::JOURNAL) {
13761377
return scan_no_tail_segment(header, segment_id);
13771378
}
1378-
ceph_assert(header.get_type() == tail.get_type());
1379-
1380-
sea_time_point modify_time = mod_to_timepoint(tail.modify_time);
1381-
std::size_t num_extents = tail.num_extents;
1382-
if ((modify_time == NULL_TIME && num_extents == 0) ||
1383-
(modify_time != NULL_TIME && num_extents != 0)) {
1384-
segments.update_modify_time(segment_id, modify_time, num_extents);
1385-
} else {
1386-
ERROR("illegal modify time {}", tail);
1387-
return crimson::ct_error::input_output_error::make();
1388-
}
1379+
ceph_assert(header.get_type() == tail.get_type() || !tail_valid);
1380+
1381+
sea_time_point header_time = mod_to_timepoint(header.modify_time);
1382+
if (tail_valid) {
1383+
sea_time_point tail_time = mod_to_timepoint(tail.modify_time);
1384+
std::size_t num_extents = tail.num_extents;
1385+
DEBUG("updating modify time for segment {}, "
1386+
"mod time {}-{}, num_extents {}",
1387+
segment_id, header_time, tail_time, num_extents);
1388+
if (num_extents == 0) {
1389+
ceph_assert(tail_time == NULL_TIME);
1390+
} else {
1391+
ceph_assert(header_time != NULL_TIME);
1392+
ceph_assert(tail_time != NULL_TIME);
1393+
sea_time_point avg_time = get_average_time(
1394+
header_time, 1, tail_time, 1);
1395+
segments.update_modify_time(segment_id, avg_time, num_extents);
1396+
}
1397+
} else {
1398+
DEBUG("updating modify time for segment {}, mod time {}, without tail",
1399+
segment_id, header_time);
1400+
segments.init_modify_time(segment_id, header_time);
1401+
}
13891402

13901403
init_mark_segment_closed(
13911404
segment_id,
@@ -1396,8 +1409,22 @@ SegmentCleaner::mount_ret SegmentCleaner::mount()
13961409
return seastar::now();
13971410
}).handle_error(
13981411
crimson::ct_error::enodata::handle(
1399-
[this, header, segment_id](auto) {
1400-
return scan_no_tail_segment(header, segment_id);
1412+
[this, header, segment_id, FNAME](auto) {
1413+
if (header.type == segment_type_t::JOURNAL) {
1414+
return scan_no_tail_segment(header, segment_id);
1415+
} else {
1416+
sea_time_point modify_time = mod_to_timepoint(header.modify_time);
1417+
DEBUG("updating modify time for segment {}, mod time {}",
1418+
segment_id, modify_time);
1419+
segments.init_modify_time(segment_id, modify_time);
1420+
init_mark_segment_closed(
1421+
segment_id,
1422+
header.segment_seq,
1423+
header.type,
1424+
header.category,
1425+
header.generation);
1426+
return scan_extents_ertr::now();
1427+
}
14011428
}),
14021429
crimson::ct_error::pass_further_all{}
14031430
);

src/crimson/os/seastore/async_cleaner.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ struct segment_info_t {
4343

4444
sea_time_point modify_time = NULL_TIME;
4545

46+
// Might be unavailable(0), see mount() -> init_modify_time()
4647
std::size_t num_extents = 0;
4748

4849
segment_off_t written_to = 0;
@@ -75,6 +76,13 @@ struct segment_info_t {
7576

7677
void set_closed();
7778

79+
void init_modify_time(sea_time_point _modify_time) {
80+
ceph_assert(modify_time == NULL_TIME);
81+
ceph_assert(num_extents == 0);
82+
ceph_assert(_modify_time != NULL_TIME);
83+
modify_time = _modify_time;
84+
}
85+
7886
void update_modify_time(sea_time_point _modify_time, std::size_t _num_extents) {
7987
ceph_assert(!is_closed());
8088
assert(_modify_time != NULL_TIME);
@@ -226,6 +234,15 @@ class segments_info_t {
226234

227235
void update_written_to(segment_type_t, paddr_t);
228236

237+
void init_modify_time(
238+
segment_id_t id, sea_time_point tp) {
239+
if (tp == NULL_TIME) {
240+
return;
241+
}
242+
243+
segments[id].init_modify_time(tp);
244+
}
245+
229246
void update_modify_time(
230247
segment_id_t id, sea_time_point tp, std::size_t num) {
231248
if (num == 0) {

src/crimson/os/seastore/journal/segment_allocator.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ SegmentAllocator::do_open(bool is_mkfs)
9393
alloc_tail = JOURNAL_SEQ_NULL;
9494
}
9595
auto header = segment_header_t{
96+
timepoint_to_mod(seastar::lowres_system_clock::now()),
9697
new_segment_seq,
9798
segment_id,
9899
dirty_tail,

src/crimson/os/seastore/seastore_types.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,7 @@ std::ostream &operator<<(std::ostream &out, const segment_header_t &header)
371371
<< ", dirty_tail=" << header.dirty_tail
372372
<< ", alloc_tail=" << header.alloc_tail
373373
<< ", segment_nonce=" << header.segment_nonce
374+
<< ", modify_time=" << mod_time_point_printer_t{header.modify_time}
374375
<< ")";
375376
}
376377

src/crimson/os/seastore/seastore_types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1799,6 +1799,8 @@ using segment_nonce_t = uint32_t;
17991799
* 4) Replay from the latest tails
18001800
*/
18011801
struct segment_header_t {
1802+
mod_time_point_t modify_time;
1803+
18021804
segment_seq_t segment_seq;
18031805
segment_id_t physical_segment_id; // debugging
18041806

@@ -1817,6 +1819,7 @@ struct segment_header_t {
18171819

18181820
DENC(segment_header_t, v, p) {
18191821
DENC_START(1, 1, p);
1822+
denc(v.modify_time, p);
18201823
denc(v.segment_seq, p);
18211824
denc(v.physical_segment_id, p);
18221825
denc(v.dirty_tail, p);

0 commit comments

Comments
 (0)