Skip to content

Commit edbce5f

Browse files
authored
Merge pull request ceph#62633 from cyx1231st/wip-seastore-le-map-cleanup
crimson/os/seastore: cleanups related to lba and cache Reviewed-by: Xuehan Xu <[email protected]> Reviewed-by: Zhang Song <[email protected]>
2 parents 7126030 + 9c73fc6 commit edbce5f

File tree

11 files changed

+396
-311
lines changed

11 files changed

+396
-311
lines changed

src/crimson/os/seastore/btree/btree_range_pin.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,8 @@ class BtreeNodeMapping : public PhysicalNodeMapping<key_t, val_t> {
190190
auto &trans = extent.retired_transactions;
191191
unviewable = (trans.find(trans_id, trans_spec_view_t::cmp_t()) !=
192192
trans.end());
193-
assert(unviewable == t.is_retired(extent.get_paddr(), extent.get_length()));
193+
assert(unviewable ==
194+
t.is_stable_extent_retired(extent.get_paddr(), extent.get_length()));
194195
}
195196
return unviewable;
196197
}

src/crimson/os/seastore/cache.cc

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -51,70 +51,68 @@ Cache::~Cache()
5151

5252
// TODO: this method can probably be removed in the future
5353
Cache::retire_extent_ret Cache::retire_extent_addr(
54-
Transaction &t, paddr_t addr, extent_len_t length)
54+
Transaction &t, paddr_t paddr, extent_len_t length)
5555
{
5656
LOG_PREFIX(Cache::retire_extent_addr);
57-
TRACET("retire {}~0x{:x}", t, addr, length);
57+
TRACET("retire {}~0x{:x}", t, paddr, length);
5858

59-
assert(addr.is_real() && !addr.is_block_relative());
59+
assert(paddr.is_real() && !paddr.is_block_relative());
6060

6161
CachedExtentRef ext;
62-
auto result = t.get_extent(addr, &ext);
62+
auto result = t.get_extent(paddr, &ext);
6363
if (result == Transaction::get_extent_ret::PRESENT) {
64-
DEBUGT("retire {}~0x{:x} on t -- {}", t, addr, length, *ext);
65-
t.add_present_to_retired_set(CachedExtentRef(&*ext));
64+
DEBUGT("retire {}~0x{:x} on t -- {}",
65+
t, paddr, length, *ext);
66+
t.add_present_to_retired_set(ext);
6667
return retire_extent_iertr::now();
6768
} else if (result == Transaction::get_extent_ret::RETIRED) {
68-
ERRORT("retire {}~0x{:x} failed, already retired -- {}", t, addr, length, *ext);
69+
ERRORT("retire {}~0x{:x} failed, already retired -- {}",
70+
t, paddr, length, *ext);
6971
ceph_abort();
7072
}
7173

72-
// any relative addr must have been on the transaction
73-
assert(!addr.is_relative());
74+
// any relative paddr must have been on the transaction
75+
assert(!paddr.is_relative());
7476

7577
// absent from transaction
7678
// retiring is not included by the cache hit metrics
77-
ext = query_cache(addr);
79+
ext = query_cache(paddr);
7880
if (ext) {
79-
DEBUGT("retire {}~0x{:x} in cache -- {}", t, addr, length, *ext);
81+
DEBUGT("retire {}~0x{:x} in cache -- {}", t, paddr, length, *ext);
8082
} else {
8183
// add a new placeholder to Cache
8284
ext = CachedExtent::make_cached_extent_ref<
8385
RetiredExtentPlaceholder>(length);
84-
ext->init(CachedExtent::extent_state_t::CLEAN,
85-
addr,
86-
PLACEMENT_HINT_NULL,
87-
NULL_GENERATION,
88-
TRANS_ID_NULL);
86+
ext->init(
87+
CachedExtent::extent_state_t::CLEAN, paddr,
88+
PLACEMENT_HINT_NULL, NULL_GENERATION, TRANS_ID_NULL);
8989
DEBUGT("retire {}~0x{:x} as placeholder, add extent -- {}",
90-
t, addr, length, *ext);
90+
t, paddr, length, *ext);
9191
add_extent(ext);
9292
}
9393
t.add_absent_to_retired_set(ext);
9494
return retire_extent_iertr::now();
9595
}
9696

