Skip to content

Commit d4f58c9

Browse files
authored
Merge pull request ceph#62938 from cyx1231st/wip-seastore-cleanup-paddr-types
crimson/os/seastore: improve checks to the paddr types Reviewed-by: Xuehan Xu <[email protected]> Reviewed-by: Myoungwon Oh <[email protected]>
2 parents 5cbd352 + af393e4 commit d4f58c9

15 files changed

+137
-72
lines changed

src/crimson/os/seastore/async_cleaner.cc

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,10 +1521,11 @@ bool SegmentCleaner::check_usage()
15211521
extent_types_t type,
15221522
laddr_t laddr)
15231523
{
1524-
if (paddr.get_addr_type() == paddr_types_t::SEGMENT) {
1524+
if (paddr.is_absolute_segmented()) {
15251525
if (is_backref_node(type)) {
15261526
assert(laddr == L_ADDR_NULL);
1527-
assert(backref_key != P_ADDR_NULL);
1527+
assert(backref_key.is_absolute_segmented()
1528+
|| backref_key == P_ADDR_MIN);
15281529
tracker->allocate(
15291530
paddr.as_seg_paddr().get_segment_id(),
15301531
paddr.as_seg_paddr().get_segment_off(),
@@ -1556,7 +1557,7 @@ void SegmentCleaner::mark_space_used(
15561557
assert(background_callback->get_state() >= state_t::SCAN_SPACE);
15571558
assert(len);
15581559
// TODO: drop
1559-
if (addr.get_addr_type() != paddr_types_t::SEGMENT) {
1560+
if (!addr.is_absolute_segmented()) {
15601561
return;
15611562
}
15621563

@@ -1587,7 +1588,7 @@ void SegmentCleaner::mark_space_free(
15871588
assert(background_callback->get_state() >= state_t::SCAN_SPACE);
15881589
assert(len);
15891590
// TODO: drop
1590-
if (addr.get_addr_type() != paddr_types_t::SEGMENT) {
1591+
if (!addr.is_absolute_segmented()) {
15911592
return;
15921593
}
15931594

@@ -1721,7 +1722,7 @@ void RBMCleaner::mark_space_used(
17211722
extent_len_t len)
17221723
{
17231724
LOG_PREFIX(RBMCleaner::mark_space_used);
1724-
assert(addr.get_addr_type() == paddr_types_t::RANDOM_BLOCK);
1725+
assert(addr.is_absolute_random_block());
17251726
auto rbms = rb_group->get_rb_managers();
17261727
for (auto rbm : rbms) {
17271728
if (addr.get_device_id() == rbm->get_device_id()) {
@@ -1740,7 +1741,7 @@ void RBMCleaner::mark_space_free(
17401741
extent_len_t len)
17411742
{
17421743
LOG_PREFIX(RBMCleaner::mark_space_free);
1743-
assert(addr.get_addr_type() == paddr_types_t::RANDOM_BLOCK);
1744+
assert(addr.is_absolute_random_block());
17441745
auto rbms = rb_group->get_rb_managers();
17451746
for (auto rbm : rbms) {
17461747
if (addr.get_device_id() == rbm->get_device_id()) {
@@ -1832,7 +1833,8 @@ bool RBMCleaner::check_usage()
18321833
if (rbm->get_device_id() == paddr.get_device_id()) {
18331834
if (is_backref_node(type)) {
18341835
assert(laddr == L_ADDR_NULL);
1835-
assert(backref_key != P_ADDR_NULL);
1836+
assert(backref_key.is_absolute_random_block()
1837+
|| backref_key == P_ADDR_MIN);
18361838
tracker.allocate(
18371839
paddr,
18381840
len);

src/crimson/os/seastore/backref/btree_backref_manager.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ BtreeBackrefManager::new_mapping(
159159
{
160160
ceph_assert(
161161
is_aligned(
162-
key.get_addr_type() == paddr_types_t::SEGMENT ?
162+
key.is_absolute_segmented() ?
163163
key.as_seg_paddr().get_segment_off() :
164164
key.as_blk_paddr().get_device_off(),
165165
cache.get_block_size()));

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,14 @@ struct FixedKVNode : CachedExtent {
6868
* Upon commit, these now block relative addresses will be interpretted
6969
* against the real final address.
7070
*/
71-
if (!get_paddr().is_absolute()) {
71+
if (get_paddr().is_record_relative()) {
7272
// backend_type_t::SEGMENTED
73-
assert(get_paddr().is_record_relative());
7473
resolve_relative_addrs(
7574
make_record_relative_paddr(0).block_relative_to(get_paddr()));
76-
} // else: backend_type_t::RANDOM_BLOCK
75+
} else {
76+
// backend_type_t::RANDOM_BLOCK
77+
assert(get_paddr().is_absolute());
78+
}
7779
}
7880

7981
void on_delta_write(paddr_t record_block_offset) final {

src/crimson/os/seastore/cache.cc

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ Cache::retire_extent_ret Cache::retire_extent_addr(
5656
LOG_PREFIX(Cache::retire_extent_addr);
5757
TRACET("retire {}~0x{:x}", t, paddr, length);
5858

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

6161
CachedExtentRef ext;
6262
auto result = t.get_extent(paddr, &ext);
@@ -71,8 +71,8 @@ Cache::retire_extent_ret Cache::retire_extent_addr(
7171
ceph_abort();
7272
}
7373

74-
// any relative paddr must have been on the transaction
75-
assert(!paddr.is_relative());
74+
// any record-relative or delayed paddr must have been on the transaction
75+
assert(paddr.is_absolute());
7676

7777
// absent from transaction
7878
// retiring is not included by the cache hit metrics
@@ -97,6 +97,8 @@ Cache::retire_extent_ret Cache::retire_extent_addr(
9797
void Cache::retire_absent_extent_addr(
9898
Transaction &t, paddr_t paddr, extent_len_t length)
9999
{
100+
assert(paddr.is_absolute());
101+
100102
CachedExtentRef ext;
101103
#ifndef NDEBUG
102104
auto result = t.get_extent(paddr, &ext);
@@ -729,11 +731,14 @@ void Cache::add_extent(CachedExtentRef ref)
729731
assert(ref->is_valid());
730732
assert(ref->user_hint == PLACEMENT_HINT_NULL);
731733
assert(ref->rewrite_generation == NULL_GENERATION);
734+
assert(ref->get_paddr().is_absolute() ||
735+
ref->get_paddr().is_root());
732736
extents_index.insert(*ref);
733737
}
734738

735739
void Cache::mark_dirty(CachedExtentRef ref)
736740
{
741+
assert(ref->get_paddr().is_absolute());
737742
if (ref->is_dirty()) {
738743
assert(ref->primary_ref_list_hook.is_linked());
739744
return;
@@ -752,6 +757,8 @@ void Cache::add_to_dirty(
752757
assert(!ref->primary_ref_list_hook.is_linked());
753758
ceph_assert(ref->get_modify_time() != NULL_TIME);
754759
assert(ref->is_fully_loaded());
760+
assert(ref->get_paddr().is_absolute() ||
761+
ref->get_paddr().is_root());
755762

756763
// Note: next might not be at extent_state_t::DIRTY,
757764
// also see CachedExtent::is_stable_writting()
@@ -781,6 +788,8 @@ void Cache::remove_from_dirty(
781788
assert(ref->is_dirty());
782789
ceph_assert(ref->primary_ref_list_hook.is_linked());
783790
assert(ref->is_fully_loaded());
791+
assert(ref->get_paddr().is_absolute() ||
792+
ref->get_paddr().is_root());
784793

785794
auto extent_length = ref->get_length();
786795
stats.dirty_bytes -= extent_length;
@@ -862,9 +871,12 @@ void Cache::remove_extent(
862871
const Transaction::src_t* p_src)
863872
{
864873
assert(ref->is_valid());
874+
assert(ref->get_paddr().is_absolute() ||
875+
ref->get_paddr().is_root());
865876
if (ref->is_dirty()) {
866877
remove_from_dirty(ref, p_src);
867878
} else if (!ref->is_placeholder()) {
879+
assert(ref->get_paddr().is_absolute());
868880
lru.remove_from_lru(*ref);
869881
}
870882
extents_index.erase(*ref);
@@ -887,6 +899,7 @@ void Cache::commit_replace_extent(
887899
CachedExtentRef prev)
888900
{
889901
assert(next->get_paddr() == prev->get_paddr());
902+
assert(next->get_paddr().is_absolute() || next->get_paddr().is_root());
890903
assert(next->version == prev->version + 1);
891904
extents_index.replace(*next, *prev);
892905

@@ -1267,8 +1280,7 @@ record_t Cache::prepare_record(
12671280
assert(can_inplace_rewrite(i->prior_instance->get_type()));
12681281
assert(i->prior_instance->dirty_from_or_retired_at == JOURNAL_SEQ_MIN);
12691282
assert(i->prior_instance->state == CachedExtent::extent_state_t::CLEAN);
1270-
assert(i->prior_instance->get_paddr().get_addr_type() ==
1271-
paddr_types_t::RANDOM_BLOCK);
1283+
assert(i->prior_instance->get_paddr().is_absolute_random_block());
12721284
i->version = 1;
12731285
}
12741286

@@ -1290,10 +1302,11 @@ record_t Cache::prepare_record(
12901302
t, delta_length, *i);
12911303
assert(t.root == i);
12921304
root = t.root;
1305+
assert(root->get_paddr().is_root());
12931306
record.push_back(
12941307
delta_info_t{
12951308
extent_types_t::ROOT,
1296-
P_ADDR_NULL,
1309+
P_ADDR_ROOT,
12971310
L_ADDR_NULL,
12981311
0,
12991312
0,
@@ -1308,7 +1321,7 @@ record_t Cache::prepare_record(
13081321
auto stype = segment_type_t::NULL_SEG;
13091322

13101323
// FIXME: This is specific to the segmented implementation
1311-
if (i->get_paddr().get_addr_type() == paddr_types_t::SEGMENT) {
1324+
if (i->get_paddr().is_absolute_segmented()) {
13121325
auto sid = i->get_paddr().as_seg_paddr().get_segment_id();
13131326
auto sinfo = get_segment_info(sid);
13141327
if (sinfo) {
@@ -1407,7 +1420,11 @@ record_t Cache::prepare_record(
14071420
fresh_stat.increment(i->get_length());
14081421
get_by_ext(efforts.fresh_inline_by_ext,
14091422
i->get_type()).increment(i->get_length());
1423+
#ifdef UNIT_TESTS_BUILT
14101424
assert(i->is_inline() || i->get_paddr().is_fake());
1425+
#else
1426+
assert(i->is_inline());
1427+
#endif
14111428

14121429
bufferlist bl;
14131430
i->prepare_write();
@@ -1461,7 +1478,7 @@ record_t Cache::prepare_record(
14611478
for (auto &i: t.ool_block_list) {
14621479
TRACET("fresh ool extent -- {}", t, *i);
14631480
ceph_assert(i->is_valid());
1464-
assert(!i->is_inline());
1481+
assert(i->get_paddr().is_absolute());
14651482
get_by_ext(efforts.fresh_ool_by_ext,
14661483
i->get_type()).increment(i->get_length());
14671484
if (is_backref_mapped_type(i->get_type())) {
@@ -1870,13 +1887,16 @@ void Cache::init()
18701887
root = nullptr;
18711888
}
18721889
root = CachedExtent::make_cached_extent_ref<RootBlock>();
1873-
root->init(CachedExtent::extent_state_t::CLEAN,
1890+
// Make it simpler to keep root dirty
1891+
root->init(CachedExtent::extent_state_t::DIRTY,
18741892
P_ADDR_ROOT,
18751893
PLACEMENT_HINT_NULL,
18761894
NULL_GENERATION,
1877-
TRANS_ID_NULL);
1895+
TRANS_ID_NULL);
1896+
root->set_modify_time(seastar::lowres_system_clock::now());
18781897
INFO("init root -- {}", *root);
1879-
extents_index.insert(*root);
1898+
add_extent(root);
1899+
add_to_dirty(root, nullptr);
18801900
}
18811901

18821902
Cache::mkfs_iertr::future<> Cache::mkfs(Transaction &t)
@@ -1937,8 +1957,7 @@ Cache::replay_delta(
19371957
* safetly skip these deltas because the extent must already
19381958
* have been rewritten.
19391959
*/
1940-
if (delta.paddr != P_ADDR_NULL &&
1941-
delta.paddr.get_addr_type() == paddr_types_t::SEGMENT) {
1960+
if (delta.paddr.is_absolute_segmented()) {
19421961
auto& seg_addr = delta.paddr.as_seg_paddr();
19431962
auto seg_info = get_segment_info(seg_addr.get_segment_id());
19441963
if (seg_info) {
@@ -1976,9 +1995,10 @@ Cache::replay_delta(
19761995
decode(alloc_delta, delta.bl);
19771996
backref_entry_refs_t backref_entries;
19781997
for (auto &alloc_blk : alloc_delta.alloc_blk_ranges) {
1979-
if (alloc_blk.paddr.is_relative()) {
1980-
assert(alloc_blk.paddr.is_record_relative());
1998+
if (alloc_blk.paddr.is_record_relative()) {
19811999
alloc_blk.paddr = record_base.add_relative(alloc_blk.paddr);
2000+
} else {
2001+
ceph_assert(alloc_blk.paddr.is_absolute());
19822002
}
19832003
DEBUG("replay alloc_blk {}~0x{:x} {}, journal_seq: {}",
19842004
alloc_blk.paddr, alloc_blk.len, alloc_blk.laddr, journal_seq);
@@ -2001,6 +2021,7 @@ Cache::replay_delta(
20012021
if (is_root_type(delta.type)) {
20022022
TRACE("replay root delta at {} {}, remove extent ... -- {}, prv_root={}",
20032023
journal_seq, record_base, delta, *root);
2024+
ceph_assert(delta.paddr.is_root());
20042025
remove_extent(root, nullptr);
20052026
root->apply_delta_and_adjust_crc(record_base, delta.bl);
20062027
root->dirty_from_or_retired_at = journal_seq;
@@ -2014,6 +2035,7 @@ Cache::replay_delta(
20142035
return replay_delta_ertr::make_ready_future<std::pair<bool, CachedExtentRef>>(
20152036
std::make_pair(true, root));
20162037
} else {
2038+
ceph_assert(delta.paddr.is_absolute());
20172039
auto _get_extent_if_cached = [this](paddr_t addr)
20182040
-> get_extent_ertr::future<CachedExtentRef> {
20192041
// replay is not included by the cache hit metrics
@@ -2061,15 +2083,15 @@ Cache::replay_delta(
20612083
DEBUG("replay extent delta at {} {} ... -- {}, prv_extent={}",
20622084
journal_seq, record_base, delta, *extent);
20632085

2064-
if (delta.paddr.get_addr_type() == paddr_types_t::SEGMENT ||
2086+
if (delta.paddr.is_absolute_segmented() ||
20652087
!can_inplace_rewrite(delta.type)) {
20662088
ceph_assert_always(extent->last_committed_crc == delta.prev_crc);
20672089
assert(extent->version == delta.pversion);
20682090
extent->apply_delta_and_adjust_crc(record_base, delta.bl);
20692091
extent->set_modify_time(modify_time);
20702092
ceph_assert_always(extent->last_committed_crc == delta.final_crc);
20712093
} else {
2072-
assert(delta.paddr.get_addr_type() == paddr_types_t::RANDOM_BLOCK);
2094+
assert(delta.paddr.is_absolute_random_block());
20732095
// see prepare_record(), inplace rewrite might cause version mismatch
20742096
extent->apply_delta_and_adjust_crc(record_base, delta.bl);
20752097
extent->set_modify_time(modify_time);

src/crimson/os/seastore/cache.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ class Cache : public ExtentTransViewRetriever {
251251
});
252252
}
253253

254+
assert(paddr.is_absolute());
254255
// get_extent_ret::ABSENT from transaction
255256
ret = query_cache(paddr);
256257
if (!ret) {
@@ -585,6 +586,7 @@ class Cache : public ExtentTransViewRetriever {
585586
// Interfaces only for tests.
586587
public:
587588
CachedExtentRef test_query_cache(paddr_t offset) {
589+
assert(offset.is_absolute());
588590
return query_cache(offset);
589591
}
590592

@@ -673,6 +675,7 @@ class Cache : public ExtentTransViewRetriever {
673675
const Transaction::src_t* p_src
674676
) {
675677
LOG_PREFIX(Cache::do_get_caching_extent);
678+
assert(offset.is_absolute());
676679
auto cached = query_cache(offset);
677680
if (!cached) {
678681
// partial read
@@ -1479,6 +1482,7 @@ class Cache : public ExtentTransViewRetriever {
14791482
const Transaction::src_t* p_src,
14801483
cache_hint_t hint)
14811484
{
1485+
assert(ext.get_paddr().is_absolute());
14821486
if (hint == CACHE_HINT_NOCACHE && is_logical_type(ext.get_type())) {
14831487
return;
14841488
}
@@ -1515,7 +1519,7 @@ class Cache : public ExtentTransViewRetriever {
15151519
paddr_t paddr,
15161520
paddr_t key,
15171521
extent_types_t type) {
1518-
assert(!paddr.is_relative());
1522+
assert(paddr.is_absolute());
15191523
auto [iter, inserted] = backref_extents.emplace(paddr, key, type);
15201524
boost::ignore_unused(inserted);
15211525
assert(inserted);
@@ -1914,6 +1918,7 @@ class Cache : public ExtentTransViewRetriever {
19141918
assert(!extent->is_range_loaded(offset, length));
19151919
assert(is_aligned(offset, get_block_size()));
19161920
assert(is_aligned(length, get_block_size()));
1921+
assert(extent->get_paddr().is_absolute());
19171922
extent->set_io_wait();
19181923
auto old_length = extent->get_loaded_length();
19191924
load_ranges_t to_read = extent->load_ranges(offset, length);

src/crimson/os/seastore/cached_extent.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ class CachedExtent
760760
}
761761

762762
bool is_inline() const {
763-
return poffset.is_relative();
763+
return poffset.is_record_relative();
764764
}
765765

766766
paddr_t get_prior_paddr_and_reset() {

src/crimson/os/seastore/extent_placement_manager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,9 +558,11 @@ class ExtentPlacementManager {
558558

559559
bool get_checksum_needed(paddr_t addr) {
560560
// checksum offloading only for blocks physically stored in the device
561+
#ifdef UNIT_TESTS_BUILT
561562
if (addr.is_fake()) {
562563
return true;
563564
}
565+
#endif
564566
assert(addr.is_absolute());
565567
return !devices_by_id[addr.get_device_id()]->is_end_to_end_data_protection();
566568
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ SegmentedJournal::prep_replay_segments(
111111
auto journal_tail = trimmer.get_journal_tail();
112112
auto journal_tail_paddr = journal_tail.offset;
113113
ceph_assert(journal_tail != JOURNAL_SEQ_NULL);
114-
ceph_assert(journal_tail_paddr != P_ADDR_NULL);
114+
ceph_assert(journal_tail_paddr.is_absolute_segmented());
115115
auto from = std::find_if(
116116
segments.begin(),
117117
segments.end(),

src/crimson/os/seastore/lba_mapping.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class LBAMapping : public BtreeNodeMapping<laddr_t, paddr_t> {
4747
virtual bool is_data_stable() const = 0;
4848
virtual bool is_clone() const = 0;
4949
bool is_zero_reserved() const {
50-
return !get_val().is_real();
50+
return get_val().is_zero();
5151
}
5252

5353
LBAMappingRef duplicate() const;

0 commit comments

Comments
 (0)