crimson/os/seastore/lba_manager: drop from cache directly during replay if dead

Dead extents can't go through the normal retire_extent path as they don't
have valid pins or other elements of a real extent.  Instead, simply drop
them on the floor directly.

Signed-off-by: Samuel Just <sjust@redhat.com>
This commit is contained in:
Samuel Just 2020-08-20 14:23:14 -07:00
parent 5539b54547
commit 5e840a20b8
2 changed files with 14 additions and 3 deletions

View File

@ -85,6 +85,17 @@ public:
Cache(SegmentManager &segment_manager);
~Cache();
/**
* drop_from_cache
*
* Drop extent from cache. Intended for use when
* ref refers to a logically dead extent as during
* replay.
*/
void drop_from_cache(CachedExtentRef ref) {
remove_extent(ref);
}
/// Declare ref retired in t
void retire_extent(Transaction &t, CachedExtentRef ref) {
t.add_to_retired_set(ref);

View File

@ -259,7 +259,7 @@ BtreeLBAManager::init_cached_extent_ret BtreeLBAManager::init_cached_extent(
} else {
// e is obsolete
logger().debug("init_cached_extent: {} obsolete", *e);
cache.retire_extent(t, e);
cache.drop_from_cache(e);
}
return init_cached_extent_ertr::now();
});
@ -279,12 +279,12 @@ BtreeLBAManager::init_cached_extent_ret BtreeLBAManager::init_cached_extent(
} else {
// paddr doesn't match, remapped, obsolete
logger().debug("init_cached_extent: {} obsolete", *logn);
cache.retire_extent(t, logn);
cache.drop_from_cache(logn);
}
} else {
// set of extents changed, obsolete
logger().debug("init_cached_extent: {} obsolete", *logn);
cache.retire_extent(t, logn);
cache.drop_from_cache(logn);
}
return init_cached_extent_ertr::now();
});