]> 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>
Thu, 1 Sep 2022 16:12:45 +0000 (16:12 +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 3a64193d3e41c6684da4a79e5111e4eb5d61231b..bbbf15527938852aa61c5ff5dfafb258533e5afd 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();