Skip to content

Commit 9269e68

Browse files
committed
crimson/os/seastore: alloc mapping with refcount when rewriting logical extents
Signed-off-by: Zhang Song <[email protected]>
1 parent 513bb4f commit 9269e68

File tree

5 files changed

+34
-19
lines changed

5 files changed

+34
-19
lines changed

src/crimson/os/seastore/lba_manager.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ LBAManager::update_mappings(
2222
extent->get_paddr(),
2323
nullptr // all the extents should have already been
2424
// added to the fixed_kv_btree
25-
);
25+
).discard_result();
2626
});
2727
}
2828

src/crimson/os/seastore/lba_manager.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ class LBAManager {
8787
laddr_t hint,
8888
extent_len_t len,
8989
paddr_t addr,
90-
LogicalCachedExtent &nextent) = 0;
90+
LogicalCachedExtent &nextent,
91+
extent_ref_count_t refcount = EXTENT_DEFAULT_REF_COUNT) = 0;
9192

9293
virtual alloc_extent_ret clone_mapping(
9394
Transaction &t,
@@ -187,7 +188,7 @@ class LBAManager {
187188
* update lba mapping for a delayed allocated extent
188189
*/
189190
using update_mapping_iertr = base_iertr;
190-
using update_mapping_ret = base_iertr::future<>;
191+
using update_mapping_ret = base_iertr::future<extent_ref_count_t>;
191192
virtual update_mapping_ret update_mapping(
192193
Transaction& t,
193194
laddr_t laddr,
@@ -203,7 +204,7 @@ class LBAManager {
203204
* update lba mappings for delayed allocated extents
204205
*/
205206
using update_mappings_iertr = update_mapping_iertr;
206-
using update_mappings_ret = update_mapping_ret;
207+
using update_mappings_ret = update_mappings_iertr::future<>;
207208
update_mappings_ret update_mappings(
208209
Transaction& t,
209210
const std::list<LogicalCachedExtentRef>& extents);

src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,8 @@ BtreeLBAManager::_alloc_extent(
307307
extent_len_t len,
308308
pladdr_t addr,
309309
paddr_t actual_addr,
310-
LogicalCachedExtent* nextent)
310+
LogicalCachedExtent* nextent,
311+
extent_ref_count_t refcount)
311312
{
312313
struct state_t {
313314
laddr_t last_end;
@@ -319,7 +320,7 @@ BtreeLBAManager::_alloc_extent(
319320
};
320321

321322
LOG_PREFIX(BtreeLBAManager::_alloc_extent);
322-
TRACET("{}~{}, hint={}", t, addr, len, hint);
323+
TRACET("{}~{}, hint={}, refcount={}", t, addr, len, hint, refcount);
323324

324325
ceph_assert(actual_addr != P_ADDR_NULL ? addr.is_laddr() : addr.is_paddr());
325326
auto c = get_context(t);
@@ -330,7 +331,7 @@ BtreeLBAManager::_alloc_extent(
330331
c,
331332
hint,
332333
[this, FNAME, c, hint, len, addr, lookup_attempts,
333-
&t, nextent](auto &btree, auto &state) {
334+
&t, nextent, refcount](auto &btree, auto &state) {
334335
return LBABtree::iterate_repeat(
335336
c,
336337
btree.upper_bound_right(c, hint),
@@ -366,12 +367,12 @@ BtreeLBAManager::_alloc_extent(
366367
interruptible::ready_future_marker{},
367368
seastar::stop_iteration::no);
368369
}
369-
}).si_then([FNAME, c, addr, len, hint, &btree, &state, nextent] {
370+
}).si_then([FNAME, c, addr, len, hint, &btree, &state, nextent, refcount] {
370371
return btree.insert(
371372
c,
372373
*state.insert_iter,
373374
state.last_end,
374-
lba_map_val_t{len, pladdr_t(addr), 1, 0},
375+
lba_map_val_t{len, pladdr_t(addr), refcount, 0},
375376
nextent
376377
).si_then([&state, FNAME, c, addr, len, hint, nextent](auto &&p) {
377378
auto [iter, inserted] = std::move(p);
@@ -557,6 +558,8 @@ BtreeLBAManager::update_mapping(
557558
auto &result = res.map_value;
558559
DEBUGT("laddr={}, paddr {} => {} done -- {}",
559560
t, laddr, prev_addr, addr, result);
561+
return update_mapping_iertr::make_ready_future<
562+
extent_ref_count_t>(result.refcount);
560563
},
561564
update_mapping_iertr::pass_further{},
562565
/* ENOENT in particular should be impossible */

src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ class BtreeLBAManager : public LBAManager {
221221
len,
222222
P_ADDR_ZERO,
223223
P_ADDR_NULL,
224-
nullptr);
224+
nullptr,
225+
EXTENT_DEFAULT_REF_COUNT);
225226
}
226227

227228
alloc_extent_ret clone_mapping(
@@ -240,7 +241,8 @@ class BtreeLBAManager : public LBAManager {
240241
len,
241242
intermediate_key,
242243
actual_addr,
243-
nullptr
244+
nullptr,
245+
EXTENT_DEFAULT_REF_COUNT
244246
).si_then([&t, this, intermediate_base](auto indirect_mapping) {
245247
assert(indirect_mapping->is_indirect());
246248
return update_refcount(t, intermediate_base, 1, false
@@ -265,15 +267,17 @@ class BtreeLBAManager : public LBAManager {
265267
laddr_t hint,
266268
extent_len_t len,
267269
paddr_t addr,
268-
LogicalCachedExtent &ext) final
270+
LogicalCachedExtent &ext,
271+
extent_ref_count_t refcount = EXTENT_DEFAULT_REF_COUNT) final
269272
{
270273
return _alloc_extent(
271274
t,
272275
hint,
273276
len,
274277
addr,
275278
P_ADDR_NULL,
276-
&ext);
279+
&ext,
280+
refcount);
277281
}
278282

279283
ref_ret decref_extent(
@@ -406,7 +410,8 @@ class BtreeLBAManager : public LBAManager {
406410
extent_len_t len,
407411
pladdr_t addr,
408412
paddr_t actual_addr,
409-
LogicalCachedExtent*);
413+
LogicalCachedExtent*,
414+
extent_ref_count_t refcount);
410415

411416
using _get_mapping_ret = get_mapping_iertr::future<BtreeLBAMappingRef>;
412417
_get_mapping_ret _get_mapping(

src/crimson/os/seastore/transaction_manager.cc

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ TransactionManager::rewrite_logical_extent(
467467
lextent->get_paddr(),
468468
nlextent->get_length(),
469469
nlextent->get_paddr(),
470-
nlextent.get());
470+
nlextent.get()).discard_result();
471471
} else {
472472
assert(get_extent_category(lextent->get_type()) == data_category_t::DATA);
473473
auto extents = cache->alloc_new_data_extents_by_type(
@@ -481,10 +481,11 @@ TransactionManager::rewrite_logical_extent(
481481
std::move(extents),
482482
0,
483483
lextent->get_length(),
484-
[this, lextent, &t](auto &extents, auto &off, auto &left) {
484+
extent_ref_count_t(0),
485+
[this, lextent, &t](auto &extents, auto &off, auto &left, auto &refcount) {
485486
return trans_intr::do_for_each(
486487
extents,
487-
[lextent, this, &t, &off, &left](auto &nextent) {
488+
[lextent, this, &t, &off, &left, &refcount](auto &nextent) {
488489
LOG_PREFIX(TransactionManager::rewrite_logical_extent);
489490
bool first_extent = (off == 0);
490491
ceph_assert(left >= nextent->get_length());
@@ -510,14 +511,19 @@ TransactionManager::rewrite_logical_extent(
510511
lextent->get_paddr(),
511512
nlextent->get_length(),
512513
nlextent->get_paddr(),
513-
nlextent.get());
514+
nlextent.get()
515+
).si_then([&refcount](auto c) {
516+
refcount = c;
517+
});
514518
} else {
519+
ceph_assert(refcount != 0);
515520
fut = lba_manager->alloc_extent(
516521
t,
517522
lextent->get_laddr() + off,
518523
nlextent->get_length(),
519524
nlextent->get_paddr(),
520-
*nlextent
525+
*nlextent,
526+
refcount
521527
).si_then([lextent, nlextent, off](auto mapping) {
522528
ceph_assert(mapping->get_key() == lextent->get_laddr() + off);
523529
ceph_assert(mapping->get_val() == nlextent->get_paddr());

0 commit comments

Comments
 (0)