{
LOG_PREFIX(Cache::read_absent_extents_maybe_partial);
auto extents = std::move(exts);
+#ifndef NDEBUG
+ for (auto &ext : extents) {
+ assert(!ext.extent->is_pending_io());
+ }
+#endif
struct range_to_read_t {
paddr_t addr = P_ADDR_NULL;
load_range_t range;
assert(extent->state == CachedExtent::extent_state_t::EXIST_CLEAN ||
extent->state == CachedExtent::extent_state_t::CLEAN);
extents_read.emplace_back(extent);
- extent->set_io_wait(extent->state);
+ if (!extent->is_pending_io()) {
+ extent->set_io_wait(extent->state);
+ }
auto old_length = extent->get_loaded_length();
load_ranges_t to_read = extent->load_ranges(ext.offset, ext.length);
auto new_length = extent->get_loaded_length();
SUBDEBUGT(seastore_cache,
"read extent done (invalidated) -- {}", t, *extent);
}
- extent->complete_io();
+ if (extent->is_pending_io()) {
+ extent->complete_io();
+ }
}
}