// shared state between LRU and 2Q impl
Fresh = 0,
PendingPromote,
+ Promoting,
// 2Q impl only
WarmIn,
Hot,
using crimson::common::get_conf;
auto type = get_conf<std::string>("seastore_cachepin_type");
if (type == "LRU") {
- assert(pin_state <= extent_pin_state_t::PendingPromote);
+ assert(pin_state <= extent_pin_state_t::Promoting);
} else if (type == "2Q") {
assert(pin_state < extent_pin_state_t::Max);
} else {
using crimson::common::get_conf;
auto type = get_conf<std::string>("seastore_cachepin_type");
if (type == "LRU") {
- assert(pin_state <= extent_pin_state_t::PendingPromote);
+ assert(pin_state <= extent_pin_state_t::Promoting);
} else if (type == "2Q") {
assert(pin_state < extent_pin_state_t::Max);
} else {
extents.emplace_back(&extent);
}
for (auto &extent : extents) {
- remove_extent(*extent, extent_pin_state_t::Fresh);
+ remove_extent(*extent, extent_pin_state_t::Promoting);
}
promoting_extents.insert(
promoting_extents.end(),
promoter.remove_extent(extent, extent_pin_state_t::Fresh);
}
} else {
- ceph_assert(s == extent_pin_state_t::Fresh);
+ ceph_assert(s == extent_pin_state_t::Fresh ||
+ s == extent_pin_state_t::Promoting);
}
}
const Transaction::src_t* p_src,
extent_len_t /*load_start*/,
extent_len_t /*load_length*/) final {
- if (extent.is_linked_to_list()) {
- auto s = extent.get_pin_state();
+ if (auto s = extent.get_pin_state();
+ s == extent_pin_state_t::Promoting) {
+ assert(!extent.is_linked_to_list());
+ } else if (extent.is_linked_to_list()) {
assert(s <= extent_pin_state_t::PendingPromote);
if (s == extent_pin_state_t::Fresh) {
lru.move_to_top(extent, p_src);
lru.increase_cached_size(extent, increased_length, p_src);
} else {
// promoter take the complete extent size for content size calculation
- assert(extent.get_pin_state() <= extent_pin_state_t::PendingPromote);
+ assert(extent.get_pin_state() <= extent_pin_state_t::Promoting);
}
}
}
extent.set_pin_state(extent_pin_state_t::Fresh);
} else {
- ceph_assert(s == extent_pin_state_t::Fresh);
+ ceph_assert(s == extent_pin_state_t::Fresh ||
+ s == extent_pin_state_t::Promoting);
}
}
extent_len_t load_length) final {
auto state = extent.get_pin_state();
auto type = extent.get_type();
+ if (state == extent_pin_state_t::Promoting) {
+ assert(!extent.is_linked_to_list());
+ return;
+ }
if (extent.is_linked_to_list()) {
if (state == extent_pin_state_t::Hot) {
hot.move_to_top(extent, p_src);
auto slice_laddr = (orig_laddr + offset).checked_to_laddr();
auto slice_length = extent->get_length();
extent->rewrite(t, *orig_ext, offset);
- assert(!extent->get_paddr().is_absolute() ||
- !cache->is_on_cold_tier(extent->get_paddr()));
+ if (extent->get_paddr().is_absolute()) {
+ assert(!cache->is_on_cold_tier(extent->get_paddr()));
+ }
auto lext = extent->cast<LogicalChildNode>();
lext->set_laddr(slice_laddr);
auto lext = promoted_extent->cast<LogicalChildNode>();
lext->set_laddr(orig_ext->get_laddr());
lext->rewrite(t, *orig_ext, 0);
- assert(!extent->get_paddr().is_absolute() ||
- !cache->is_on_cold_tier(lext->get_paddr()));
+ if (lext->get_paddr().is_absolute()) {
+ assert(!cache->is_on_cold_tier(lext->get_paddr()));
+ }
t.touch_laddr_prefix(orig_ext->get_laddr().get_object_prefix());
//TODO: this memory copy should be saved
orig_ext->get_bptr().copy_out(