]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
SimpleRADOSStriper: Avoid moving bufferlists by using deque
authorMatan Breizman <mbreizma@redhat.com>
Wed, 31 Aug 2022 08:08:27 +0000 (08:08 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Tue, 20 Sep 2022 08:52:45 +0000 (08:52 +0000)
Fixes: https://tracker.ceph.com/issues/57152
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
(cherry picked from commit 410f8c74f43caee179379a4ba02b475c51ed6af4)

src/SimpleRADOSStriper.cc

index d6fe101f9e9e36f86790256d367225476498e6da..66bc653fb7c11dafbd7e2531974064db21c78ced 100644 (file)
@@ -488,7 +488,10 @@ ssize_t SimpleRADOSStriper::read(void* data, size_t len, uint64_t off)
   }
 
   size_t r = 0;
-  std::vector<std::pair<bufferlist, aiocompletionptr>> reads;
+  // Don't use std::vector to store bufferlists (e.g for parallelizing aio_reads),
+  // as they are being moved whenever the vector resizes
+  // and will cause invalidated references.
+  std::deque<std::pair<bufferlist, aiocompletionptr>> reads;
   while ((len-r) > 0) {
     auto ext = get_next_extent(off+r, len-r);
     auto& [bl, aiocp] = reads.emplace_back();