]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
4 | #pragma once | |
5 | ||
6 | #include <seastar/core/future.hh> | |
7 | ||
8 | #include "include/ceph_assert.h" | |
9 | #include "include/buffer.h" | |
10 | #include "include/denc.h" | |
11 | ||
12 | #include "crimson/os/seastore/async_cleaner.h" | |
13 | #include "crimson/os/seastore/journal.h" | |
14 | #include "crimson/os/seastore/segment_manager_group.h" | |
15 | #include "crimson/os/seastore/ordering_handle.h" | |
16 | #include "crimson/os/seastore/seastore_types.h" | |
17 | #include "crimson/osd/exceptions.h" | |
18 | #include "segment_allocator.h" | |
19 | #include "crimson/os/seastore/segment_seq_allocator.h" | |
20 | #include "record_submitter.h" | |
21 | ||
22 | namespace crimson::os::seastore::journal { | |
23 | /** | |
24 | * Manages stream of atomically written records to a SegmentManager. | |
25 | */ | |
26 | class SegmentedJournal : public Journal { | |
27 | public: | |
28 | SegmentedJournal( | |
29 | SegmentProvider &segment_provider, | |
30 | JournalTrimmer &trimmer); | |
31 | ~SegmentedJournal() {} | |
32 | ||
33 | JournalTrimmer &get_trimmer() final { | |
34 | return trimmer; | |
35 | } | |
36 | ||
37 | open_for_mkfs_ret open_for_mkfs() final; | |
38 | ||
39 | open_for_mount_ret open_for_mount() final; | |
40 | ||
41 | close_ertr::future<> close() final; | |
42 | ||
43 | submit_record_ret submit_record( | |
44 | record_t &&record, | |
45 | OrderingHandle &handle) final; | |
46 | ||
47 | seastar::future<> flush(OrderingHandle &handle) final; | |
48 | ||
49 | replay_ret replay(delta_handler_t &&delta_handler) final; | |
50 | ||
51 | void set_write_pipeline(WritePipeline *_write_pipeline) final { | |
52 | write_pipeline = _write_pipeline; | |
53 | } | |
54 | ||
55 | journal_type_t get_type() final { | |
56 | return journal_type_t::SEGMENTED; | |
57 | } | |
58 | seastar::future<> finish_commit(transaction_type_t type) { | |
59 | return seastar::now(); | |
60 | } | |
61 | ||
62 | private: | |
63 | submit_record_ret do_submit_record( | |
64 | record_t &&record, | |
65 | OrderingHandle &handle | |
66 | ); | |
67 | ||
68 | SegmentSeqAllocatorRef segment_seq_allocator; | |
69 | SegmentAllocator journal_segment_allocator; | |
70 | RecordSubmitter record_submitter; | |
71 | SegmentManagerGroup &sm_group; | |
72 | JournalTrimmer &trimmer; | |
73 | WritePipeline* write_pipeline = nullptr; | |
74 | ||
75 | /// return ordered vector of segments to replay | |
76 | using replay_segments_t = std::vector< | |
77 | std::pair<journal_seq_t, segment_header_t>>; | |
78 | using prep_replay_segments_fut = replay_ertr::future< | |
79 | replay_segments_t>; | |
80 | prep_replay_segments_fut prep_replay_segments( | |
81 | std::vector<std::pair<segment_id_t, segment_header_t>> segments); | |
82 | ||
83 | /// scan the last segment for tail deltas | |
84 | using scan_last_segment_ertr = replay_ertr; | |
85 | scan_last_segment_ertr::future<> scan_last_segment( | |
86 | const segment_id_t&, const segment_header_t&); | |
87 | ||
88 | struct replay_stats_t { | |
89 | std::size_t num_record_groups = 0; | |
90 | std::size_t num_records = 0; | |
91 | std::size_t num_alloc_deltas = 0; | |
92 | std::size_t num_dirty_deltas = 0; | |
93 | }; | |
94 | ||
95 | /// replays records starting at start through end of segment | |
96 | replay_ertr::future<> | |
97 | replay_segment( | |
98 | journal_seq_t start, ///< [in] starting addr, seq | |
99 | segment_header_t header, ///< [in] segment header | |
100 | delta_handler_t &delta_handler, ///< [in] processes deltas in order | |
101 | replay_stats_t &stats ///< [out] replay stats | |
102 | ); | |
103 | }; | |
104 | ||
105 | } |