assert(lock.is_locked_by_me());
dout(1) << state_str() << dendl;
- std::list<PyModuleRef> modules;
- py_module_registry.get_modules(&modules);
+ std::list<PyModuleRef> modules = py_module_registry.get_modules();
// Construct a list of the info about each loaded module
// which we will transmit to the monitor.
std::list<std::string> failed_modules;
- std::set<std::string> module_names;
- list_modules(&module_names);
+ std::set<std::string> module_names = probe_modules();
// Load python code
for (const auto& module_name : module_names) {
dout(1) << "Loading python module '" << module_name << "'" << dendl;
Py_Finalize();
}
-static void _list_modules(
- const std::string path,
- std::set<std::string> *modules)
+std::set<std::string> PyModuleRegistry::probe_modules() const
{
+ std::string path = g_conf->get_val<std::string>("mgr_module_path");
+
DIR *dir = opendir(path.c_str());
if (!dir) {
- return;
+ return {};
}
+
+ std::set<std::string> modules_out;
struct dirent *entry = NULL;
while ((entry = readdir(dir)) != NULL) {
string n(entry->d_name);
string initfn = fn + "/module.py";
r = ::stat(initfn.c_str(), &st);
if (r == 0) {
- modules->insert(n);
+ modules_out.insert(n);
}
}
}
closedir(dir);
-}
-void PyModuleRegistry::list_modules(std::set<std::string> *modules)
-{
- g_conf->with_val<std::string>("mgr_module_path",
- &_list_modules, modules);
+ return modules_out;
}
int PyModuleRegistry::handle_command(
// before ClusterState exists.
MgrMap mgr_map;
+ /**
+ * Discover python modules from local disk
+ */
+ std::set<std::string> probe_modules() const;
+
public:
static std::string config_prefix;
- void list_modules(std::set<std::string> *modules);
-
- void get_modules(std::list<PyModuleRef> *modules_out)
+ /**
+ * Get references to all modules (whether they have loaded and/or
+ * errored) or not.
+ */
+ std::list<PyModuleRef> get_modules() const
{
Mutex::Locker l(lock);
+ std::list<PyModuleRef> modules_out;
for (const auto &i : modules) {
- modules_out->push_back(i.second);
+ modules_out.push_back(i.second);
}
+
+ return modules_out;
}
PyModuleRegistry(LogChannelRef clog_)