From: Matan Breizman Date: Mon, 19 Feb 2024 16:11:53 +0000 (+0000) Subject: common/buffer_seastar: move to crimson/crimson/buffer_seastar X-Git-Tag: v20.0.0~2559^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F55641%2Fhead;p=ceph.git common/buffer_seastar: move to crimson/crimson/buffer_seastar Signed-off-by: Matan Breizman --- diff --git a/src/common/buffer_seastar.cc b/src/common/buffer_seastar.cc deleted file mode 100644 index fa040a4661c..00000000000 --- a/src/common/buffer_seastar.cc +++ /dev/null @@ -1,118 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab -/* - * Ceph - scalable distributed file system - * - * Copyright (C) 2017 Red Hat, Inc. - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1, as published by the Free Software - * Foundation. See file COPYING. - * - */ - -#include -#include -#include -#include - -#include "include/buffer_raw.h" -#include "buffer_seastar.h" - -using temporary_buffer = seastar::temporary_buffer; - -namespace ceph::buffer { - -class raw_seastar_foreign_ptr : public raw { - seastar::foreign_ptr ptr; - seastar::alien::instance& alien; - public: - raw_seastar_foreign_ptr(temporary_buffer&& buf) - : raw(buf.get_write(), buf.size()), ptr(std::move(buf)), - alien(seastar::engine().alien()) {} - - ~raw_seastar_foreign_ptr() { - if (!seastar::engine_is_ready()) { - // we should let a seastar reactor destroy this memory, we are alien. - seastar::alien::run_on(alien, ptr.get_owner_shard(), - [_ptr = std::move(ptr)]() mutable noexcept { - _ptr.reset(); - }); - } - } -}; - -class raw_seastar_local_ptr : public raw { - temporary_buffer buf; - public: - raw_seastar_local_ptr(temporary_buffer&& buf) - : raw(buf.get_write(), buf.size()), buf(std::move(buf)) {} -}; - -inline namespace v15_2_0 { - -ceph::unique_leakable_ptr create(temporary_buffer&& buf) { - return ceph::unique_leakable_ptr( - new raw_seastar_foreign_ptr(std::move(buf))); -} - -ceph::unique_leakable_ptr create_local(temporary_buffer&& buf) { - return ceph::unique_leakable_ptr( - new raw_seastar_local_ptr(std::move(buf))); -} - -} // inline namespace v15_2_0 - -// buffer::ptr conversions - -ptr::operator seastar::temporary_buffer() & -{ - return {c_str(), _len, seastar::make_object_deleter(*this)}; -} - -ptr::operator seastar::temporary_buffer() && -{ - auto data = c_str(); - auto length = _len; - return {data, length, seastar::make_object_deleter(std::move(*this))}; -} - -// buffer::list conversions - -list::operator seastar::net::packet() && -{ - seastar::net::packet p(_num); - for (auto& ptr : _buffers) { - // append each ptr as a temporary_buffer - p = seastar::net::packet(std::move(p), std::move(ptr)); - } - clear(); - return p; -} - -} // namespace ceph::buffer - -namespace { - -using ceph::buffer::raw; -class raw_seastar_local_shared_ptr : public raw { - temporary_buffer buf; -public: - raw_seastar_local_shared_ptr(temporary_buffer& buf) - : raw(buf.get_write(), buf.size()), buf(buf.share()) {} -}; -} - -buffer::ptr seastar_buffer_iterator::get_ptr(size_t len) -{ - buffer::ptr p{ceph::unique_leakable_ptr( - new raw_seastar_local_shared_ptr{buf})}; - p.set_length(len); - return p; -} - -buffer::ptr const_seastar_buffer_iterator::get_ptr(size_t len) -{ - return buffer::ptr{ buffer::copy(get_pos_add(len), len) }; -} diff --git a/src/common/buffer_seastar.h b/src/common/buffer_seastar.h deleted file mode 100644 index 70a7b93251b..00000000000 --- a/src/common/buffer_seastar.h +++ /dev/null @@ -1,62 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#include -#include "include/buffer.h" -#include "common/error_code.h" - -namespace details { - -template -class buffer_iterator_impl { -public: - using pointer = std::conditional_t; - buffer_iterator_impl(pointer first, const char* last) - : pos(first), end_ptr(last) - {} - pointer get_pos_add(size_t n) { - auto r = pos; - pos += n; - if (pos > end_ptr) { - throw buffer::end_of_buffer{}; - } - return r; - } - pointer get() const { - return pos; - } -protected: - pointer pos; - const char* end_ptr; -}; -} // namespace details - -class seastar_buffer_iterator : details::buffer_iterator_impl { - using parent = details::buffer_iterator_impl; - using temporary_buffer = seastar::temporary_buffer; -public: - seastar_buffer_iterator(temporary_buffer& b) - : parent(b.get_write(), b.end()), buf(b) - {} - using parent::pointer; - using parent::get_pos_add; - using parent::get; - ceph::buffer::ptr get_ptr(size_t len); - -private: - // keep the reference to buf around, so it can be "shared" by get_ptr() - temporary_buffer& buf; -}; - -class const_seastar_buffer_iterator : details::buffer_iterator_impl { - using parent = details::buffer_iterator_impl; - using temporary_buffer = seastar::temporary_buffer; -public: - const_seastar_buffer_iterator(temporary_buffer& b) - : parent(b.get_write(), b.end()) - {} - using parent::pointer; - using parent::get_pos_add; - using parent::get; - ceph::buffer::ptr get_ptr(size_t len); -}; diff --git a/src/crimson/CMakeLists.txt b/src/crimson/CMakeLists.txt index 510ffbd9df9..6bbd7b49ec7 100644 --- a/src/crimson/CMakeLists.txt +++ b/src/crimson/CMakeLists.txt @@ -24,6 +24,7 @@ set(crimson_common_srcs common/throttle.cc common/tmap_helpers.cc common/tri_mutex.cc + common/buffer_seastar.cc crush/CrushLocation.cc) # the specialized version of ceph-common, where @@ -35,7 +36,6 @@ add_library(crimson-common STATIC ${PROJECT_SOURCE_DIR}/src/common/bit_str.cc ${PROJECT_SOURCE_DIR}/src/common/bloom_filter.cc ${PROJECT_SOURCE_DIR}/src/common/buffer.cc - ${PROJECT_SOURCE_DIR}/src/common/buffer_seastar.cc ${PROJECT_SOURCE_DIR}/src/common/ceph_argparse.cc ${PROJECT_SOURCE_DIR}/src/common/ceph_context.cc ${PROJECT_SOURCE_DIR}/src/common/ceph_crypto.cc diff --git a/src/crimson/auth/KeyRing.cc b/src/crimson/auth/KeyRing.cc index 436e29c1bdd..b64d2d0f78a 100644 --- a/src/crimson/auth/KeyRing.cc +++ b/src/crimson/auth/KeyRing.cc @@ -10,7 +10,7 @@ #include #include -#include "common/buffer_seastar.h" +#include "crimson/common/buffer_seastar.h" #include "auth/KeyRing.h" #include "include/denc.h" #include "crimson/common/buffer_io.h" diff --git a/src/crimson/common/buffer_seastar.cc b/src/crimson/common/buffer_seastar.cc new file mode 100644 index 00000000000..fa040a4661c --- /dev/null +++ b/src/crimson/common/buffer_seastar.cc @@ -0,0 +1,118 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2017 Red Hat, Inc. + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#include +#include +#include +#include + +#include "include/buffer_raw.h" +#include "buffer_seastar.h" + +using temporary_buffer = seastar::temporary_buffer; + +namespace ceph::buffer { + +class raw_seastar_foreign_ptr : public raw { + seastar::foreign_ptr ptr; + seastar::alien::instance& alien; + public: + raw_seastar_foreign_ptr(temporary_buffer&& buf) + : raw(buf.get_write(), buf.size()), ptr(std::move(buf)), + alien(seastar::engine().alien()) {} + + ~raw_seastar_foreign_ptr() { + if (!seastar::engine_is_ready()) { + // we should let a seastar reactor destroy this memory, we are alien. + seastar::alien::run_on(alien, ptr.get_owner_shard(), + [_ptr = std::move(ptr)]() mutable noexcept { + _ptr.reset(); + }); + } + } +}; + +class raw_seastar_local_ptr : public raw { + temporary_buffer buf; + public: + raw_seastar_local_ptr(temporary_buffer&& buf) + : raw(buf.get_write(), buf.size()), buf(std::move(buf)) {} +}; + +inline namespace v15_2_0 { + +ceph::unique_leakable_ptr create(temporary_buffer&& buf) { + return ceph::unique_leakable_ptr( + new raw_seastar_foreign_ptr(std::move(buf))); +} + +ceph::unique_leakable_ptr create_local(temporary_buffer&& buf) { + return ceph::unique_leakable_ptr( + new raw_seastar_local_ptr(std::move(buf))); +} + +} // inline namespace v15_2_0 + +// buffer::ptr conversions + +ptr::operator seastar::temporary_buffer() & +{ + return {c_str(), _len, seastar::make_object_deleter(*this)}; +} + +ptr::operator seastar::temporary_buffer() && +{ + auto data = c_str(); + auto length = _len; + return {data, length, seastar::make_object_deleter(std::move(*this))}; +} + +// buffer::list conversions + +list::operator seastar::net::packet() && +{ + seastar::net::packet p(_num); + for (auto& ptr : _buffers) { + // append each ptr as a temporary_buffer + p = seastar::net::packet(std::move(p), std::move(ptr)); + } + clear(); + return p; +} + +} // namespace ceph::buffer + +namespace { + +using ceph::buffer::raw; +class raw_seastar_local_shared_ptr : public raw { + temporary_buffer buf; +public: + raw_seastar_local_shared_ptr(temporary_buffer& buf) + : raw(buf.get_write(), buf.size()), buf(buf.share()) {} +}; +} + +buffer::ptr seastar_buffer_iterator::get_ptr(size_t len) +{ + buffer::ptr p{ceph::unique_leakable_ptr( + new raw_seastar_local_shared_ptr{buf})}; + p.set_length(len); + return p; +} + +buffer::ptr const_seastar_buffer_iterator::get_ptr(size_t len) +{ + return buffer::ptr{ buffer::copy(get_pos_add(len), len) }; +} diff --git a/src/crimson/common/buffer_seastar.h b/src/crimson/common/buffer_seastar.h new file mode 100644 index 00000000000..70a7b93251b --- /dev/null +++ b/src/crimson/common/buffer_seastar.h @@ -0,0 +1,62 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include +#include "include/buffer.h" +#include "common/error_code.h" + +namespace details { + +template +class buffer_iterator_impl { +public: + using pointer = std::conditional_t; + buffer_iterator_impl(pointer first, const char* last) + : pos(first), end_ptr(last) + {} + pointer get_pos_add(size_t n) { + auto r = pos; + pos += n; + if (pos > end_ptr) { + throw buffer::end_of_buffer{}; + } + return r; + } + pointer get() const { + return pos; + } +protected: + pointer pos; + const char* end_ptr; +}; +} // namespace details + +class seastar_buffer_iterator : details::buffer_iterator_impl { + using parent = details::buffer_iterator_impl; + using temporary_buffer = seastar::temporary_buffer; +public: + seastar_buffer_iterator(temporary_buffer& b) + : parent(b.get_write(), b.end()), buf(b) + {} + using parent::pointer; + using parent::get_pos_add; + using parent::get; + ceph::buffer::ptr get_ptr(size_t len); + +private: + // keep the reference to buf around, so it can be "shared" by get_ptr() + temporary_buffer& buf; +}; + +class const_seastar_buffer_iterator : details::buffer_iterator_impl { + using parent = details::buffer_iterator_impl; + using temporary_buffer = seastar::temporary_buffer; +public: + const_seastar_buffer_iterator(temporary_buffer& b) + : parent(b.get_write(), b.end()) + {} + using parent::pointer; + using parent::get_pos_add; + using parent::get; + ceph::buffer::ptr get_ptr(size_t len); +}; diff --git a/src/test/crimson/test_denc.cc b/src/test/crimson/test_denc.cc index 10ebd6dce57..568f81cdf7f 100644 --- a/src/test/crimson/test_denc.cc +++ b/src/test/crimson/test_denc.cc @@ -2,7 +2,7 @@ #include #include #include "include/denc.h" -#include "common/buffer_seastar.h" +#include "crimson/common/buffer_seastar.h" using temporary_buffer = seastar::temporary_buffer; using buffer_iterator = seastar_buffer_iterator;