]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: manage vector from ExtentList
authorSage Weil <sage@redhat.com>
Tue, 17 Jan 2017 15:56:13 +0000 (10:56 -0500)
committerSage Weil <sage@redhat.com>
Tue, 17 Jan 2017 20:55:56 +0000 (15:55 -0500)
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)

src/os/bluestore/BlueFS.cc
src/os/bluestore/BlueStore.cc
src/os/bluestore/bluestore_types.cc
src/os/bluestore/bluestore_types.h

index e4b8c94ec87e192536a3c1bf3e91c10f4dfb9055..180fb9cf1fbaf8dab51bdca44b5a0a69ba7e2761 100644 (file)
@@ -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) {
index fe73545cca093fa6ebf71f48fab9e5df60b0b2db..d05dd11b279393484fd9a1fff3107aaa9c701e75 100644 (file)
@@ -3622,8 +3622,9 @@ int BlueStore::_balance_bluefs_freespace(vector<bluestore_pextent_t> *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);
index 36bcedbfd7fb622e937d19bc2369ad50ced23c66..79add568a1ac1cd1f38b91d078ea2703df82e0ec 100644 (file)
@@ -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
index 4dcbf7d702d7edc355c98d1ce8203d815fdf9d4c..8b54fb7725b269ce166b01c83859a15d423d30dc 100644 (file)
@@ -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();
   }
 };