]> git.proxmox.com Git - ceph.git/blame - ceph/src/crimson/os/seastore/journal/segmented_journal.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / crimson / os / seastore / journal / segmented_journal.h
CommitLineData
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
22namespace crimson::os::seastore::journal {
23/**
24 * Manages stream of atomically written records to a SegmentManager.
25 */
26class SegmentedJournal : public Journal {
27public:
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
62private:
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}