]>
Commit | Line | Data |
---|---|---|
f67539c2 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 <iosfwd> | |
7 | #include <list> | |
8 | ||
9 | #include <boost/intrusive_ptr.hpp> | |
10 | #include <boost/smart_ptr/intrusive_ref_counter.hpp> | |
11 | ||
12 | #include <seastar/core/future.hh> | |
13 | ||
14 | #include "crimson/osd/exceptions.h" | |
15 | #include "crimson/os/seastore/seastore_types.h" | |
16 | #include "crimson/os/seastore/transaction_manager.h" | |
17 | ||
18 | #define PAGE_SIZE 4096 | |
19 | #define EXTMAP_BLOCK_SIZE 4096 | |
20 | ||
21 | namespace crimson::os::seastore { | |
22 | ||
23 | struct lext_map_val_t { | |
24 | laddr_t laddr; | |
25 | extent_len_t length = 0; | |
26 | ||
27 | lext_map_val_t( | |
28 | laddr_t laddr, | |
29 | extent_len_t length) | |
30 | : laddr(laddr), length(length) {} | |
31 | ||
32 | }; | |
33 | ||
34 | class extent_mapping_t | |
35 | { | |
36 | public: | |
37 | objaddr_t logical_offset = 0; //offset in object | |
38 | laddr_t laddr; // lextent start address aligned with block size. | |
39 | extent_len_t length = 0; | |
40 | explicit extent_mapping_t(objaddr_t lo) : logical_offset(lo) { } | |
41 | ||
42 | extent_mapping_t( | |
43 | objaddr_t lo, | |
44 | laddr_t laddr, | |
45 | extent_len_t length) | |
46 | : logical_offset(lo), laddr(laddr), length(length) {} | |
47 | ||
48 | ~extent_mapping_t() {} | |
49 | }; | |
50 | ||
51 | enum class extmap_root_state_t : uint8_t { | |
52 | INITIAL = 0, | |
53 | MUTATED = 1, | |
54 | NONE = 0xFF | |
55 | }; | |
56 | ||
57 | using extent_map_list_t = std::list<extent_mapping_t>; | |
58 | std::ostream &operator<<(std::ostream &out, const extent_mapping_t &rhs); | |
59 | std::ostream &operator<<(std::ostream &out, const extent_map_list_t &rhs); | |
60 | ||
61 | struct extmap_root_t { | |
62 | depth_t depth = 0; | |
63 | extmap_root_state_t state; | |
64 | laddr_t extmap_root_laddr; | |
65 | extmap_root_t(depth_t dep, laddr_t laddr) | |
66 | : depth(dep), | |
67 | extmap_root_laddr(laddr) { state = extmap_root_state_t::INITIAL; } | |
68 | }; | |
69 | ||
70 | /** | |
71 | * Abstract interface for managing the object inner offset to logical addr mapping | |
72 | * each onode has an extentmap tree for a particular onode. | |
73 | */ | |
74 | class ExtentMapManager { | |
75 | public: | |
76 | using initialize_extmap_ertr = TransactionManager::alloc_extent_ertr; | |
77 | using initialize_extmap_ret = initialize_extmap_ertr::future<extmap_root_t>; | |
78 | virtual initialize_extmap_ret initialize_extmap(Transaction &t) = 0; | |
79 | ||
80 | /* find_lextents | |
81 | * | |
82 | * Return a list of all extent_mapping_t overlapping any portion of lo~len. | |
83 | * or if not find any overlap extent_mapping_t will return the next extent after the range. | |
84 | */ | |
85 | using find_lextent_ertr = TransactionManager::read_extent_ertr; | |
86 | using find_lextent_ret = find_lextent_ertr::future<extent_map_list_t>; | |
87 | virtual find_lextent_ret | |
88 | find_lextent(const extmap_root_t &extmap_root, Transaction &t, objaddr_t lo, extent_len_t len) = 0; | |
89 | ||
90 | /* add_lextent | |
91 | * | |
92 | * add a new mapping (object offset -> laddr, length) to extent map | |
93 | * return the added extent_mapping_t | |
94 | */ | |
95 | using add_lextent_ertr = TransactionManager::read_extent_ertr; | |
96 | using add_lextent_ret = add_lextent_ertr::future<extent_mapping_t>; | |
97 | virtual add_lextent_ret | |
98 | add_lextent(extmap_root_t &extmap_root, Transaction &t, objaddr_t lo, lext_map_val_t val) = 0; | |
99 | ||
100 | /* rm_lextent | |
101 | * | |
102 | * remove an existing extent mapping from extent map | |
103 | * return true if the extent mapping is removed, otherwise return false | |
104 | */ | |
105 | using rm_lextent_ertr = TransactionManager::read_extent_ertr; | |
106 | using rm_lextent_ret = rm_lextent_ertr::future<bool>; | |
107 | virtual rm_lextent_ret rm_lextent(extmap_root_t &extmap_root, Transaction &t, objaddr_t lo, lext_map_val_t val) = 0; | |
108 | ||
109 | virtual ~ExtentMapManager() {} | |
110 | }; | |
111 | using ExtentMapManagerRef = std::unique_ptr<ExtentMapManager>; | |
112 | ||
113 | namespace extentmap_manager { | |
114 | /* creat ExtentMapManager for an extentmap | |
115 | * if it is a new extmap after create_extentmap_manager need call initialize_extmap | |
116 | * to initialize the extent map before use it | |
117 | * if it is an exsiting extmap, needn't initialize_extmap | |
118 | */ | |
119 | ExtentMapManagerRef create_extentmap_manager( | |
120 | TransactionManager &trans_manager); | |
121 | ||
122 | } | |
123 | ||
124 | } |