Skip to content

Commit b918248

Browse files
zhscnMatan-B
authored andcommitted
crimson/os/seastore: move BtreeNodeMapping::is_viewable_by_trans to CachedExtent
Signed-off-by: Zhang Song <[email protected]> (cherry picked from commit 54476e8)
1 parent f315805 commit b918248

File tree

4 files changed

+79
-27
lines changed

4 files changed

+79
-27
lines changed

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

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -173,34 +173,9 @@ class BtreeNodeMapping : public PhysicalNodeMapping<key_t, val_t> {
173173
return parent->has_been_invalidated();
174174
}
175175

176-
bool is_unviewable_by_trans(CachedExtent& extent, Transaction &t) const {
177-
if (!extent.is_valid()) {
178-
return true;
179-
}
180-
if (extent.is_pending()) {
181-
assert(extent.is_pending_in_trans(t.get_trans_id()));
182-
return false;
183-
}
184-
auto &pendings = extent.mutation_pending_extents;
185-
auto trans_id = t.get_trans_id();
186-
bool unviewable = (pendings.find(trans_id, trans_spec_view_t::cmp_t()) !=
187-
pendings.end());
188-
if (!unviewable) {
189-
auto &trans = extent.retired_transactions;
190-
unviewable = (trans.find(trans_id, trans_spec_view_t::cmp_t()) !=
191-
trans.end());
192-
assert(unviewable ==
193-
t.is_stable_extent_retired(extent.get_paddr(), extent.get_length()));
194-
}
195-
return unviewable;
196-
}
197-
198176
bool is_parent_viewable() const final {
199177
ceph_assert(parent);
200-
if (!parent->is_valid()) {
201-
return false;
202-
}
203-
return !is_unviewable_by_trans(*parent, ctx.trans);
178+
return parent->is_viewable_by_trans(ctx.trans).first;
204179
}
205180
bool is_parent_valid() const final {
206181
ceph_assert(parent);

src/crimson/os/seastore/cached_extent.cc

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,57 @@ void LogicalCachedExtent::maybe_set_intermediate_laddr(LBAMapping &mapping) {
110110
: mapping.get_key();
111111
}
112112

113+
std::pair<bool, CachedExtent::viewable_state_t>
114+
CachedExtent::is_viewable_by_trans(Transaction &t) {
115+
if (!is_valid()) {
116+
return std::make_pair(false, viewable_state_t::invalid);
117+
}
118+
119+
auto trans_id = t.get_trans_id();
120+
if (is_pending()) {
121+
ceph_assert(is_pending_in_trans(trans_id));
122+
return std::make_pair(true, viewable_state_t::pending);
123+
}
124+
125+
// shared by multiple transactions
126+
assert(t.is_in_read_set(this));
127+
assert(is_stable_written());
128+
129+
auto cmp = trans_spec_view_t::cmp_t();
130+
if (mutation_pending_extents.find(trans_id, cmp) !=
131+
mutation_pending_extents.end()) {
132+
return std::make_pair(false, viewable_state_t::stable_become_pending);
133+
}
134+
135+
if (retired_transactions.find(trans_id, cmp) !=
136+
retired_transactions.end()) {
137+
assert(t.is_stable_extent_retired(get_paddr(), get_length()));
138+
return std::make_pair(false, viewable_state_t::stable_become_retired);
139+
}
140+
141+
return std::make_pair(true, viewable_state_t::stable);
142+
}
143+
144+
std::ostream &operator<<(
145+
std::ostream &out,
146+
CachedExtent::viewable_state_t state)
147+
{
148+
switch(state) {
149+
case CachedExtent::viewable_state_t::stable:
150+
return out << "stable";
151+
case CachedExtent::viewable_state_t::pending:
152+
return out << "pending";
153+
case CachedExtent::viewable_state_t::invalid:
154+
return out << "invalid";
155+
case CachedExtent::viewable_state_t::stable_become_retired:
156+
return out << "stable_become_retired";
157+
case CachedExtent::viewable_state_t::stable_become_pending:
158+
return out << "stable_become_pending";
159+
default:
160+
__builtin_unreachable();
161+
}
162+
}
163+
113164
bool BufferSpace::is_range_loaded(extent_len_t offset, extent_len_t length) const
114165
{
115166
assert(length > 0);

src/crimson/os/seastore/cached_extent.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,25 @@ class CachedExtent
789789
return is_pending() && pending_for_transaction == id;
790790
}
791791

792+
enum class viewable_state_t {
793+
stable, // viewable
794+
pending, // viewable
795+
invalid, // unviewable
796+
stable_become_retired, // unviewable
797+
stable_become_pending, // unviewable
798+
};
799+
800+
/**
801+
* is_viewable_by_trans
802+
*
803+
* Check if this extent is still viewable by transaction t.
804+
*
805+
* Precondition: *this was previously visible to t, which indicates
806+
* this extent is either in the read set of t or created(pending) by t.
807+
*/
808+
std::pair<bool, viewable_state_t>
809+
is_viewable_by_trans(Transaction &t);
810+
792811
private:
793812
template <typename T>
794813
friend class read_set_item_t;
@@ -1102,6 +1121,7 @@ class CachedExtent
11021121
};
11031122

11041123
std::ostream &operator<<(std::ostream &, CachedExtent::extent_state_t);
1124+
std::ostream &operator<<(std::ostream &, CachedExtent::viewable_state_t);
11051125
std::ostream &operator<<(std::ostream &, const CachedExtent&);
11061126

11071127
/// Compare extents by paddr
@@ -1542,5 +1562,6 @@ using lextent_list_t = addr_extent_list_base_t<
15421562

15431563
#if FMT_VERSION >= 90000
15441564
template <> struct fmt::formatter<crimson::os::seastore::CachedExtent> : fmt::ostream_formatter {};
1565+
template <> struct fmt::formatter<crimson::os::seastore::CachedExtent::viewable_state_t> : fmt::ostream_formatter {};
15451566
template <> struct fmt::formatter<crimson::os::seastore::LogicalCachedExtent> : fmt::ostream_formatter {};
15461567
#endif

src/crimson/os/seastore/transaction.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,10 @@ class Transaction {
166166
return do_add_to_read_set(ref);
167167
}
168168

169+
bool is_in_read_set(CachedExtentRef extent) const {
170+
return lookup_read_set(extent).first;
171+
}
172+
169173
void add_to_read_set(CachedExtentRef ref) {
170174
assert(ref->get_paddr().is_absolute()
171175
|| ref->get_paddr().is_root());
@@ -594,7 +598,8 @@ class Transaction {
594598
}
595599
}
596600

597-
auto lookup_read_set(CachedExtentRef ref) const {
601+
auto lookup_read_set(CachedExtentRef ref) const
602+
-> std::pair<bool, read_trans_set_t<Transaction>::const_iterator> {
598603
assert(ref->is_valid());
599604
assert(!is_weak());
600605
auto it = ref->read_transactions.lower_bound(

0 commit comments

Comments
 (0)