From 41c385ba4d418557f8d6a52e3b726f638d5f7ab8 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 12 Feb 2019 18:11:07 +0100 Subject: [PATCH] buffer: disable hypercombining in bufferlist. 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 --- src/common/buffer.cc | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 5bae77e8ccedf..a3c6201d208a5 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -2164,6 +2164,7 @@ bool buffer::ptr_node::dispose_if_hypercombined( const bool is_hypercombined = static_cast(delete_this) == \ static_cast(&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::create_hypercombined(ceph::unique_leakable_ptr 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( - new (&r->bptr_storage) ptr_node(std::move(r))); + new ptr_node(std::move(r))); } std::unique_ptr 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( - new (&r->bptr_storage) ptr_node(r)); + new ptr_node(r)); } else { return std::unique_ptr( 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()( -- 2.39.5