Now plugins can talk to MDS daemons.
Signed-off-by: John Spray <john.spray@redhat.com>
add_executable(ceph-mgr ${mgr_srcs}
$<TARGET_OBJECTS:heap_profiler_objs>)
target_include_directories(ceph-mgr PRIVATE "${PYTHON_INCLUDE_DIRS}")
- target_link_libraries(ceph-mgr osdc global-static common
+ target_link_libraries(ceph-mgr osdc client global-static common
${Boost_PYTHON_LIBRARY} ${PYTHON_LIBRARIES} ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} ${ALLOC_LIBS})
install(TARGETS ceph-mgr DESTINATION bin)
endif (WITH_MGR)
#include <Python.h>
#include "osdc/Objecter.h"
+#include "client/Client.h"
#include "common/errno.h"
#include "mon/MonClient.h"
#include "include/stringify.h"
Mgr::Mgr(MonClient *monc_, Messenger *clientm_, Objecter *objecter_,
- LogChannelRef clog_, LogChannelRef audit_clog_) :
+ Client* client_, LogChannelRef clog_, LogChannelRef audit_clog_) :
monc(monc_),
objecter(objecter_),
+ client(client_),
client_messenger(clientm_),
lock("Mgr::lock"),
timer(g_ceph_context, lock),
finisher(g_ceph_context, "Mgr", "mgr-fin"),
- py_modules(daemon_state, cluster_state, *monc, *objecter, finisher),
+ py_modules(daemon_state, cluster_state, *monc, *objecter, *client,
+ finisher),
cluster_state(monc, nullptr),
server(monc, finisher, daemon_state, cluster_state, py_modules,
clog_, audit_clog_),
class MMgrDigest;
class MLog;
class Objecter;
+class Client;
class MgrPyModule;
protected:
MonClient *monc;
Objecter *objecter;
+ Client *client;
Messenger *client_messenger;
Mutex lock;
public:
Mgr(MonClient *monc_, Messenger *clientm_, Objecter *objecter_,
- LogChannelRef clog_, LogChannelRef audit_clog_);
+ Client *client_, LogChannelRef clog_, LogChannelRef audit_clog_);
~Mgr();
bool is_initialized() const {return initialized;}
#include "common/errno.h"
#include "mon/MonClient.h"
+#include "osdc/Objecter.h"
+#include "client/Client.h"
+
#include "include/stringify.h"
#include "global/global_context.h"
#include "global/signal_handler.h"
monc(new MonClient(g_ceph_context)),
client_messenger(Messenger::create_client_messenger(g_ceph_context, "mgr")),
objecter(new Objecter(g_ceph_context, client_messenger, monc, NULL, 0, 0)),
+ client(new Client(client_messenger, monc, objecter)),
log_client(g_ceph_context, client_messenger, &monc->monmap, LogClient::NO_FLAGS),
clog(log_client.create_channel(CLOG_CHANNEL_CLUSTER)),
audit_clog(log_client.create_channel(CLOG_CHANNEL_AUDIT)),
// Initialize Messenger
client_messenger->add_dispatcher_tail(this);
+ client_messenger->add_dispatcher_head(objecter);
+ client_messenger->add_dispatcher_tail(client.get());
client_messenger->start();
// Initialize MonClient
objecter->set_client_incarnation(0);
objecter->init();
- client_messenger->add_dispatcher_head(objecter);
objecter->start();
+ client->init();
+
timer.init();
send_beacon();
active_mgr->shutdown();
}
+ client->shutdown();
+
objecter->shutdown();
timer.shutdown();
if (active_in_map) {
if (!active_mgr) {
dout(1) << "Activating!" << dendl;
- active_mgr.reset(new Mgr(monc, client_messenger, objecter, clog, audit_clog));
+ active_mgr.reset(new Mgr(monc, client_messenger, objecter,
+ client.get(), clog, audit_clog));
active_mgr->background_init();
dout(1) << "I am now active" << dendl;
} else {
#include "DaemonState.h"
#include "ClusterState.h"
+class Objecter;
+class Client;
+
class MMgrMap;
class Mgr;
MonClient *monc;
Messenger *client_messenger;
Objecter *objecter;
+ std::unique_ptr<Client> client;
LogClient log_client;
LogChannelRef clog, audit_clog;
#define dout_prefix *_dout << "mgr " << __func__ << " "
PyModules::PyModules(DaemonStateIndex &ds, ClusterState &cs, MonClient &mc,
- Objecter &objecter_,
+ Objecter &objecter_, Client &client_,
Finisher &f)
: daemon_state(ds), cluster_state(cs), monc(mc),
- objecter(objecter_),
+ objecter(objecter_), client(client_),
finisher(f)
{}
#include "common/Mutex.h"
#include "common/Thread.h"
+#include "osdc/Objecter.h"
+#include "client/Client.h"
+
#include "DaemonState.h"
#include "ClusterState.h"
ClusterState &cluster_state;
MonClient &monc;
Objecter &objecter;
+ Client &client;
Finisher &finisher;
mutable Mutex lock{"PyModules"};
static constexpr auto config_prefix = "mgr.";
PyModules(DaemonStateIndex &ds, ClusterState &cs, MonClient &mc,
- Objecter &objecter_,
+ Objecter &objecter_, Client &client_,
Finisher &f);
~PyModules();
// FIXME: wrap for send_command?
MonClient &get_monc() {return monc;}
Objecter &get_objecter() {return objecter;}
+ Client &get_client() {return client;}
PyObject *get_python(const std::string &what);
PyObject *get_server_python(const std::string &hostname);
}
ceph_tid_t tid;
- global_handle()->get_objecter().osd_command(
+ global_handle->get_objecter().osd_command(
osd_id,
{cmd_json},
{},
&c->outs,
c);
} else if (std::string(type) == "mds") {
- // TODO: expose a Client instance
- return nullptr;
+ int r = global_handle->get_client().mds_command(
+ name,
+ {cmd_json},
+ {},
+ &c->outbl,
+ &c->outs,
+ c);
+ if (r != 0) {
+ // TODO: raise exception
+ return nullptr;
+ }
} else if (std::string(type) == "pg") {
// TODO: expose objecter::pg_command
return nullptr;