Skip to content

Commit 6e65a1a

Browse files
authored
Merge pull request ceph#56627 from zhscn/wip-rewrite-snap-refcount
crimson/os/seastore: alloc mapping with refcount when rewriting logical extents Reviewed-by: Yingxin Cheng <[email protected]> Reviewed-by: Chunmei Liu <[email protected]>
2 parents a971fd5 + 9269e68 commit 6e65a1a

18 files changed

+126
-90
lines changed

src/crimson/common/interruptible_future.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,9 @@ class [[nodiscard]] interruptible_future_detail<
801801
return safe_then_interruptible(std::forward<Args>(args)...);
802802
}
803803

804+
auto discard_result() noexcept {
805+
return si_then([](auto &&) {});
806+
}
804807

805808
template<bool interruptible = true, typename ValueInterruptCondT, typename ErrorVisitorT,
806809
typename U = T, std::enable_if_t<!std::is_void_v<U> && interruptible, int> = 0>

src/crimson/os/seastore/async_cleaner.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1412,7 +1412,7 @@ SegmentCleaner::scan_extents_ret SegmentCleaner::scan_no_tail_segment(
14121412
cursor,
14131413
segment_header.segment_nonce,
14141414
segments.get_segment_size(),
1415-
handler).discard_result();
1415+
handler);
14161416
}).safe_then([this, segment_id, segment_header] {
14171417
init_mark_segment_closed(
14181418
segment_id,

src/crimson/os/seastore/journal/circular_bounded_journal.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ Journal::replay_ret CircularBoundedJournal::replay_segment(
188188
cursor,
189189
cjs.get_cbj_header().magic,
190190
std::numeric_limits<size_t>::max(),
191-
dhandler).safe_then([](auto){}
191+
dhandler
192192
).handle_error(
193193
replay_ertr::pass_further{},
194194
crimson::ct_error::assert_all{

src/crimson/os/seastore/journal/segmented_journal.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ SegmentedJournal::scan_last_segment(
219219
cursor,
220220
nonce,
221221
std::numeric_limits<std::size_t>::max(),
222-
handler).discard_result();
222+
handler);
223223
});
224224
}
225225

@@ -312,7 +312,7 @@ SegmentedJournal::replay_segment(
312312
cursor,
313313
header.segment_nonce,
314314
std::numeric_limits<size_t>::max(),
315-
dhandler).safe_then([](auto){}
315+
dhandler
316316
).handle_error(
317317
replay_ertr::pass_further{},
318318
crimson::ct_error::assert_all{

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: 5 additions & 4 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,
@@ -103,7 +104,7 @@ class LBAManager {
103104
extent_len_t len) = 0;
104105

105106
struct ref_update_result_t {
106-
unsigned refcount = 0;
107+
extent_ref_count_t refcount = 0;
107108
pladdr_t addr;
108109
extent_len_t length = 0;
109110
};
@@ -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: 54 additions & 42 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);
@@ -553,10 +554,12 @@ BtreeLBAManager::update_mapping(
553554
return ret;
554555
},
555556
nextent
556-
).si_then([&t, laddr, prev_addr, addr, FNAME](auto p) {
557-
auto &result = p.first;
557+
).si_then([&t, laddr, prev_addr, addr, FNAME](auto res) {
558+
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 */
@@ -616,7 +619,7 @@ void BtreeLBAManager::register_metrics()
616619
);
617620
}
618621

619-
BtreeLBAManager::ref_iertr::future<std::optional<std::pair<paddr_t, extent_len_t>>>
622+
BtreeLBAManager::_decref_intermediate_ret
620623
BtreeLBAManager::_decref_intermediate(
621624
Transaction &t,
622625
laddr_t addr,
@@ -650,15 +653,20 @@ BtreeLBAManager::_decref_intermediate(
650653
if (!val.refcount) {
651654
return btree.remove(c, iter
652655
).si_then([val] {
653-
return std::make_optional<
654-
std::pair<paddr_t, extent_len_t>>(
655-
val.pladdr.get_paddr(), val.len);
656+
auto res = ref_update_result_t{
657+
val.refcount,
658+
val.pladdr.get_paddr(),
659+
val.len
660+
};
661+
return ref_iertr::make_ready_future<
662+
std::optional<ref_update_result_t>>(
663+
std::make_optional<ref_update_result_t>(res));
656664
});
657665
} else {
658666
return btree.update(c, iter, val, nullptr
659667
).si_then([](auto) {
660-
return seastar::make_ready_future<
661-
std::optional<std::pair<paddr_t, extent_len_t>>>(std::nullopt);
668+
return ref_iertr::make_ready_future<
669+
std::optional<ref_update_result_t>>(std::nullopt);
662670
});
663671
}
664672
});
@@ -685,36 +693,36 @@ BtreeLBAManager::update_refcount(
685693
return out;
686694
},
687695
nullptr
688-
).si_then([&t, addr, delta, FNAME, this, cascade_remove](auto p) {
689-
auto &result = p.first;
690-
auto &mapping = p.second;
691-
DEBUGT("laddr={}, delta={} done -- {}", t, addr, delta, result);
696+
).si_then([&t, addr, delta, FNAME, this, cascade_remove](auto res) {
697+
auto &map_value = res.map_value;
698+
auto &mapping = res.mapping;
699+
DEBUGT("laddr={}, delta={} done -- {}", t, addr, delta, map_value);
692700
auto fut = ref_iertr::make_ready_future<
693-
std::optional<std::pair<paddr_t, extent_len_t>>>();
694-
if (!result.refcount && result.pladdr.is_laddr() && cascade_remove) {
701+
std::optional<ref_update_result_t>>();
702+
if (!map_value.refcount && map_value.pladdr.is_laddr() && cascade_remove) {
695703
fut = _decref_intermediate(
696704
t,
697-
result.pladdr.get_laddr(),
698-
result.len
705+
map_value.pladdr.get_laddr(),
706+
map_value.len
699707
);
700708
}
701-
return fut.si_then([result, mapping=std::move(mapping)]
702-
(auto removed) mutable {
703-
if (result.pladdr.is_laddr()
704-
&& removed) {
705-
return std::make_pair(
706-
ref_update_result_t{
707-
result.refcount,
708-
removed->first,
709-
removed->second},
710-
std::move(mapping));
709+
return fut.si_then([map_value, mapping=std::move(mapping)]
710+
(auto decref_intermediate_res) mutable {
711+
if (map_value.pladdr.is_laddr()
712+
&& decref_intermediate_res) {
713+
return update_refcount_ret_bare_t{
714+
*decref_intermediate_res,
715+
std::move(mapping)
716+
};
711717
} else {
712-
return std::make_pair(
713-
ref_update_result_t{
714-
result.refcount,
715-
result.pladdr,
716-
result.len},
717-
std::move(mapping));
718+
return update_refcount_ret_bare_t{
719+
ref_update_result_t{
720+
map_value.refcount,
721+
map_value.pladdr,
722+
map_value.len
723+
},
724+
std::move(mapping)
725+
};
718726
}
719727
});
720728
});
@@ -728,7 +736,7 @@ BtreeLBAManager::_update_mapping(
728736
LogicalCachedExtent* nextent)
729737
{
730738
auto c = get_context(t);
731-
return with_btree_ret<LBABtree, _update_mapping_ret_bare>(
739+
return with_btree_ret<LBABtree, update_mapping_ret_bare_t>(
732740
cache,
733741
c,
734742
[f=std::move(f), c, addr, nextent](auto &btree) mutable {
@@ -748,8 +756,10 @@ BtreeLBAManager::_update_mapping(
748756
c,
749757
iter
750758
).si_then([ret] {
751-
return std::make_pair(
752-
std::move(ret), BtreeLBAMappingRef(nullptr));
759+
return update_mapping_ret_bare_t{
760+
std::move(ret),
761+
BtreeLBAMappingRef(nullptr)
762+
};
753763
});
754764
} else {
755765
return btree.update(
@@ -758,8 +768,10 @@ BtreeLBAManager::_update_mapping(
758768
ret,
759769
nextent
760770
).si_then([c, ret](auto iter) {
761-
return std::make_pair(
762-
std::move(ret), iter.get_pin(c));
771+
return update_mapping_ret_bare_t{
772+
std::move(ret),
773+
iter.get_pin(c)
774+
};
763775
});
764776
}
765777
});

0 commit comments

Comments
 (0)