ExtentList was previous relying the caller to preallocate/size the
vector to be large enough for the worst case allocation of extents,
and keeping it's own manual count of the extent list size. Instead,
manage that from ExtentList, and remove the preallocation from the
callers.
Fixes: http://tracker.ceph.com/issues/18573
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit
65502891dd66569c8d99384e63b68decdab1c8e2)
int count = 0;
uint64_t alloc_len = 0;
- AllocExtentVector extents = AllocExtentVector(left / min_alloc_size);
-
+ AllocExtentVector extents;
r = alloc[id]->allocate(left, min_alloc_size, hint,
&extents, &count, &alloc_len);
if (r < 0 || alloc_len < left) {
int count = 0;
uint64_t alloc_len = 0;
- AllocExtentVector exts = AllocExtentVector(gift / min_alloc_size);
- r = alloc->allocate(gift, g_conf->bluefs_alloc_size, 0, 0, &exts, &count, &alloc_len);
+ AllocExtentVector exts;
+ r = alloc->allocate(gift, g_conf->bluefs_alloc_size, 0, 0, &exts,
+ &count, &alloc_len);
if (r < 0 || alloc_len < gift) {
derr << __func__ << " allocate failed on 0x" << std::hex << gift
int count = 0;
uint64_t alloc_len = 0;
- AllocExtentVector extents = AllocExtentVector(final_length / min_alloc_size);
-
+ AllocExtentVector extents;
int r = alloc->allocate(final_length, min_alloc_size, max_alloc_size,
hint, &extents, &count, &alloc_len);
assert(r == 0 && alloc_len == final_length);
AllocExtent *last_extent = NULL;
bool can_merge = false;
- if (m_num_extents > 0) {
- last_extent = &((*m_extents)[m_num_extents - 1]);
+ if (!m_extents->empty()) {
+ last_extent = &((*m_extents)[m_extents->size() - 1]);
uint64_t last_offset = (last_extent->offset + last_extent->length) /
m_block_size;
uint32_t last_length = last_extent->length / m_block_size;
if (can_merge) {
last_extent->length += (count * m_block_size);
} else {
- (*m_extents)[m_num_extents].offset = start * m_block_size;
- (*m_extents)[m_num_extents].length = count * m_block_size;
- m_num_extents++;
+ m_extents->emplace_back(AllocExtent(start * m_block_size,
+ count * m_block_size));
}
- assert((int64_t) m_extents->size() >= m_num_extents);
}
// bluestore_bdev_label_t
class ExtentList {
AllocExtentVector *m_extents;
- int64_t m_num_extents;
int64_t m_block_size;
uint64_t m_max_alloc_size;
public:
- void init(AllocExtentVector *extents, int64_t block_size, uint64_t max_alloc_size) {
+ void init(AllocExtentVector *extents, int64_t block_size,
+ uint64_t max_alloc_size) {
m_extents = extents;
- m_num_extents = 0;
m_block_size = block_size;
m_max_alloc_size = max_alloc_size;
+ assert(m_extents->empty());
}
ExtentList(AllocExtentVector *extents, int64_t block_size) {
init(extents, block_size, 0);
}
- ExtentList(AllocExtentVector *extents, int64_t block_size, uint64_t max_alloc_size) {
+ ExtentList(AllocExtentVector *extents, int64_t block_size,
+ uint64_t max_alloc_size) {
init(extents, block_size, max_alloc_size);
}
void reset() {
- m_num_extents = 0;
+ m_extents->clear();
}
void add_extents(int64_t start, int64_t count);
}
int64_t get_extent_count() {
- return m_num_extents;
+ return m_extents->size();
}
};