lock("Mgr::lock"),
timer(g_ceph_context, lock),
finisher(g_ceph_context, "Mgr", "mgr-fin"),
- py_modules(daemon_state, cluster_state, *monc, *objecter, *client,
+ py_modules(daemon_state, cluster_state, *monc, clog_, *objecter, *client,
finisher),
cluster_state(monc, nullptr),
server(monc, finisher, daemon_state, cluster_state, py_modules,
// because ServeThread is still an "incomplete" type there
PyModules::PyModules(DaemonStateIndex &ds, ClusterState &cs,
- MonClient &mc, Objecter &objecter_, Client &client_,
- Finisher &f)
- : daemon_state(ds), cluster_state(cs), monc(mc),
+ MonClient &mc, LogChannelRef clog_, Objecter &objecter_,
+ Client &client_, Finisher &f)
+ : daemon_state(ds), cluster_state(cs), monc(mc), clog(clog_),
objecter(objecter_), client(client_), finisher(f),
lock("PyModules")
{}
// thread state becomes NULL)
pMainThreadState = PyEval_SaveThread();
+ std::list<std::string> failed_modules;
+
// Load python code
boost::tokenizer<> tok(g_conf->mgr_modules);
for(const auto& module_name : tok) {
// or the right thread state (this is deliberate).
derr << "Error loading module '" << module_name << "': "
<< cpp_strerror(r) << dendl;
+ failed_modules.push_back(module_name);
// Don't drop out here, load the other modules
} else {
// Success!
}
}
+ if (!failed_modules.empty()) {
+ clog->error() << "Failed to load ceph-mgr modules: " << joinify(
+ failed_modules.begin(), failed_modules.end(), std::string(", "));
+ }
+
return 0;
}
#include "osdc/Objecter.h"
#include "client/Client.h"
+#include "common/LogClient.h"
#include "DaemonState.h"
#include "ClusterState.h"
DaemonStateIndex &daemon_state;
ClusterState &cluster_state;
MonClient &monc;
+ LogChannelRef clog;
Objecter &objecter;
Client &client;
Finisher &finisher;
static std::string config_prefix;
PyModules(DaemonStateIndex &ds, ClusterState &cs, MonClient &mc,
- Objecter &objecter_, Client &client_,
+ LogChannelRef clog_, Objecter &objecter_, Client &client_,
Finisher &f);
~PyModules();