assert(!ret->is_mutable());
SUBDEBUGT(seastore_cache, "{} {}~{} is present on t without been \
fully loaded, reading ... {}", t, T::TYPE, offset, length, *ret);
- auto bp = alloc_cache_buf(ret->get_length());
+ auto bp = create_extent_ptr_rand(ret->get_length());
ret->set_bptr(std::move(bp));
return read_extent<T>(
ret->cast<T>());
"{} {}~{} is present without been fully loaded, reading ... -- {}",
p_extent->get_type(), p_extent->get_paddr(),p_extent->get_length(),
*p_extent);
- auto bp = alloc_cache_buf(p_extent->get_length());
+ auto bp = create_extent_ptr_rand(p_extent->get_length());
p_extent->set_bptr(std::move(bp));
return read_extent<CachedExtent>(CachedExtentRef(p_extent));
}
auto cached = query_cache(offset);
if (!cached) {
auto ret = CachedExtent::make_cached_extent_ref<T>(
- alloc_cache_buf(length));
+ create_extent_ptr_rand(length));
ret->init(CachedExtent::extent_state_t::CLEAN_PENDING,
offset,
PLACEMENT_HINT_NULL,
// extent PRESENT in cache
if (is_retired_placeholder_type(cached->get_type())) {
auto ret = CachedExtent::make_cached_extent_ref<T>(
- alloc_cache_buf(length));
+ create_extent_ptr_rand(length));
ret->init(CachedExtent::extent_state_t::CLEAN_PENDING,
offset,
PLACEMENT_HINT_NULL,
SUBDEBUG(seastore_cache,
"{} {}~{} is present without been fully loaded, reading ... -- {}",
T::TYPE, offset, length, *ret);
- auto bp = alloc_cache_buf(length);
+ auto bp = create_extent_ptr_rand(length);
ret->set_bptr(std::move(bp));
return read_extent<T>(
std::move(ret));
assert(!ret->is_mutable());
SUBDEBUGT(seastore_cache, "{} {}~{} {} is present on t without been \
fully loaded, reading ...", t, type, offset, length, laddr);
- auto bp = alloc_cache_buf(ret->get_length());
+ auto bp = create_extent_ptr_rand(ret->get_length());
ret->set_bptr(std::move(bp));
return read_extent<CachedExtent>(
std::move(ret));
seastar::metrics::metric_group metrics;
void register_metrics();
- /// alloc buffer for cached extent
- bufferptr alloc_cache_buf(size_t size) {
- // TODO: memory pooling etc
- auto bp = ceph::bufferptr(
- buffer::create_page_aligned(size));
- bp.zero();
- return bp;
- }
-
void backref_batch_update(
std::vector<backref_entry_ref> &&,
const journal_seq_t &);
#endif
+inline ceph::bufferptr create_extent_ptr_rand(extent_len_t len) {
+ assert(is_aligned(len, CEPH_PAGE_SIZE));
+ assert(len > 0);
+ return ceph::bufferptr(buffer::create_page_aligned(len));
+}
+
+inline ceph::bufferptr create_extent_ptr_zero(extent_len_t len) {
+ auto bp = create_extent_ptr_rand(len);
+ bp.zero();
+ return bp;
+}
+
template <typename T>
using TCachedExtentRef = boost::intrusive_ptr<T>;
poffset(other.poffset) {
assert((length % CEPH_PAGE_SIZE) == 0);
if (other.is_fully_loaded()) {
- ptr.emplace(buffer::create_page_aligned(length));
+ ptr = create_extent_ptr_rand(length);
other.ptr->copy_out(0, length, ptr->c_str());
} else {
// the extent must be fully loaded before CoW
// XXX: bp might be extended to point to different memory (e.g. PMem)
// according to the allocator.
- auto bp = ceph::bufferptr(
- buffer::create_page_aligned(length));
- bp.zero();
+ auto bp = create_extent_ptr_zero(length);
return alloc_result_t{addr, std::move(bp), gen};
}
#ifdef UNIT_TESTS_BUILT
if (unlikely(external_paddr.has_value())) {
assert(external_paddr->is_fake());
- auto bp = ceph::bufferptr(
- buffer::create_page_aligned(length));
- bp.zero();
+ auto bp = create_extent_ptr_zero(length);
allocs.emplace_back(alloc_result_t{*external_paddr, std::move(bp), gen});
} else {
#else
auto left = ext.len;
while (left > 0) {
auto len = std::min(max_data_allocation_size, left);
- auto bp = ceph::bufferptr(buffer::create_page_aligned(len));
- bp.zero();
+ auto bp = create_extent_ptr_zero(len);
auto start = ext.start.is_delayed()
? ext.start
: ext.start + (ext.len - left);