auto ret = CachedExtent::make_cached_extent_ref<T>(
alloc_cache_buf(length));
ret->set_paddr(offset);
- ret->state = CachedExtent::extent_state_t::CLEAN;
+ ret->state = CachedExtent::extent_state_t::CLEAN_PENDING;
add_extent(ret);
return read_extent<T>(
std::move(ret), std::forward<Func>(extent_init_func));
auto ret = CachedExtent::make_cached_extent_ref<T>(
alloc_cache_buf(length));
ret->set_paddr(offset);
- ret->state = CachedExtent::extent_state_t::CLEAN;
+ ret->state = CachedExtent::extent_state_t::CLEAN_PENDING;
extents.replace(*ret, *cached);
// replace placeholder in transactions
TCachedExtentRef<T>&& extent,
Func &&func
) {
+ assert(extent->state == CachedExtent::extent_state_t::CLEAN_PENDING);
extent->set_io_wait();
return reader.read(
extent->get_paddr(),
extent->get_bptr()
).safe_then(
[extent=std::move(extent), func=std::forward<Func>(func)]() mutable {
+ extent->state = CachedExtent::extent_state_t::CLEAN;
/* TODO: crc should be checked against LBA manager */
extent->last_committed_crc = extent->get_crc32c();
return out << "INITIAL_WRITE_PENDING";
case CachedExtent::extent_state_t::MUTATION_PENDING:
return out << "MUTATION_PENDING";
+ case CachedExtent::extent_state_t::CLEAN_PENDING:
+ return out << "CLEAN_PENDING";
case CachedExtent::extent_state_t::CLEAN:
return out << "CLEAN";
case CachedExtent::extent_state_t::DIRTY:
enum class extent_state_t : uint8_t {
INITIAL_WRITE_PENDING, // In Transaction::write_set and fresh_block_list
MUTATION_PENDING, // In Transaction::write_set and mutated_block_list
+ CLEAN_PENDING, // CLEAN, but not yet read out
CLEAN, // In Cache::extent_index, Transaction::read_set
// during write, contents match disk, version == 0
DIRTY, // Same as CLEAN, but contents do not match disk,
<< ", state=" << state
<< ", last_committed_crc=" << last_committed_crc
<< ", refcount=" << use_count();
- print_detail(out);
+ if (state != extent_state_t::INVALID &&
+ state != extent_state_t::CLEAN_PENDING) {
+ print_detail(out);
+ }
return out << ")";
}
bool is_clean() const {
ceph_assert(is_valid());
return state == extent_state_t::INITIAL_WRITE_PENDING ||
- state == extent_state_t::CLEAN;
+ state == extent_state_t::CLEAN ||
+ state == extent_state_t::CLEAN_PENDING;
}
/// Returns true if extent is dirty (has deltas on disk)