9797
void Cache::retire_absent_extent_addr(
98-
Transaction &t, paddr_t addr, extent_len_t length)
98+
Transaction &t, paddr_t paddr, extent_len_t length)
9999
{
100100
CachedExtentRef ext;
101101
#ifndef NDEBUG
102-
auto result = t.get_extent(addr, &ext);
102+
auto result = t.get_extent(paddr, &ext);
103103
assert(result != Transaction::get_extent_ret::PRESENT
104104
&& result != Transaction::get_extent_ret::RETIRED);
105-
assert(!query_cache(addr));
105+
assert(!query_cache(paddr));
106106
#endif
107107
LOG_PREFIX(Cache::retire_absent_extent_addr);
108108
// add a new placeholder to Cache
109109
ext = CachedExtent::make_cached_extent_ref<
110110
RetiredExtentPlaceholder>(length);
111-
ext->init(CachedExtent::extent_state_t::CLEAN,
112-
addr,
113-
PLACEMENT_HINT_NULL,
114-
NULL_GENERATION,
115-
TRANS_ID_NULL);
111+
ext->init(
112+
CachedExtent::extent_state_t::CLEAN, paddr,
113+
PLACEMENT_HINT_NULL, NULL_GENERATION, TRANS_ID_NULL);
116114
DEBUGT("retire {}~0x{:x} as placeholder, add extent -- {}",
117-
t, addr, length, *ext);
115+
t, paddr, length, *ext);
118116
add_extent(ext);
119117
t.add_absent_to_retired_set(ext);
120118
}
@@ -1062,15 +1060,15 @@ void Cache::on_transaction_destruct(Transaction& t)
10621060
}
10631061
}
10641062

