From: John Spray Date: Thu, 30 Mar 2017 14:07:23 +0000 (-0400) Subject: mgr: embed Client instance for mds_command X-Git-Tag: v12.0.3~79^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=3746e209d88137206b5ad319dc049207bc4e2524;p=ceph-ci.git mgr: embed Client instance for mds_command Now plugins can talk to MDS daemons. Signed-off-by: John Spray --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4193a867e5c..73b6b78fcb2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -662,7 +662,7 @@ if (WITH_MGR) add_executable(ceph-mgr ${mgr_srcs} $) 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) diff --git a/src/mgr/Mgr.cc b/src/mgr/Mgr.cc index fa534aa0b14..ada01f19077 100644 --- a/src/mgr/Mgr.cc +++ b/src/mgr/Mgr.cc @@ -14,6 +14,7 @@ #include #include "osdc/Objecter.h" +#include "client/Client.h" #include "common/errno.h" #include "mon/MonClient.h" #include "include/stringify.h" @@ -39,14 +40,16 @@ 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_), diff --git a/src/mgr/Mgr.h b/src/mgr/Mgr.h index 652fff94f61..2efb2683f8a 100644 --- a/src/mgr/Mgr.h +++ b/src/mgr/Mgr.h @@ -40,6 +40,7 @@ class MCommand; class MMgrDigest; class MLog; class Objecter; +class Client; class MgrPyModule; @@ -48,6 +49,7 @@ class Mgr { protected: MonClient *monc; Objecter *objecter; + Client *client; Messenger *client_messenger; Mutex lock; @@ -71,7 +73,7 @@ protected: 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;} diff --git a/src/mgr/MgrStandby.cc b/src/mgr/MgrStandby.cc index 613a075e7ed..ea7055b5bfc 100644 --- a/src/mgr/MgrStandby.cc +++ b/src/mgr/MgrStandby.cc @@ -15,6 +15,9 @@ #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" @@ -38,6 +41,7 @@ MgrStandby::MgrStandby() : 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)), @@ -97,6 +101,8 @@ int MgrStandby::init() // 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 @@ -135,9 +141,10 @@ int MgrStandby::init() objecter->set_client_incarnation(0); objecter->init(); - client_messenger->add_dispatcher_head(objecter); objecter->start(); + client->init(); + timer.init(); send_beacon(); @@ -184,6 +191,8 @@ void MgrStandby::shutdown() active_mgr->shutdown(); } + client->shutdown(); + objecter->shutdown(); timer.shutdown(); @@ -229,7 +238,8 @@ void MgrStandby::handle_mgr_map(MMgrMap* mmap) 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 { diff --git a/src/mgr/MgrStandby.h b/src/mgr/MgrStandby.h index 89ede8cee2c..0eaf11c1016 100644 --- a/src/mgr/MgrStandby.h +++ b/src/mgr/MgrStandby.h @@ -26,6 +26,9 @@ #include "DaemonState.h" #include "ClusterState.h" +class Objecter; +class Client; + class MMgrMap; class Mgr; @@ -41,6 +44,7 @@ protected: MonClient *monc; Messenger *client_messenger; Objecter *objecter; + std::unique_ptr client; LogClient log_client; LogChannelRef clog, audit_clog; diff --git a/src/mgr/PyModules.cc b/src/mgr/PyModules.cc index 7501ac55e29..3e00822fc28 100644 --- a/src/mgr/PyModules.cc +++ b/src/mgr/PyModules.cc @@ -61,10 +61,10 @@ namespace { #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) {} diff --git a/src/mgr/PyModules.h b/src/mgr/PyModules.h index b5fdde8a776..8e929113053 100644 --- a/src/mgr/PyModules.h +++ b/src/mgr/PyModules.h @@ -20,6 +20,9 @@ #include "common/Mutex.h" #include "common/Thread.h" +#include "osdc/Objecter.h" +#include "client/Client.h" + #include "DaemonState.h" #include "ClusterState.h" @@ -33,6 +36,7 @@ class PyModules ClusterState &cluster_state; MonClient &monc; Objecter &objecter; + Client &client; Finisher &finisher; mutable Mutex lock{"PyModules"}; @@ -43,7 +47,7 @@ public: static constexpr auto config_prefix = "mgr."; PyModules(DaemonStateIndex &ds, ClusterState &cs, MonClient &mc, - Objecter &objecter_, + Objecter &objecter_, Client &client_, Finisher &f); ~PyModules(); @@ -51,6 +55,7 @@ public: // 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); diff --git a/src/mgr/PyState.cc b/src/mgr/PyState.cc index cbc28bb36bc..ca62c762b94 100644 --- a/src/mgr/PyState.cc +++ b/src/mgr/PyState.cc @@ -122,7 +122,7 @@ ceph_send_command(PyObject *self, PyObject *args) } ceph_tid_t tid; - global_handle()->get_objecter().osd_command( + global_handle->get_objecter().osd_command( osd_id, {cmd_json}, {}, @@ -131,8 +131,17 @@ ceph_send_command(PyObject *self, PyObject *args) &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;