- mgr_module_path
flags:
- startup
+- name: mgr_subinterpreter_modules
+ type: str
+ level: advanced
+ desc: List of manager modules to load in independent subinterpreters
+ long_desc: A comma delimited list of module names. This list is read by manager
+ when it starts. By default, manager loads each module into the main interpreter.
+ Modules in this list will instead be loaded into independent subinterpreters.
+ Specifying '*' will cause all modules to be run in independent subinterpreters.
+ default: @mgr_subinterpreter_modules@
+ services:
+ - mgr
+ flags:
+ - startup
- name: mgr_initial_modules
type: str
level: basic
#include "include/stringify.h"
#include "common/BackTrace.h"
#include "common/JSONFormatter.h"
+#include "common/split.h"
#include "global/signal_handler.h"
#include "common/debug.h"
{
ceph_assert(pMainThreadState != nullptr);
- // Configure sub-interpreter
- {
+ const auto subinterpreter_modules_opt = g_conf().get_val<std::string>(
+ "mgr_subinterpreter_modules"
+ );
+ auto subinterpreter_modules = ceph::split(subinterpreter_modules_opt);
+ use_main_interpreter = std::count(
+ subinterpreter_modules.begin(), subinterpreter_modules.end(), "*"
+ ) == 0 && std::count(
+ subinterpreter_modules.begin(), subinterpreter_modules.end(), module_name
+ ) == 0;
+
+ if (use_main_interpreter) {
+ // Use main interpreter
+ derr << "Loading module " << module_name << " in main interpreter" << dendl;
+ pMyThreadState.set(pMainThreadState);
+ } else {
+ // Configure sub-interpreter
+ derr << "Loading module " << module_name << " in sub-interpreter" << dendl;
SafeThreadState sts(pMainThreadState);
Gil gil(sts);
pMyThreadState.set(thread_state);
}
}
+
// Environment is all good, import the external module
{
Gil gil(pMyThreadState);
Py_XDECREF(pClass);
Py_XDECREF(pStandbyClass);
Py_XDECREF(pPickleModule);
- Py_EndInterpreter(pMyThreadState.ts);
+ if (use_main_interpreter) {
+ Py_EndInterpreter(pMyThreadState.ts);
+ }
pMyThreadState.ts = nullptr;
}
}
PyObject *pStandbyClass = nullptr;
PyObject *pPickleModule = nullptr;
+ // true unless module in mgr_subinterpreter_modules
+ bool use_main_interpreter = true;
+
explicit PyModule(const std::string &module_name_)
: module_name(module_name_)
{