1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
6 #include "crimson/os/seastore/cache.h"
7 #include "crimson/os/seastore/cached_extent.h"
8 #include "crimson/os/seastore/transaction.h"
10 namespace crimson::os::seastore
{
13 * Abstract interface for managing back references that map paddr_t to laddr_t
15 class BackrefManager
{
17 using base_ertr
= crimson::errorator
<
18 crimson::ct_error::input_output_error
>;
19 using base_iertr
= trans_iertr
<base_ertr
>;
21 using mkfs_iertr
= base_iertr
;
22 using mkfs_ret
= mkfs_iertr::future
<>;
23 virtual mkfs_ret
mkfs(
27 * Fetches mappings for paddr_t in range [offset, offset + len)
29 * Future will not resolve until all pins have resolved
31 using get_mappings_iertr
= base_iertr
;
32 using get_mappings_ret
= get_mappings_iertr::future
<backref_pin_list_t
>;
33 virtual get_mappings_ret
get_mappings(
39 * Fetches the mapping for paddr_t
41 * Future will not resolve until the pin has resolved
43 using get_mapping_iertr
= base_iertr::extend
<
44 crimson::ct_error::enoent
>;
45 using get_mapping_ret
= get_mapping_iertr::future
<BackrefMappingRef
>;
46 virtual get_mapping_ret
get_mapping(
53 * rewrite extent into passed transaction
55 using rewrite_extent_iertr
= base_iertr
;
56 using rewrite_extent_ret
= rewrite_extent_iertr::future
<>;
57 virtual rewrite_extent_ret
rewrite_extent(
59 CachedExtentRef extent
) = 0;
62 * Insert new paddr_t -> laddr_t mapping
64 using new_mapping_iertr
= base_iertr
;
65 using new_mapping_ret
= new_mapping_iertr::future
<BackrefMappingRef
>;
66 virtual new_mapping_ret
new_mapping(
71 extent_types_t type
) = 0;
74 * Check if a CachedExtent is alive, should be called
75 * after replay on each cached extent.
77 * @return returns whether the extent is alive
79 using init_cached_extent_iertr
= base_iertr
;
80 using init_cached_extent_ret
= init_cached_extent_iertr::future
<bool>;
81 virtual init_cached_extent_ret
init_cached_extent(
83 CachedExtentRef e
) = 0;
85 virtual Cache::backref_entry_query_mset_t
86 get_cached_backref_entries_in_range(
90 using retrieve_backref_extents_in_range_iertr
= base_iertr
;
91 using retrieve_backref_extents_in_range_ret
=
92 retrieve_backref_extents_in_range_iertr::future
<std::vector
<CachedExtentRef
>>;
93 virtual retrieve_backref_extents_in_range_ret
94 retrieve_backref_extents_in_range(
99 virtual void cache_new_backref_extent(
102 extent_types_t type
) = 0;
105 * merge in-cache paddr_t -> laddr_t mappings to the on-disk backref tree
107 using merge_cached_backrefs_iertr
= base_iertr
;
108 using merge_cached_backrefs_ret
= merge_cached_backrefs_iertr::future
<journal_seq_t
>;
109 virtual merge_cached_backrefs_ret
merge_cached_backrefs(
111 const journal_seq_t
&limit
,
112 const uint64_t max
) = 0;
114 struct remove_mapping_result_t
{
115 paddr_t offset
= P_ADDR_NULL
;
116 extent_len_t len
= 0;
117 laddr_t laddr
= L_ADDR_NULL
;
121 * delete the mapping for paddr_t offset
123 using remove_mapping_iertr
= base_iertr::extend
<
124 crimson::ct_error::enoent
>;
125 using remove_mapping_ret
= remove_mapping_iertr::future
<remove_mapping_result_t
>;
126 virtual remove_mapping_ret
remove_mapping(
131 * scan all extents in both tree and cache,
132 * including backref extents, logical extents and lba extents,
133 * visit them with scan_mapped_space_func_t
135 using scan_mapped_space_iertr
= base_iertr
;
136 using scan_mapped_space_ret
= scan_mapped_space_iertr::future
<>;
137 using scan_mapped_space_func_t
= std::function
<
138 void(paddr_t
, paddr_t
, extent_len_t
, extent_types_t
, laddr_t
)>;
139 virtual scan_mapped_space_ret
scan_mapped_space(
141 scan_mapped_space_func_t
&&f
) = 0;
143 virtual ~BackrefManager() {}
146 using BackrefManagerRef
=
147 std::unique_ptr
<BackrefManager
>;
149 BackrefManagerRef
create_backref_manager(
152 } // namespace crimson::os::seastore::backref