From 97f977359515da31720eb7e01d3ca4ff775967fb Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 17 Jan 2017 10:56:13 -0500 Subject: [PATCH] os/bluestore: manage vector from ExtentList 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 (cherry picked from commit 65502891dd66569c8d99384e63b68decdab1c8e2) --- src/os/bluestore/BlueFS.cc | 3 +-- src/os/bluestore/BlueStore.cc | 8 ++++---- src/os/bluestore/bluestore_types.cc | 10 ++++------ src/os/bluestore/bluestore_types.h | 13 +++++++------ 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index e4b8c94ec87e1..180fb9cf1fbaf 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -1767,8 +1767,7 @@ int BlueFS::_allocate(uint8_t id, uint64_t len, 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) { diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index fe73545cca093..d05dd11b27939 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -3622,8 +3622,9 @@ int BlueStore::_balance_bluefs_freespace(vector *extents) 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 @@ -7877,8 +7878,7 @@ int BlueStore::_do_alloc_write( 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); diff --git a/src/os/bluestore/bluestore_types.cc b/src/os/bluestore/bluestore_types.cc index 36bcedbfd7fb6..79add568a1ac1 100644 --- a/src/os/bluestore/bluestore_types.cc +++ b/src/os/bluestore/bluestore_types.cc @@ -21,8 +21,8 @@ void ExtentList::add_extents(int64_t start, int64_t count) { 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; @@ -36,11 +36,9 @@ void ExtentList::add_extents(int64_t start, int64_t count) { 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 diff --git a/src/os/bluestore/bluestore_types.h b/src/os/bluestore/bluestore_types.h index 4dcbf7d702d7e..8b54fb7725b26 100644 --- a/src/os/bluestore/bluestore_types.h +++ b/src/os/bluestore/bluestore_types.h @@ -86,28 +86,29 @@ inline static ostream& operator<<(ostream& out, const AllocExtent& e) { 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); @@ -123,7 +124,7 @@ public: } int64_t get_extent_count() { - return m_num_extents; + return m_extents->size(); } }; -- 2.39.5