Skip to content

Commit 79780d2

Browse files
committed
crimson/os/seastore: add segment tail
Signed-off-by: Xuehan Xu <[email protected]>
1 parent 0c435d8 commit 79780d2

File tree

4 files changed

+48
-5
lines changed

4 files changed

+48
-5
lines changed

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

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,7 @@ SegmentAllocator::close_segment(bool is_rolling)
198198
{
199199
LOG_PREFIX(SegmentAllocator::close_segment);
200200
assert(can_write());
201-
auto seg_to_close = std::move(current_segment);
202-
auto close_segment_id = seg_to_close->get_segment_id();
201+
auto close_segment_id = current_segment->get_segment_id();
203202
INFO("{} {} close segment id={}, seq={}, written_to={}, nonce={}",
204203
type, get_device_id(),
205204
close_segment_id,
@@ -209,8 +208,44 @@ SegmentAllocator::close_segment(bool is_rolling)
209208
if (is_rolling) {
210209
segment_provider.close_segment(close_segment_id);
211210
}
212-
return seg_to_close->close(
213-
).safe_then([seg_to_close=std::move(seg_to_close)] {
211+
segment_seq_t cur_segment_seq;
212+
if (type == segment_type_t::JOURNAL) {
213+
cur_segment_seq = next_segment_seq - 1;
214+
} else { // OOL
215+
cur_segment_seq = next_segment_seq;
216+
}
217+
journal_seq_t cur_journal_tail;
218+
if (type == segment_type_t::JOURNAL) {
219+
cur_journal_tail = segment_provider.get_journal_tail_target();
220+
} else { // OOL
221+
cur_journal_tail = NO_DELTAS;
222+
}
223+
auto tail = segment_tail_t{
224+
cur_segment_seq,
225+
close_segment_id,
226+
cur_journal_tail,
227+
current_segment_nonce};
228+
ceph::bufferlist bl;
229+
encode(tail, bl);
230+
231+
bufferptr bp(
232+
ceph::buffer::create_page_aligned(
233+
segment_manager.get_block_size()));
234+
bp.zero();
235+
auto iter = bl.cbegin();
236+
iter.copy(bl.length(), bp.c_str());
237+
bl.clear();
238+
bl.append(bp);
239+
240+
assert(bl.length() ==
241+
(size_t)segment_manager.get_rounded_tail_length());
242+
return current_segment->write(
243+
segment_manager.get_segment_size()
244+
- segment_manager.get_rounded_tail_length(),
245+
bl).safe_then([this] {
246+
return current_segment->close();
247+
}).safe_then([this] {
248+
current_segment.reset();
214249
}).handle_error(
215250
close_segment_ertr::pass_further{},
216251
crimson::ct_error::assert_all{

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ class SegmentAllocator {
7070
// returns true iff the current segment has insufficient space
7171
bool needs_roll(std::size_t length) const {
7272
assert(can_write());
73-
auto write_capacity = current_segment->get_write_capacity();
73+
auto write_capacity = current_segment->get_write_capacity()
74+
- segment_manager.get_rounded_tail_length();
7475
return length + written_to > std::size_t(write_capacity);
7576
}
7677

src/crimson/os/seastore/seastore_types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,6 +1291,8 @@ struct segment_header_t {
12911291
};
12921292
std::ostream &operator<<(std::ostream &out, const segment_header_t &header);
12931293

1294+
using segment_tail_t = segment_header_t;
1295+
12941296
struct record_size_t {
12951297
extent_len_t plain_mdlength = 0; // mdlength without the record header
12961298
extent_len_t dlength = 0;

src/crimson/os/seastore/segment_manager.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ class SegmentManager {
238238
ceph_assert(get_size() % get_segment_size() == 0);
239239
return ((device_segment_id_t)(get_size() / get_segment_size()));
240240
}
241+
seastore_off_t get_rounded_tail_length() const {
242+
return p2roundup(
243+
ceph::encoded_sizeof_bounded<segment_tail_t>(),
244+
(size_t)get_block_size());
245+
}
241246
virtual const seastore_meta_t &get_meta() const = 0;
242247

243248
virtual device_id_t get_device_id() const = 0;

0 commit comments

Comments
 (0)