Skip to content

Commit c53b971

Browse files
committed
crimson/os/seastore: cleanup CachedExtent::prior_instance
Signed-off-by: Yingxin Cheng <[email protected]>
1 parent b170414 commit c53b971

File tree

3 files changed

+15
-11
lines changed

3 files changed

+15
-11
lines changed

src/crimson/os/seastore/cache.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,12 +1188,13 @@ CachedExtentRef Cache::duplicate_for_write(
11881188

11891189
t.add_mutated_extent(i);
11901190
DEBUGT("duplicate existing extent {}", t, *i);
1191+
assert(!i->prior_instance);
11911192
return i;
11921193
}
11931194

11941195
auto ret = i->duplicate_for_write(t);
11951196
ret->pending_for_transaction = t.get_trans_id();
1196-
ret->prior_instance = i;
1197+
ret->set_prior_instance(i);
11971198
// duplicate_for_write won't occur after ool write finished
11981199
assert(!i->prior_poffset);
11991200
auto [iter, inserted] = i->mutation_pending_extents.insert(*ret);
@@ -1790,7 +1791,7 @@ void Cache::complete_commit(
17901791
i->on_initial_write();
17911792

17921793
i->state = CachedExtent::extent_state_t::CLEAN;
1793-
i->prior_instance.reset();
1794+
i->reset_prior_instance();
17941795
DEBUGT("add extent as fresh, inline={} -- {}",
17951796
t, is_inline, *i);
17961797
i->invalidate_hints();
@@ -1842,7 +1843,7 @@ void Cache::complete_commit(
18421843
i->prior_instance);
18431844
i->on_delta_write(final_block_start);
18441845
i->pending_for_transaction = TRANS_ID_NULL;
1845-
i->prior_instance = CachedExtentRef();
1846+
i->reset_prior_instance();
18461847
i->state = CachedExtent::extent_state_t::DIRTY;
18471848
assert(i->version > 0);
18481849
if (i->version == 1 || is_root_type(i->get_type())) {

src/crimson/os/seastore/cached_extent.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,10 @@ class CachedExtent
270270
CachedExtent, boost::thread_unsafe_counter>,
271271
public trans_spec_view_t {
272272
enum class extent_state_t : uint8_t {
273-
INITIAL_WRITE_PENDING, // In Transaction::write_set and fresh_block_list
274-
MUTATION_PENDING, // In Transaction::write_set and mutated_block_list
273+
INITIAL_WRITE_PENDING, // In Transaction::write_set and fresh_block_list,
274+
// has prior_instance under rewrite
275+
MUTATION_PENDING, // In Transaction::write_set and mutated_block_list,
276+
// has prior_instance
275277
CLEAN, // In Cache::extent_index, Transaction::read_set
276278
// during write, contents match disk, version == 0
277279
DIRTY, // Same as CLEAN, but contents do not match disk,
@@ -296,7 +298,8 @@ class CachedExtent
296298

297299
uint32_t last_committed_crc = 0;
298300

299-
// Points at current version while in state MUTATION_PENDING
301+
// Points at the prior stable version while in state MUTATION_PENDING
302+
// or is rewriting (in state INITIAL_PENDING).
300303
CachedExtentRef prior_instance;
301304

302305
// time of the last modification
@@ -434,10 +437,10 @@ class CachedExtent
434437
void rewrite(Transaction &t, CachedExtent &e, extent_len_t o) {
435438
assert(is_initial_pending());
436439
if (!e.is_pending()) {
437-
prior_instance = &e;
440+
set_prior_instance(&e);
438441
} else {
439442
assert(e.is_mutation_pending());
440-
prior_instance = e.get_prior_instance();
443+
set_prior_instance(e.prior_instance);
441444
}
442445
e.get_bptr().copy_out(
443446
o,
@@ -1030,6 +1033,7 @@ class CachedExtent
10301033
virtual void update_in_extent_chksum_field(uint32_t) {}
10311034

10321035
void set_prior_instance(CachedExtentRef p) {
1036+
assert(!prior_instance);
10331037
prior_instance = p;
10341038
}
10351039

@@ -1465,8 +1469,7 @@ class LogicalCachedExtent : public CachedExtent {
14651469
virtual void logical_on_delta_write() {}
14661470

14671471
void on_delta_write(paddr_t record_block_offset) final {
1468-
assert(is_exist_mutation_pending() ||
1469-
get_prior_instance());
1472+
assert(is_exist_mutation_pending() || get_prior_instance());
14701473
logical_on_delta_write();
14711474
}
14721475

src/crimson/os/seastore/transaction.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ class Transaction {
149149
assert(ref->prior_instance);
150150
retired_set.emplace(ref->prior_instance, trans_id);
151151
assert(read_set.count(ref->prior_instance->get_paddr(), extent_cmp_t{}));
152-
ref->prior_instance.reset();
152+
ref->reset_prior_instance();
153153
} else {
154154
// && retired_set.count(ref->get_paddr()) == 0
155155
// If it's already in the set, insert here will be a noop,

0 commit comments

Comments
 (0)