@@ -201,20 +201,21 @@ class Cache : public ExtentTransViewRetriever {
201201 get_extent_if_cached_iertr::future<CachedExtentRef>;
202202 get_extent_if_cached_ret get_extent_if_cached (
203203 Transaction &t,
204- paddr_t offset,
204+ paddr_t paddr,
205+ extent_len_t len,
205206 extent_types_t type) {
206- CachedExtentRef ret;
207207 LOG_PREFIX (Cache::get_extent_if_cached);
208- auto result = t.get_extent (offset, &ret);
209208 const auto t_src = t.get_src ();
209+ CachedExtentRef ret;
210+ auto result = t.get_extent (paddr, &ret);
210211 extent_access_stats_t & access_stats = get_by_ext (
211212 get_by_src (stats.access_by_src_ext , t_src),
212213 type);
213214 if (result == Transaction::get_extent_ret::RETIRED) {
214- SUBDEBUGT (seastore_cache, " {} {} is retired on t -- {} " ,
215- t, type, offset, *ret);
216- return get_extent_if_cached_iertr::make_ready_future<
217- CachedExtentRef>(ret );
215+ SUBDEBUGT (seastore_cache,
216+ " {} {}~0x{:x} is retired on t " ,
217+ t, type, paddr, len);
218+ return get_extent_if_cached_iertr::make_ready_future< CachedExtentRef>();
218219 } else if (result == Transaction::get_extent_ret::PRESENT) {
219220 if (ret->is_stable ()) {
220221 if (ret->is_dirty ()) {
@@ -229,32 +230,46 @@ class Cache : public ExtentTransViewRetriever {
229230 ++stats.access .s .trans_pending ;
230231 }
231232
232- if (ret->is_fully_loaded ()) {
233- SUBTRACET (seastore_cache, " {} {} is present on t -- {}" ,
234- t, type, offset, *ret);
235- return ret->wait_io ().then ([ret] {
236- return get_extent_if_cached_iertr::make_ready_future<
237- CachedExtentRef>(ret);
238- });
239- } else {
233+ if (ret->get_length () != len) {
240234 SUBDEBUGT (seastore_cache,
241- " {} {} is present on t -- {} without fully loaded" ,
242- t, type, offset, *ret);
243- return get_extent_if_cached_iertr::make_ready_future<
244- CachedExtentRef>();
235+ " {} {}~0x{:x} is present on t with inconsistent length 0x{:x} -- {}" ,
236+ t, type, paddr, len, ret->get_length (), *ret);
237+ return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>();
245238 }
239+
240+ ceph_assert (ret->get_type () == type);
241+ if (!ret->is_fully_loaded ()) {
242+ SUBDEBUGT (seastore_cache,
243+ " {} {}~0x{:x} is present on t without fully loaded -- {}" ,
244+ t, type, paddr, len, *ret);
245+ return trans_intr::make_interruptible (
246+ do_read_extent_maybe_partial<CachedExtent>(
247+ ret->cast <CachedExtent>(), 0 , ret->get_length (), &t_src));
248+ }
249+
250+ SUBTRACET (seastore_cache,
251+ " {} {}~0x{:x} is present on t -- {}" ,
252+ t, type, paddr, len, *ret);
253+ return ret->wait_io ().then ([ret] {
254+ return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>(ret);
255+ });
246256 }
247257
248258 // get_extent_ret::ABSENT from transaction
249- ret = query_cache (offset );
259+ ret = query_cache (paddr );
250260 if (!ret) {
251- SUBDEBUGT (seastore_cache, " {} {} is absent" , t, type, offset);
261+ SUBDEBUGT (seastore_cache,
262+ " {} {}~0x{:x} is absent in cache" ,
263+ t, type, paddr, len);
252264 account_absent_access (t_src);
253265 return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>();
254- } else if (is_retired_placeholder_type (ret->get_type ())) {
266+ }
267+
268+ if (is_retired_placeholder_type (ret->get_type ())) {
255269 // retired_placeholder is not really cached yet
256- SUBDEBUGT (seastore_cache, " {} {} is absent(placeholder)" ,
257- t, type, offset);
270+ SUBDEBUGT (seastore_cache,
271+ " {} {}~0x{:x} ~0x{:x} is absent(placeholder) in cache" ,
272+ t, type, paddr, len, ret->get_length ());
258273 account_absent_access (t_src);
259274 return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>();
260275 }
@@ -267,18 +282,29 @@ class Cache : public ExtentTransViewRetriever {
267282 ++stats.access .s .cache_lru ;
268283 }
269284
270- if (!ret->is_fully_loaded ()) {
271- // ignore non-full extent
285+ if (ret->get_length () != len) {
272286 SUBDEBUGT (seastore_cache,
273- " {} {} is present without fully loaded" , t, type, offset);
287+ " {} {}~0x{:x} is present in cache with inconsistent length 0x{:x} -- {}" ,
288+ t, type, paddr, len, ret->get_length (), *ret);
274289 return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>();
275290 }
276291
277- // present in cache(fully loaded) and is not a retired_placeholder
278- SUBDEBUGT (seastore_cache, " {} {} is present in cache -- {}" ,
279- t, type, offset, *ret);
292+ ceph_assert (ret->get_type () == type);
280293 t.add_to_read_set (ret);
281294 touch_extent (*ret, &t_src, t.get_cache_hint ());
295+ if (!ret->is_fully_loaded ()) {
296+ SUBDEBUGT (seastore_cache,
297+ " {} {}~0x{:x} is present without fully loaded in cache -- {}" ,
298+ t, type, paddr, len, *ret);
299+ return trans_intr::make_interruptible (
300+ do_read_extent_maybe_partial<CachedExtent>(
301+ ret->cast <CachedExtent>(), 0 , ret->get_length (), &t_src));
302+ }
303+
304+ // present in cache(fully loaded) and is not a retired_placeholder
305+ SUBDEBUGT (seastore_cache,
306+ " {} {}~0x{:x} is present in cache -- {}" ,
307+ t, type, paddr, len, *ret);
282308 return ret->wait_io ().then ([ret] {
283309 return get_extent_if_cached_iertr::make_ready_future<
284310 CachedExtentRef>(ret);
@@ -685,6 +711,8 @@ class Cache : public ExtentTransViewRetriever {
685711 SUBDEBUG (seastore_cache,
686712 " {} {}~0x{:x} is absent(placeholder), add extent and reading range 0x{:x}~0x{:x} ... -- {}" ,
687713 T::TYPE, offset, length, partial_off, partial_len, *ret);
714+ extent_init_func (*ret);
715+ on_cache (*ret);
688716 extents_index.replace (*ret, *cached);
689717
690718 // replace placeholder in transactions
@@ -694,8 +722,6 @@ class Cache : public ExtentTransViewRetriever {
694722 }
695723
696724 cached->state = CachedExtent::extent_state_t ::INVALID;
697- extent_init_func (*ret);
698- on_cache (*ret);
699725 return read_extent<T>(
700726 std::move (ret), partial_off, partial_len, p_src);
701727 }
@@ -1101,11 +1127,11 @@ class Cache : public ExtentTransViewRetriever {
11011127 }
11021128
11031129 /* *
1104- * alloc_new_extent
1130+ * alloc_new_non_data_extent_by_type
11051131 *
1106- * Allocates a fresh extent. addr will be relative until commit.
1132+ * Allocates a fresh non data extent. addr will be relative until commit.
11071133 */
1108- CachedExtentRef alloc_new_extent_by_type (
1134+ CachedExtentRef alloc_new_non_data_extent_by_type (
11091135 Transaction &t, // /< [in, out] current transaction
11101136 extent_types_t type, // /< [in] type tag
11111137 extent_len_t length, // /< [in] length
@@ -1114,9 +1140,9 @@ class Cache : public ExtentTransViewRetriever {
11141140 );
11151141
11161142 /* *
1117- * alloc_new_extent
1143+ * alloc_new_data_extents_by_type
11181144 *
1119- * Allocates a fresh extent . addr will be relative until commit.
1145+ * Allocates fresh data extents . addr will be relative until commit.
11201146 */
11211147 std::vector<CachedExtentRef> alloc_new_data_extents_by_type (
11221148 Transaction &t, // /< [in, out] current transaction
0 commit comments