]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
buffer: disable hypercombining in bufferlist. 26391/head
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 12 Feb 2019 17:11:07 +0000 (18:11 +0100)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 12 Feb 2019 17:11:10 +0000 (18:11 +0100)
We're seeing various failures like:

      * http://tracker.ceph.com/issues/38024,
      * http://tracker.ceph.com/issues/38230,
      * http://tracker.ceph.com/issues/37910

without a clear cause. Disabling hypercombining makes at least one
reproducer happy.

Fixes: http://tracker.ceph.com/issues/38024
Fixes: http://tracker.ceph.com/issues/38230
Fixes: http://tracker.ceph.com/issues/37910
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/common/buffer.cc

index 5bae77e8ccedff59906e47468bf1ab9b491578cc..a3c6201d208a5dc868bc161f27dd61f93b9824c7 100644 (file)
@@ -2164,6 +2164,7 @@ bool buffer::ptr_node::dispose_if_hypercombined(
   const bool is_hypercombined = static_cast<void*>(delete_this) == \
     static_cast<void*>(&delete_this->get_raw()->bptr_storage);
   if (is_hypercombined) {
+    ceph_assert_always("hypercombining is currently disabled" == nullptr);
     delete_this->~ptr_node();
   }
   return is_hypercombined;
@@ -2172,16 +2173,22 @@ bool buffer::ptr_node::dispose_if_hypercombined(
 std::unique_ptr<buffer::ptr_node, buffer::ptr_node::disposer>
 buffer::ptr_node::create_hypercombined(ceph::unique_leakable_ptr<buffer::raw> r)
 {
+  // FIXME: we don't currently hypercombine buffers due to crashes
+  // observed in the rados suite. After fixing we'll use placement
+  // new to create ptr_node on buffer::raw::bptr_storage.
   return std::unique_ptr<buffer::ptr_node, buffer::ptr_node::disposer>(
-    new (&r->bptr_storage) ptr_node(std::move(r)));
+    new ptr_node(std::move(r)));
 }
 
 std::unique_ptr<buffer::ptr_node, buffer::ptr_node::disposer>
 buffer::ptr_node::create_hypercombined(buffer::raw* const r)
 {
   if (likely(r->nref == 0)) {
+    // FIXME: we don't currently hypercombine buffers due to crashes
+    // observed in the rados suite. After fixing we'll use placement
+    // new to create ptr_node on buffer::raw::bptr_storage.
     return std::unique_ptr<buffer::ptr_node, buffer::ptr_node::disposer>(
-      new (&r->bptr_storage) ptr_node(r));
+      new ptr_node(r));
   } else {
     return std::unique_ptr<buffer::ptr_node, buffer::ptr_node::disposer>(
       new ptr_node(r));
@@ -2191,9 +2198,11 @@ buffer::ptr_node::create_hypercombined(buffer::raw* const r)
 buffer::ptr_node* buffer::ptr_node::copy_hypercombined(
   const buffer::ptr_node& copy_this)
 {
+  // FIXME: we don't currently hypercombine buffers due to crashes
+  // observed in the rados suite. After fixing we'll use placement
+  // new to create ptr_node on buffer::raw::bptr_storage.
   auto raw_new = copy_this.get_raw()->clone();
-  return new (&raw_new->bptr_storage)
-    ptr_node(copy_this, std::move(raw_new));
+  return new ptr_node(copy_this, std::move(raw_new));
 }
 
 buffer::ptr_node* buffer::ptr_node::cloner::operator()(