* - t if modified by t
* - extent_set if already in cache
* - disk
+ *
+ * t *must not* have retired offset
*/
template <typename T>
get_extent_ertr::future<TCachedExtentRef<T>> get_extent(
paddr_t offset, ///< [in] starting addr
segment_off_t length ///< [in] length
) {
- if (auto i = t.get_extent(offset)) {
+ CachedExtentRef ret;
+ auto result = t.get_extent(offset, &ret);
+ if (result != Transaction::get_extent_ret::ABSENT) {
+ assert(result != Transaction::get_extent_ret::RETIRED);
return get_extent_ertr::make_ready_future<TCachedExtentRef<T>>(
- TCachedExtentRef<T>(static_cast<T*>(&*i)));
+ ret->cast<T>());
} else {
return get_extent<T>(offset, length).safe_then(
[&t](auto ref) mutable {
t.add_to_read_set(ref);
- return get_extent_ertr::make_ready_future<TCachedExtentRef<T>>(std::move(ref));
+ return get_extent_ertr::make_ready_future<TCachedExtentRef<T>>(
+ std::move(ref));
});
}
}
pextent_set_t retired_set; ///< list of extents mutated by this transaction
public:
- CachedExtentRef get_extent(paddr_t addr) {
- if (auto iter = write_set.find_offset(addr);
+ enum class get_extent_ret {
+ PRESENT,
+ ABSENT,
+ RETIRED
+ };
+ get_extent_ret get_extent(paddr_t addr, CachedExtentRef *out) {
+ if (retired_set.count(addr)) {
+ return get_extent_ret::RETIRED;
+ } else if (auto iter = write_set.find_offset(addr);
iter != write_set.end()) {
- return CachedExtentRef(&*iter);
+ if (out)
+ *out = CachedExtentRef(&*iter);
+ return get_extent_ret::PRESENT;
} else if (
auto iter = read_set.find(addr);
iter != read_set.end()) {
- return *iter;
+ if (out)
+ *out = CachedExtentRef(*iter);
+ return get_extent_ret::PRESENT;
} else {
- return CachedExtentRef();
+ return get_extent_ret::ABSENT;
}
}