1065-
CachedExtentRef Cache::alloc_new_extent_by_type(
1063+
CachedExtentRef Cache::alloc_new_non_data_extent_by_type(
10661064
Transaction &t, ///< [in, out] current transaction
10671065
extent_types_t type, ///< [in] type tag
10681066
extent_len_t length, ///< [in] length
10691067
placement_hint_t hint, ///< [in] user hint
10701068
rewrite_gen_t gen ///< [in] rewrite generation
10711069
)
10721070
{
1073-
LOG_PREFIX(Cache::alloc_new_extent_by_type);
1071+
LOG_PREFIX(Cache::alloc_new_non_data_extent_by_type);
10741072
SUBDEBUGT(seastore_cache, "allocate {} 0x{:x}B, hint={}, gen={}",
10751073
t, type, length, hint, rewrite_gen_printer_t{gen});
10761074
ceph_assert(get_extent_category(type) == data_category_t::METADATA);
@@ -1181,7 +1179,6 @@ CachedExtentRef Cache::duplicate_for_write(
11811179
assert(!i->prior_poffset);
11821180
auto [iter, inserted] = i->mutation_pending_extents.insert(*ret);
11831181
ceph_assert(inserted);
1184-
t.add_mutated_extent(ret);
11851182
if (is_root_type(ret->get_type())) {
11861183
t.root = ret->cast<RootBlock>();
11871184
} else {
@@ -1196,6 +1193,8 @@ CachedExtentRef Cache::duplicate_for_write(
11961193
assert(ret->is_logical());
11971194
static_cast<LogicalCachedExtent&>(*ret).set_laddr(lextent.get_laddr());
11981195
}
1196+
1197+
t.add_mutated_extent(ret);
11991198
DEBUGT("{} -> {}", t, *i, *ret);
12001199
return ret;
12011200
}

src/crimson/os/seastore/cache.h

Lines changed: 63 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -201,20 +201,21 @@ class Cache : public ExtentTransViewRetriever {
201201
get_extent_if_cached_iertr::future<CachedExtentRef>;
202202
get_extent_if_cached_ret get_extent_if_cached(
203203
Transaction &t,
204-
paddr_t offset,
204+
paddr_t paddr,
205+
extent_len_t len,
205206
extent_types_t type) {
206-
CachedExtentRef ret;
207207
LOG_PREFIX(Cache::get_extent_if_cached);
208-
auto result = t.get_extent(offset, &ret);
209208
const auto t_src = t.get_src();
209+
CachedExtentRef ret;
210+
auto result = t.get_extent(paddr, &ret);
210211
extent_access_stats_t& access_stats = get_by_ext(
211212
get_by_src(stats.access_by_src_ext, t_src),
212213
type);
213214
if (result == Transaction::get_extent_ret::RETIRED) {
214-
SUBDEBUGT(seastore_cache, "{} {} is retired on t -- {}",
215-
t, type, offset, *ret);
216-
return get_extent_if_cached_iertr::make_ready_future<
217-
CachedExtentRef>(ret);
215+
SUBDEBUGT(seastore_cache,
216+
"{} {}~0x{:x} is retired on t",
217+
t, type, paddr, len);
218+
return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>();
218219
} else if (result == Transaction::get_extent_ret::PRESENT) {
219220
if (ret->is_stable()) {
220221
if (ret->is_dirty()) {
@@ -229,32 +230,46 @@ class Cache : public ExtentTransViewRetriever {
229230
++stats.access.s.trans_pending;
230231
}
231232

232-
if (ret->is_fully_loaded()) {
233-
SUBTRACET(seastore_cache, "{} {} is present on t -- {}",
234-
t, type, offset, *ret);
235-
return ret->wait_io().then([ret] {
236-
return get_extent_if_cached_iertr::make_ready_future<
237-
CachedExtentRef>(ret);
238-
});
239-
} else {
233+
if (ret->get_length() != len) {
240234
SUBDEBUGT(seastore_cache,
241-
"{} {} is present on t -- {} without fully loaded",
242-
t, type, offset, *ret);
243-
return get_extent_if_cached_iertr::make_ready_future<
244-
CachedExtentRef>();
235+
"{} {}~0x{:x} is present on t with inconsistent length 0x{:x} -- {}",
236+
t, type, paddr, len, ret->get_length(), *ret);
237+
return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>();
245238
}
239+
240+
ceph_assert(ret->get_type() == type);
241+
if (!ret->is_fully_loaded()) {
242+
SUBDEBUGT(seastore_cache,
243+
"{} {}~0x{:x} is present on t without fully loaded -- {}",
244+
t, type, paddr, len, *ret);
245+
return trans_intr::make_interruptible(
246+
do_read_extent_maybe_partial<CachedExtent>(
247+
ret->cast<CachedExtent>(), 0, ret->get_length(), &t_src));
248+
}
249+
250+
SUBTRACET(seastore_cache,
251+
"{} {}~0x{:x} is present on t -- {}",
252+
t, type, paddr, len, *ret);
253+
return ret->wait_io().then([ret] {
254+
return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>(ret);
255+
});
246256
}
247257

248258
// get_extent_ret::ABSENT from transaction
249-
ret = query_cache(offset);
259+
ret = query_cache(paddr);
250260
if (!ret) {
251-
SUBDEBUGT(seastore_cache, "{} {} is absent", t, type, offset);
261+
SUBDEBUGT(seastore_cache,
262+
"{} {}~0x{:x} is absent in cache",
263+
t, type, paddr, len);
252264
account_absent_access(t_src);
253265
return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>();
254-
} else if (is_retired_placeholder_type(ret->get_type())) {
266+
}
267+
268+
if (is_retired_placeholder_type(ret->get_type())) {
255269
// retired_placeholder is not really cached yet
256-
SUBDEBUGT(seastore_cache, "{} {} is absent(placeholder)",
257-
t, type, offset);
270+
SUBDEBUGT(seastore_cache,
271+
"{} {}~0x{:x} ~0x{:x} is absent(placeholder) in cache",
272+
t, type, paddr, len, ret->get_length());
258273
account_absent_access(t_src);
259274
return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>();
260275
}
@@ -267,18 +282,29 @@ class Cache : public ExtentTransViewRetriever {
267282
++stats.access.s.cache_lru;
268283
}
269284

270-
if (!ret->is_fully_loaded()) {
271-
// ignore non-full extent
285+
if (ret->get_length() != len) {
272286
SUBDEBUGT(seastore_cache,
273-
"{} {} is present without fully loaded", t, type, offset);
287+
"{} {}~0x{:x} is present in cache with inconsistent length 0x{:x} -- {}",
288+
t, type, paddr, len, ret->get_length(), *ret);
274289
return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>();
275290
}
276291

277-
// present in cache(fully loaded) and is not a retired_placeholder
278-
SUBDEBUGT(seastore_cache, "{} {} is present in cache -- {}",
279-
t, type, offset, *ret);
292+
ceph_assert(ret->get_type() == type);
280293
t.add_to_read_set(ret);
281294
touch_extent(*ret, &t_src, t.get_cache_hint());
295+
if (!ret->is_fully_loaded()) {
296+
SUBDEBUGT(seastore_cache,
297+
"{} {}~0x{:x} is present without fully loaded in cache -- {}",
298+
t, type, paddr, len, *ret);
299+
return trans_intr::make_interruptible(
300+
do_read_extent_maybe_partial<CachedExtent>(
301+
ret->cast<CachedExtent>(), 0, ret->get_length(), &t_src));
302+
}
303+
304+
// present in cache(fully loaded) and is not a retired_placeholder
305+
SUBDEBUGT(seastore_cache,
306+
"{} {}~0x{:x} is present in cache -- {}",
307+
t, type, paddr, len, *ret);
282308
return ret->wait_io().then([ret] {
283309
return get_extent_if_cached_iertr::make_ready_future<
284310
CachedExtentRef>(ret);
@@ -685,6 +711,8 @@ class Cache : public ExtentTransViewRetriever {
685711
SUBDEBUG(seastore_cache,
686712
"{} {}~0x{:x} is absent(placeholder), add extent and reading range 0x{:x}~0x{:x} ... -- {}",
687713
T::TYPE, offset, length, partial_off, partial_len, *ret);
714+
extent_init_func(*ret);
715+
on_cache(*ret);
688716
extents_index.replace(*ret, *cached);
689717

690718
// replace placeholder in transactions
@@ -694,8 +722,6 @@ class Cache : public ExtentTransViewRetriever {
694722
}
695723

696724
cached->state = CachedExtent::extent_state_t::INVALID;
697-
extent_init_func(*ret);
698-
on_cache(*ret);
699725
return read_extent<T>(
700726
std::move(ret), partial_off, partial_len, p_src);
701727
}
@@ -1101,11 +1127,11 @@ class Cache : public ExtentTransViewRetriever {
11011127
}
11021128

11031129
/**
1104-
* alloc_new_extent
1130+
* alloc_new_non_data_extent_by_type
11051131
*
1106-
* Allocates a fresh extent. addr will be relative until commit.
1132+
* Allocates a fresh non data extent. addr will be relative until commit.
11071133
*/
1108-
CachedExtentRef alloc_new_extent_by_type(
1134+
CachedExtentRef alloc_new_non_data_extent_by_type(
11091135
Transaction &t, ///< [in, out] current transaction
11101136
extent_types_t type, ///< [in] type tag
11111137
extent_len_t length, ///< [in] length
@@ -1114,9 +1140,9 @@ class Cache : public ExtentTransViewRetriever {
11141140
);
11151141

11161142
/**
1117-
* alloc_new_extent
1143+
* alloc_new_data_extents_by_type
11181144
*
1119-
* Allocates a fresh extent. addr will be relative until commit.
1145+
* Allocates fresh data extents. addr will be relative until commit.
11201146
*/
11211147
std::vector<CachedExtentRef> alloc_new_data_extents_by_type(
11221148
Transaction &t, ///< [in, out] current transaction

src/crimson/os/seastore/cached_extent.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,14 @@ class ExtentIndex {
12581258
return extent_index.find(offset, paddr_cmp());
12591259
}
12601260

1261+
bool exists(CachedExtent& extent) const {
1262+
auto iter = extent_index.find(extent.get_paddr(), paddr_cmp());
1263+
if (iter == extent_index.end()) {
1264+
return false;
1265+
}
1266+
return (&*iter == &extent);
1267+
}
1268+
12611269
auto begin() {
12621270
return extent_index.begin();
12631271
}
@@ -1336,12 +1344,12 @@ class RetiredExtentPlaceholder : public CachedExtent {
13361344
: CachedExtent(CachedExtent::retired_placeholder_construct_t{}, length) {}
13371345

13381346
CachedExtentRef duplicate_for_write(Transaction&) final {
1339-
ceph_assert(0 == "Should never happen for a placeholder");
1347+
ceph_abort("Should never happen for a placeholder");
13401348
return CachedExtentRef();
13411349
}
13421350

13431351
ceph::bufferlist get_delta() final {
1344-
ceph_assert(0 == "Should never happen for a placeholder");
1352+
ceph_abort("Should never happen for a placeholder");
13451353
return ceph::bufferlist();
13461354
}
13471355

@@ -1352,7 +1360,7 @@ class RetiredExtentPlaceholder : public CachedExtent {
13521360

13531361
void apply_delta_and_adjust_crc(
13541362
paddr_t base, const ceph::bufferlist &bl) final {
1355-
ceph_assert(0 == "Should never happen for a placeholder");
1363+
ceph_abort("Should never happen for a placeholder");
13561364
}
13571365

13581366
void on_rewrite(Transaction &, CachedExtent&, extent_len_t) final {}
@@ -1362,7 +1370,7 @@ class RetiredExtentPlaceholder : public CachedExtent {
13621370
}
13631371

13641372
void on_delta_write(paddr_t record_block_offset) final {
1365-
ceph_assert(0 == "Should never happen for a placeholder");
1373+
ceph_abort("Should never happen for a placeholder");
13661374
}
13671375
};
13681376

@@ -1420,10 +1428,13 @@ class LogicalCachedExtent : public CachedExtent {
14201428
extent_len_t len;
14211429
};
14221430
virtual std::optional<modified_region_t> get_modified_region() {
1431+
ceph_abort("Unsupported");
14231432
return std::nullopt;
14241433
}
14251434

1426-
virtual void clear_modified_region() {}
1435+
virtual void clear_modified_region() {
1436+
ceph_abort("Unsupported");
1437+
}
14271438

14281439
virtual ~LogicalCachedExtent() {}
14291440

@@ -1497,7 +1508,7 @@ template <typename T>
14971508
using lextent_list_t = addr_extent_list_base_t<
14981509
laddr_t, TCachedExtentRef<T>>;
14991510

1500-
}
1511+
} // namespace crimson::os::seastore
15011512

15021513
#if FMT_VERSION >= 90000
15031514
template <> struct fmt::formatter<crimson::os::seastore::CachedExtent> : fmt::ostream_formatter {};

0 commit comments

Comments
 (0)