From 79780d20919fbe8f98a4fc43186695b82f5929df Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Fri, 4 Mar 2022 16:56:09 +0800 Subject: [PATCH] crimson/os/seastore: add segment tail Signed-off-by: Xuehan Xu --- .../os/seastore/journal/segment_allocator.cc | 43 +++++++++++++++++-- .../os/seastore/journal/segment_allocator.h | 3 +- src/crimson/os/seastore/seastore_types.h | 2 + src/crimson/os/seastore/segment_manager.h | 5 +++ 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/crimson/os/seastore/journal/segment_allocator.cc b/src/crimson/os/seastore/journal/segment_allocator.cc index 5a55dc1c9fa0a..7b04f6f0cf0a8 100644 --- a/src/crimson/os/seastore/journal/segment_allocator.cc +++ b/src/crimson/os/seastore/journal/segment_allocator.cc @@ -198,8 +198,7 @@ SegmentAllocator::close_segment(bool is_rolling) { LOG_PREFIX(SegmentAllocator::close_segment); assert(can_write()); - auto seg_to_close = std::move(current_segment); - auto close_segment_id = seg_to_close->get_segment_id(); + auto close_segment_id = current_segment->get_segment_id(); INFO("{} {} close segment id={}, seq={}, written_to={}, nonce={}", type, get_device_id(), close_segment_id, @@ -209,8 +208,44 @@ SegmentAllocator::close_segment(bool is_rolling) if (is_rolling) { segment_provider.close_segment(close_segment_id); } - return seg_to_close->close( - ).safe_then([seg_to_close=std::move(seg_to_close)] { + segment_seq_t cur_segment_seq; + if (type == segment_type_t::JOURNAL) { + cur_segment_seq = next_segment_seq - 1; + } else { // OOL + cur_segment_seq = next_segment_seq; + } + journal_seq_t cur_journal_tail; + if (type == segment_type_t::JOURNAL) { + cur_journal_tail = segment_provider.get_journal_tail_target(); + } else { // OOL + cur_journal_tail = NO_DELTAS; + } + auto tail = segment_tail_t{ + cur_segment_seq, + close_segment_id, + cur_journal_tail, + current_segment_nonce}; + ceph::bufferlist bl; + encode(tail, bl); + + bufferptr bp( + ceph::buffer::create_page_aligned( + segment_manager.get_block_size())); + bp.zero(); + auto iter = bl.cbegin(); + iter.copy(bl.length(), bp.c_str()); + bl.clear(); + bl.append(bp); + + assert(bl.length() == + (size_t)segment_manager.get_rounded_tail_length()); + return current_segment->write( + segment_manager.get_segment_size() + - segment_manager.get_rounded_tail_length(), + bl).safe_then([this] { + return current_segment->close(); + }).safe_then([this] { + current_segment.reset(); }).handle_error( close_segment_ertr::pass_further{}, crimson::ct_error::assert_all{ diff --git a/src/crimson/os/seastore/journal/segment_allocator.h b/src/crimson/os/seastore/journal/segment_allocator.h index 5fec29145b8a1..70b8584cc1c61 100644 --- a/src/crimson/os/seastore/journal/segment_allocator.h +++ b/src/crimson/os/seastore/journal/segment_allocator.h @@ -70,7 +70,8 @@ class SegmentAllocator { // returns true iff the current segment has insufficient space bool needs_roll(std::size_t length) const { assert(can_write()); - auto write_capacity = current_segment->get_write_capacity(); + auto write_capacity = current_segment->get_write_capacity() + - segment_manager.get_rounded_tail_length(); return length + written_to > std::size_t(write_capacity); } diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index 113b5a280834d..b345a0c509569 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -1291,6 +1291,8 @@ struct segment_header_t { }; std::ostream &operator<<(std::ostream &out, const segment_header_t &header); +using segment_tail_t = segment_header_t; + struct record_size_t { extent_len_t plain_mdlength = 0; // mdlength without the record header extent_len_t dlength = 0; diff --git a/src/crimson/os/seastore/segment_manager.h b/src/crimson/os/seastore/segment_manager.h index c0c421e5fd627..235a9d1cad505 100644 --- a/src/crimson/os/seastore/segment_manager.h +++ b/src/crimson/os/seastore/segment_manager.h @@ -238,6 +238,11 @@ public: ceph_assert(get_size() % get_segment_size() == 0); return ((device_segment_id_t)(get_size() / get_segment_size())); } + seastore_off_t get_rounded_tail_length() const { + return p2roundup( + ceph::encoded_sizeof_bounded(), + (size_t)get_block_size()); + } virtual const seastore_meta_t &get_meta() const = 0; virtual device_id_t get_device_id() const = 0; -- 2.39.5