]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: add segment tail
authorXuehan Xu <xxhdx1985126@gmail.com>
Fri, 4 Mar 2022 08:56:09 +0000 (16:56 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Fri, 4 Mar 2022 08:56:09 +0000 (16:56 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/os/seastore/journal/segment_allocator.cc
src/crimson/os/seastore/journal/segment_allocator.h
src/crimson/os/seastore/seastore_types.h
src/crimson/os/seastore/segment_manager.h

index 5a55dc1c9fa0ada8d4d32326ce9370bca975b121..7b04f6f0cf0a86769404401c0c9df84733d951c7 100644 (file)
@@ -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{
index 5fec29145b8a18e322a4c88f61021e02f7842fb3..70b8584cc1c613dc5043bf51af151d15b38cab30 100644 (file)
@@ -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);
   }
 
index 113b5a280834d944e723e1c4eeae76fe1ebc9861..b345a0c50956973baf6a388792a7fbce3b1c873a 100644 (file)
@@ -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;
index c0c421e5fd6270246039a57a4e6f04165370096e..235a9d1cad505992c3a55c3e71eb7e25a028e544 100644 (file)
@@ -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<segment_tail_t>(),
+      (size_t)get_block_size());
+  }
   virtual const seastore_meta_t &get_meta() const = 0;
 
   virtual device_id_t get_device_id() const = 0;