mirror of
https://anongit.gentoo.org/git/repo/gentoo.git
synced 2025-06-08 22:25:42 +02:00
Series of patches picked out of ceph git repo. Closes: https://bugs.gentoo.org/952730 Signed-off-by: Patrick Lauer <patrick@gentoo.org>
95 lines
4 KiB
Diff
95 lines
4 KiB
Diff
commit 4cf9b36c66fd64f2dc50f4e1acca3fe93e29b3f2
|
||
Author: Kefu Chai <tchaikov@gmail.com>
|
||
Date: Sat Feb 3 19:22:15 2024 +0800
|
||
|
||
mgr: stop using deprecated API to initialize Python
|
||
|
||
Py_SetProgramName() is deprecated since CPython 3.11, see
|
||
https://docs.python.org/3/c-api/init_config.html .
|
||
`Py_InitializeFromConfig()` and friends were introduced by CPython 3.8,
|
||
but we still need to support CPython 3.6 which is shipped by CentOS8.
|
||
so we have to be backward compatible with the older Python versions.
|
||
|
||
so let's use new machinary to initialize the Python interpretor, since
|
||
the minimal supported Python version is now CPython 3.9 which comes with
|
||
CentOS 9.
|
||
|
||
this change addresses following compiling warning:
|
||
|
||
```
|
||
[428/753] Building CXX object src/mgr/CMakeFiles/ceph-mgr.dir/PyModuleRegistry.cc.o
|
||
/var/ssd/ceph/src/mgr/PyModuleRegistry.cc: In member function ‘void PyModuleRegistry::init()’:
|
||
/var/ssd/ceph/src/mgr/PyModuleRegistry.cc:49:20: warning: ‘void Py_SetProgramName(const wchar_t*)’ is deprecated [-Wdeprecated-declarations]
|
||
49 | Py_SetProgramName(const_cast<wchar_t*>(WCHAR(MGR_PYTHON_EXECUTABLE)));
|
||
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
In file included from /usr/include/python3.12/Python.h:94,
|
||
from /var/ssd/ceph/src/mgr/PyModule.h:22,
|
||
from /var/ssd/ceph/src/mgr/PyModuleRegistry.h:18,
|
||
from /var/ssd/ceph/src/mgr/PyModuleRegistry.cc:14:
|
||
/usr/include/python3.12/pylifecycle.h:37:38: note: declared here
|
||
37 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *);
|
||
| ^~~~~~~~~~~~~~~~~`
|
||
```
|
||
|
||
Signed-off-by: Kefu Chai <tchaikov@gmail.com>
|
||
|
||
diff --git a/src/mgr/PyModuleRegistry.cc b/src/mgr/PyModuleRegistry.cc
|
||
index eb2d2babe75..0d2650d6e59 100644
|
||
--- a/src/mgr/PyModuleRegistry.cc
|
||
+++ b/src/mgr/PyModuleRegistry.cc
|
||
@@ -14,6 +14,7 @@
|
||
#include "PyModuleRegistry.h"
|
||
|
||
#include <filesystem>
|
||
+#include <boost/scope_exit.hpp>
|
||
|
||
#include "include/stringify.h"
|
||
#include "common/errno.h"
|
||
@@ -46,21 +47,37 @@ void PyModuleRegistry::init()
|
||
|
||
// Set up global python interpreter
|
||
#define WCHAR(s) L ## #s
|
||
- Py_SetProgramName(const_cast<wchar_t*>(WCHAR(MGR_PYTHON_EXECUTABLE)));
|
||
-#undef WCHAR
|
||
+ PyConfig py_config;
|
||
+ // do not enable isolated mode, otherwise we would not be able to have access
|
||
+ // to the site packages. since we cannot import any module before initializing
|
||
+ // the interpreter, we would not be able to use "site" module for retrieving
|
||
+ // the path to site packager. we import "site" module for retrieving
|
||
+ // sitepackages in Python < 3.8 though, this does not apply to the
|
||
+ // initialization with PyConfig.
|
||
+ PyConfig_InitPythonConfig(&py_config);
|
||
+ BOOST_SCOPE_EXIT_ALL(&py_config) {
|
||
+ PyConfig_Clear(&py_config);
|
||
+ };
|
||
+#if PY_VERSION_HEX >= 0x030b0000
|
||
+ py_config.safe_path = 0;
|
||
+#endif
|
||
+ py_config.parse_argv = 0;
|
||
+ py_config.configure_c_stdio = 0;
|
||
+ py_config.install_signal_handlers = 0;
|
||
+ py_config.pathconfig_warnings = 0;
|
||
+
|
||
+ PyStatus status;
|
||
+ status = PyConfig_SetString(&py_config, &py_config.program_name, WCHAR(MGR_PYTHON_EXECUTABLE));
|
||
+ ceph_assertf(!PyStatus_Exception(status), "PyConfig_SetString: %s:%s", status.func, status.err_msg);
|
||
// Add more modules
|
||
if (g_conf().get_val<bool>("daemonize")) {
|
||
PyImport_AppendInittab("ceph_logger", PyModule::init_ceph_logger);
|
||
}
|
||
PyImport_AppendInittab("ceph_module", PyModule::init_ceph_module);
|
||
- Py_InitializeEx(0);
|
||
-#if PY_VERSION_HEX < 0x03090000
|
||
- // Let CPython know that we will be calling it back from other
|
||
- // threads in future.
|
||
- if (! PyEval_ThreadsInitialized()) {
|
||
- PyEval_InitThreads();
|
||
- }
|
||
-#endif
|
||
+ status = Py_InitializeFromConfig(&py_config);
|
||
+ ceph_assertf(!PyStatus_Exception(status), "Py_InitializeFromConfig: %s:%s", status.func, status.err_msg);
|
||
+#undef WCHAR
|
||
+
|
||
// Drop the GIL and remember the main thread state (current
|
||
// thread state becomes NULL)
|
||
pMainThreadState = PyEval_SaveThread();
|