-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Backports a few fixes for GCC 14 that some of the upstream's distro builds have encountered. This takes from the SUSE's leap stream, though we had to cut out parts, so it isn't a "real" backport. References: SUSE/ceph#516
- Loading branch information
Showing
1 changed file
with
398 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,398 @@ | ||
From cc9787d3d27541f263028a2d7bb9b2e3404df6a3 Mon Sep 17 00:00:00 2001 | ||
From: Florian Weimer <[email protected]> | ||
Date: Wed, 20 Dec 2023 14:16:19 +0100 | ||
Subject: [PATCH 1/5] tracing: Fix C type errors in librados tracing | ||
MIME-Version: 1.0 | ||
Content-Type: text/plain; charset=UTF-8 | ||
Content-Transfer-Encoding: 8bit | ||
|
||
This fixes type errors like this: | ||
|
||
In file included from /usr/include/lttng/tracepoint-event.h:69, | ||
from …-build/include/tracing/librados.h:4143, | ||
from …/src/tracing/librados.c:6 | ||
: | ||
…-build/include/tracing/librados.h: | ||
In function ‘lttng_ust__event_probe__librados___rados_mon_command_exit’: | ||
…-build/include/tracing/librados.h:477:9: error: initialization of ‘size_t’ {aka ‘long unsigned int’} from ‘size_t *’ {aka ‘long unsigned int *’} makes integer from pointer without a cast | ||
477 | ceph_ctf_integerp(size_t, outslen, outslen) | ||
| ^~~~~~~~~~~~~~~~~ | ||
|
||
GCC 14 will likely treat these type mismatches as an error | ||
and fail the build. | ||
|
||
Signed-off-by: Florian Weimer <[email protected]> | ||
(cherry picked from commit f9aea9105b6c1a8d7bff0ec0675f84f2ffb1db6f) | ||
--- | ||
src/tracing/librados.tp | 4 ++-- | ||
src/tracing/tracing-common.h | 2 +- | ||
2 files changed, 3 insertions(+), 3 deletions(-) | ||
|
||
diff --git a/src/tracing/librados.tp b/src/tracing/librados.tp | ||
index 80bb79f9ce43e..f12bcf2d3f97b 100644 | ||
--- a/src/tracing/librados.tp | ||
+++ b/src/tracing/librados.tp | ||
@@ -2586,7 +2586,7 @@ TRACEPOINT_EVENT(librados, rados_watch3_enter, | ||
TP_FIELDS( | ||
ctf_integer_hex(rados_ioctx_t, ioctx, ioctx) | ||
ctf_string(oid, oid) | ||
- ctf_integer_hex(uint64_t, phandle, phandle) | ||
+ ctf_integer_hex(uint64_t*, phandle, phandle) | ||
ctf_integer_hex(rados_watchcb2_t, callback, callback) | ||
ctf_integer(uint32_t, timeout, timeout) | ||
ctf_integer_hex(void*, arg, arg) | ||
@@ -2616,7 +2616,7 @@ TRACEPOINT_EVENT(librados, rados_aio_watch2_enter, | ||
ctf_integer_hex(rados_ioctx_t, ioctx, ioctx) | ||
ctf_string(oid, oid) | ||
ctf_integer_hex(rados_completion_t, completion, completion) | ||
- ctf_integer_hex(uint64_t, phandle, phandle) | ||
+ ctf_integer_hex(uint64_t*, phandle, phandle) | ||
ctf_integer_hex(rados_watchcb2_t, callback, callback) | ||
ctf_integer(uint32_t, timeout, timeout) | ||
ctf_integer_hex(void*, arg, arg) | ||
diff --git a/src/tracing/tracing-common.h b/src/tracing/tracing-common.h | ||
index 3e07f9de8e85c..03449ab588615 100644 | ||
--- a/src/tracing/tracing-common.h | ||
+++ b/src/tracing/tracing-common.h | ||
@@ -21,7 +21,7 @@ | ||
// type should be an integer type | ||
// val should have type type* | ||
#define ceph_ctf_integerp(type, field, val) \ | ||
- ctf_integer(type, field, (val) == NULL ? 0 : (val)) \ | ||
+ ctf_integer(type, field, (val) == NULL ? 0 : *(val)) \ | ||
ctf_integer(uint8_t, field##_isnull, (val) == NULL) | ||
|
||
// val should have type char* | ||
|
||
From 0edfe25271cc3a7873e13c071471a0964cdc7c47 Mon Sep 17 00:00:00 2001 | ||
From: Florian Weimer <[email protected]> | ||
Date: Wed, 20 Dec 2023 14:59:19 +0100 | ||
Subject: [PATCH 2/5] pybind: Fix C type errors in Cython-generated Python | ||
bindings | ||
MIME-Version: 1.0 | ||
Content-Type: text/plain; charset=UTF-8 | ||
Content-Transfer-Encoding: 8bit | ||
|
||
Several Ceph APIs use bool * types, which correspond to | ||
libcpp.bool * types in Cython. The bint type has an incorrect | ||
size 4 and cannot be used as a replacement. | ||
|
||
This prevents a compilation failure with future compilers: | ||
|
||
…-build/src/pybind/rbd/rbd.c: In function ‘__pyx_pf_3rbd_3RBD_104namespace_exists’: | ||
…-build/src/pybind/rbd/rbd.c:42165:76: error: passing argument 3 of ‘rbd_namespace_exists’ from incompatible pointer type | ||
42165 | __pyx_v_ret = rbd_namespace_exists(__pyx_v__ioctx, __pyx_v__name, (&__pyx_v__exists)); | ||
| ~^~~~~~~~~~~~~~~~~ | ||
| | | ||
| int * | ||
In file included from …-build/src/pybind/rbd/rbd.c:1268: | ||
…/src/include/rbd/librbd.h:1496:45: note: expected ‘_Bool *’ but argument is of type ‘int *’ | ||
1496 | bool *exists); | ||
| ^ | ||
|
||
Signed-off-by: Florian Weimer <[email protected]> | ||
(cherry picked from commit a49d154f4a8e493baf2296a15c7b5c56cd25e993) | ||
--- | ||
src/pybind/rbd/c_rbd.pxd | 5 +++-- | ||
src/pybind/rbd/mock_rbd.pxi | 9 +++++++-- | ||
src/pybind/rbd/rbd.pyx | 9 +++++---- | ||
src/pybind/rgw/mock_rgw.pxi | 9 +++++++-- | ||
src/pybind/rgw/rgw.pyx | 3 ++- | ||
5 files changed, 24 insertions(+), 11 deletions(-) | ||
|
||
diff --git a/src/pybind/rbd/c_rbd.pxd b/src/pybind/rbd/c_rbd.pxd | ||
index 275984209f79a..bfe2952bd56de 100644 | ||
--- a/src/pybind/rbd/c_rbd.pxd | ||
+++ b/src/pybind/rbd/c_rbd.pxd | ||
@@ -2,6 +2,7 @@ | ||
|
||
from libc.stdint cimport * | ||
from ctime cimport time_t, timespec | ||
+cimport libcpp | ||
|
||
cdef extern from "rados/librados.h": | ||
enum: | ||
@@ -515,7 +516,7 @@ cdef extern from "rbd/librbd.h" nogil: | ||
int rbd_snap_unprotect(rbd_image_t image, const char *snap_name) | ||
int rbd_snap_is_protected(rbd_image_t image, const char *snap_name, | ||
int *is_protected) | ||
- int rbd_snap_exists(rbd_image_t image, const char *snapname, bint *exists) | ||
+ int rbd_snap_exists(rbd_image_t image, const char *snapname, libcpp.bool *exists) | ||
int rbd_snap_get_limit(rbd_image_t image, uint64_t *limit) | ||
int rbd_snap_set_limit(rbd_image_t image, uint64_t limit) | ||
int rbd_snap_get_timestamp(rbd_image_t image, uint64_t snap_id, timespec *timestamp) | ||
@@ -701,7 +702,7 @@ cdef extern from "rbd/librbd.h" nogil: | ||
int rbd_namespace_list(rados_ioctx_t io, char *namespace_names, | ||
size_t *size) | ||
int rbd_namespace_exists(rados_ioctx_t io, const char *namespace_name, | ||
- bint *exists) | ||
+ libcpp.bool *exists) | ||
|
||
int rbd_pool_init(rados_ioctx_t, bint force) | ||
|
||
diff --git a/src/pybind/rbd/mock_rbd.pxi b/src/pybind/rbd/mock_rbd.pxi | ||
index ddba059ba4e92..83393214ad2af 100644 | ||
--- a/src/pybind/rbd/mock_rbd.pxi | ||
+++ b/src/pybind/rbd/mock_rbd.pxi | ||
@@ -3,6 +3,11 @@ | ||
from libc.stdint cimport * | ||
from ctime cimport time_t, timespec | ||
|
||
+# Make the bool type available as libcpp.bool, for both C and C++. | ||
+cimport libcpp | ||
+cdef extern from "<stdbool.h>": | ||
+ pass | ||
+ | ||
cdef nogil: | ||
enum: | ||
_LIBRADOS_SNAP_HEAD "LIBRADOS_SNAP_HEAD" | ||
@@ -627,7 +632,7 @@ cdef nogil: | ||
int rbd_snap_is_protected(rbd_image_t image, const char *snap_name, | ||
int *is_protected): | ||
pass | ||
- int rbd_snap_exists(rbd_image_t image, const char *snapname, bint *exists): | ||
+ int rbd_snap_exists(rbd_image_t image, const char *snapname, libcpp.bool *exists): | ||
pass | ||
int rbd_snap_get_limit(rbd_image_t image, uint64_t *limit): | ||
pass | ||
@@ -886,7 +891,7 @@ cdef nogil: | ||
size_t *size): | ||
pass | ||
int rbd_namespace_exists(rados_ioctx_t io, const char *namespace_name, | ||
- bint *exists): | ||
+ libcpp.bool *exists): | ||
pass | ||
int rbd_pool_init(rados_ioctx_t io, bint force): | ||
pass | ||
diff --git a/src/pybind/rbd/rbd.pyx b/src/pybind/rbd/rbd.pyx | ||
index e2a22ef183a44..22d76c9dd7b23 100644 | ||
--- a/src/pybind/rbd/rbd.pyx | ||
+++ b/src/pybind/rbd/rbd.pyx | ||
@@ -23,6 +23,7 @@ from libc cimport errno | ||
from libc.stdint cimport * | ||
from libc.stdlib cimport malloc, realloc, free | ||
from libc.string cimport strdup, memset | ||
+cimport libcpp | ||
|
||
try: | ||
from collections.abc import Iterable | ||
@@ -1934,12 +1935,12 @@ class RBD(object): | ||
cdef: | ||
rados_ioctx_t _ioctx = convert_ioctx(ioctx) | ||
const char *_name = name | ||
- bint _exists = False | ||
+ libcpp.bool _exists = False | ||
with nogil: | ||
ret = rbd_namespace_exists(_ioctx, _name, &_exists) | ||
if ret != 0: | ||
raise make_ex(ret, 'error verifying namespace') | ||
- return bool(_exists != 0) | ||
+ return _exists | ||
|
||
def namespace_list(self, ioctx): | ||
""" | ||
@@ -3678,12 +3679,12 @@ cdef class Image(object): | ||
name = cstr(name, 'name') | ||
cdef: | ||
char *_name = name | ||
- bint _exists = False | ||
+ libcpp.bool _exists = False | ||
with nogil: | ||
ret = rbd_snap_exists(self.image, _name, &_exists) | ||
if ret != 0: | ||
raise make_ex(ret, 'error getting snapshot exists for %s' % self.name) | ||
- return bool(_exists != 0) | ||
+ return _exists | ||
|
||
@requires_not_closed | ||
def get_snap_limit(self): | ||
diff --git a/src/pybind/rgw/mock_rgw.pxi b/src/pybind/rgw/mock_rgw.pxi | ||
index ca893a5bb8a16..806d4df75de05 100644 | ||
--- a/src/pybind/rgw/mock_rgw.pxi | ||
+++ b/src/pybind/rgw/mock_rgw.pxi | ||
@@ -1,5 +1,10 @@ | ||
# cython: embedsignature=True | ||
|
||
+# Make the bool type available as libcpp.bool, for both C and C++. | ||
+cimport libcpp | ||
+cdef extern from "<stdbool.h>": | ||
+ pass | ||
+ | ||
cdef nogil: | ||
ctypedef void* librgw_t | ||
|
||
@@ -111,8 +116,8 @@ cdef nogil: | ||
|
||
int rgw_readdir(rgw_fs *fs, | ||
rgw_file_handle *parent_fh, uint64_t *offset, | ||
- bint (*cb)(const char *name, void *arg, uint64_t offset, stat *st, uint32_t st_mask, uint32_t flags) nogil except? -9000, | ||
- void *cb_arg, bint *eof, uint32_t flags) except? -9000: | ||
+ libcpp.bool (*cb)(const char *name, void *arg, uint64_t offset, stat *st, uint32_t st_mask, uint32_t flags) nogil except? -9000, | ||
+ void *cb_arg, libcpp.bool *eof, uint32_t flags) except? -9000: | ||
pass | ||
|
||
int rgw_getattr(rgw_fs *fs, | ||
diff --git a/src/pybind/rgw/rgw.pyx b/src/pybind/rgw/rgw.pyx | ||
index 9bbcdfff586a8..d210a70bbb8e3 100644 | ||
--- a/src/pybind/rgw/rgw.pyx | ||
+++ b/src/pybind/rgw/rgw.pyx | ||
@@ -7,6 +7,7 @@ from cpython cimport PyObject, ref, exc, array | ||
from libc.stdint cimport * | ||
from libc.stdlib cimport malloc, realloc, free | ||
from cstat cimport stat | ||
+cimport libcpp | ||
|
||
IF BUILD_DOC: | ||
include "mock_rgw.pxi" | ||
@@ -373,7 +374,7 @@ cdef class LibRGWFS(object): | ||
cdef: | ||
rgw_file_handle *_dir_handler = <rgw_file_handle*>dir_handler.handler | ||
uint64_t _offset = offset | ||
- bint _eof | ||
+ libcpp.bool _eof | ||
uint32_t _flags = flags | ||
with nogil: | ||
ret = rgw_readdir(self.fs, _dir_handler, &_offset, &readdir_cb, | ||
|
||
From 73f78890f8fef0c339fea76d07b1576b419b7ace Mon Sep 17 00:00:00 2001 | ||
From: Radoslaw Zarzynski <[email protected]> | ||
Date: Wed, 24 Jan 2024 17:22:44 +0000 | ||
Subject: [PATCH 3/5] common/dout: fix FTBFS on GCC 14 | ||
MIME-Version: 1.0 | ||
Content-Type: text/plain; charset=UTF-8 | ||
Content-Transfer-Encoding: 8bit | ||
|
||
The following problem has been reported by Kaleb Keithley: | ||
|
||
``` | ||
/builddir/build/BUILD/ceph-18.2.1/src/osd/osd_types.h: In lambda function: | ||
/builddir/build/BUILD/ceph-18.2.1/src/common/dout.h:184:73: error: call to non-‘constexpr’ function ‘virtual unsigned int DoutPrefixProvider::get_subsys() const’ | ||
184 | dout_impl(pdpp->get_cct(), ceph::dout::need_dynamic(pdpp->get_subsys()), v) \ | ||
| ~~~~~~~~~~~~~~~~^~ | ||
/builddir/build/BUILD/ceph-18.2.1/src/common/dout.h:155:58: note: in definition of macro ‘dout_impl’ | ||
155 | return (cctX->_conf->subsys.template should_gather<sub, v>()); \ | ||
| ^~~ | ||
/builddir/build/BUILD/ceph-18.2.1/src/osd/osd_types.h:3617:3: note: in expansion of macro ‘ldpp_dout’ | ||
3617 | ldpp_dout(dpp, 10) << "build_prior all_probe " << all_probe << dendl; | ||
| ^~~~~~~~~ | ||
``` | ||
|
||
For details of the problem and the idea behind the fix, | ||
please refer to the comment this commit brings to `dout.h`. | ||
|
||
The minimized replicator that the facilitated Goldbot-based | ||
investigation: | ||
|
||
```cpp | ||
namespace ceph::dout { | ||
|
||
template<typename T> | ||
struct dynamic_marker_t { | ||
T value; | ||
// constexpr ctor isn't needed as it's an aggregate type | ||
constexpr operator T() const { return value; } | ||
}; | ||
|
||
template<typename T> | ||
constexpr dynamic_marker_t<T> need_dynamic(T&& t) { | ||
return dynamic_marker_t<T>{ std::forward<T>(t) }; | ||
} | ||
|
||
template<typename T> | ||
struct is_dynamic : public std::false_type {}; | ||
|
||
template<typename T> | ||
struct is_dynamic<dynamic_marker_t<T>> : public std::true_type {}; | ||
|
||
} // ceph::dout | ||
|
||
struct subsys_t { | ||
template <unsigned SubV, int LvlV> | ||
bool should_gather() const { | ||
return true; | ||
} | ||
bool should_gather(const unsigned sub, int level) const { | ||
return false; | ||
} | ||
}; | ||
|
||
static subsys_t subsys; | ||
|
||
do { \ | ||
const bool should_gather = [&](const auto cctX) { \ | ||
if constexpr (ceph::dout::is_dynamic<decltype(sub)>::value || \ | ||
ceph::dout::is_dynamic<decltype(v)>::value) { \ | ||
std::cout << "the dynamic path" << std::endl; \ | ||
return subsys.should_gather(sub, v); \ | ||
} else { \ | ||
/* The parentheses are **essential** because commas in angle \ | ||
* brackets are NOT ignored on macro expansion! A language's \ | ||
* limitation, sorry. */ \ | ||
std::cout << "the static path" << std::endl; \ | ||
/*return subsys.should_gather(sub, v);*/ \ | ||
return (subsys.template should_gather<sub, v>()); \ | ||
} \ | ||
}(cct); \ | ||
} while (0) | ||
|
||
if (decltype(auto) pdpp = (dpp); pdpp) /* workaround -Wnonnull-compare for 'this' */ \ | ||
dout_impl(42, sub, v) | ||
|
||
if (decltype(auto) pdpp = (dpp); pdpp) /* workaround -Wnonnull-compare for 'this' */ \ | ||
dout_impl(42, ceph::dout::need_dynamic(42), v) | ||
|
||
int main() { | ||
std::random_device dev; | ||
std::mt19937 rng(dev()); | ||
std::uniform_int_distribution<std::mt19937::result_type> dist6(1,6); // distribution in range [1, 6] | ||
|
||
int sub = dist6(rng); | ||
ldpp_dout("mocked out", sub); | ||
//ldpp_subdout("mocked out", 4, 3); | ||
} | ||
``` | ||
|
||
Fixes: https://tracker.ceph.com/issues/64050 | ||
Signed-off-by: Radoslaw Zarzynski <[email protected]> | ||
(cherry picked from commit 0eace4ea9ea42412d4d6a16d24a8660642e41173) | ||
--- | ||
src/common/dout.h | 20 +++++++++++++++----- | ||
1 file changed, 15 insertions(+), 5 deletions(-) | ||
|
||
diff --git a/src/common/dout.h b/src/common/dout.h | ||
index a1375fbb91026..8caba1abe3eef 100644 | ||
--- a/src/common/dout.h | ||
+++ b/src/common/dout.h | ||
@@ -146,17 +146,27 @@ struct is_dynamic<dynamic_marker_t<T>> : public std::true_type {}; | ||
#else | ||
#define dout_impl(cct, sub, v) \ | ||
do { \ | ||
- const bool should_gather = [&](const auto cctX) { \ | ||
- if constexpr (ceph::dout::is_dynamic<decltype(sub)>::value || \ | ||
- ceph::dout::is_dynamic<decltype(v)>::value) { \ | ||
+ const bool should_gather = [&](const auto cctX, auto sub_, auto v_) { \ | ||
+ /* The check is performed on `sub_` and `v_` to leverage the C++'s \ | ||
+ * guarantee on _discarding_ one of blocks of `if constexpr`, which \ | ||
+ * includes also the checks for ill-formed code (`should_gather<>` \ | ||
+ * must not be feed with non-const expresions), BUT ONLY within \ | ||
+ * a template (thus the generic lambda) and under the restriction \ | ||
+ * it's dependant on a parameter of this template). \ | ||
+ * GCC prior to v14 was not enforcing these restrictions. */ \ | ||
+ if constexpr (ceph::dout::is_dynamic<decltype(sub_)>::value || \ | ||
+ ceph::dout::is_dynamic<decltype(v_)>::value) { \ | ||
return cctX->_conf->subsys.should_gather(sub, v); \ | ||
} else { \ | ||
+ constexpr auto sub_helper = static_cast<decltype(sub_)>(sub); \ | ||
+ constexpr auto v_helper = static_cast<decltype(v_)>(v); \ | ||
/* The parentheses are **essential** because commas in angle \ | ||
* brackets are NOT ignored on macro expansion! A language's \ | ||
* limitation, sorry. */ \ | ||
- return (cctX->_conf->subsys.template should_gather<sub, v>()); \ | ||
+ return (cctX->_conf->subsys.template should_gather<sub_helper, \ | ||
+ v_helper>()); \ | ||
} \ | ||
- }(cct); \ | ||
+ }(cct, sub, v); \ | ||
\ | ||
if (should_gather) { \ | ||
ceph::logging::MutableEntry _dout_e(v, sub); \ |