]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: embed Client instance for mds_command
authorJohn Spray <john.spray@redhat.com>
Thu, 30 Mar 2017 14:07:23 +0000 (10:07 -0400)
committerKefu Chai <kchai@redhat.com>
Wed, 3 May 2017 05:37:52 +0000 (13:37 +0800)
Now plugins can talk to MDS daemons.

Signed-off-by: John Spray <john.spray@redhat.com>
src/CMakeLists.txt
src/mgr/Mgr.cc
src/mgr/Mgr.h
src/mgr/MgrStandby.cc
src/mgr/MgrStandby.h
src/mgr/PyModules.cc
src/mgr/PyModules.h
src/mgr/PyState.cc

index 4193a867e5cce95f479e571cf288ffb1087c3a56..73b6b78fcb27fac8994d85e2bb86e33a87b23cac 100644 (file)
@@ -662,7 +662,7 @@ if (WITH_MGR)
   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)
index fa534aa0b1406f60c69bbb393ef7879ac4a3f80c..ada01f1907799ecea47192f7b244dc17e122b9bb 100644 (file)
@@ -14,6 +14,7 @@
 #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_),
index 652fff94f61fa1b5f81b9d520dc22a5d572454db..2efb2683f8a3248fb93491535d14aa351dd72185 100644 (file)
@@ -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;}
index 613a075e7ed9194b783e6ca83dafebfb7d7c99ae..ea7055b5bfc20e2d82f45eff75a213f2e7ff8a73 100644 (file)
@@ -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 {
index 89ede8cee2c4e48bd5cd8430536bc1d2ee9f52e6..0eaf11c1016f9d8b3b282dbae20e4a7be39589a7 100644 (file)
@@ -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> client;
 
   LogClient log_client;
   LogChannelRef clog, audit_clog;
index 7501ac55e294985b17a05077b525709a886c2ab1..3e00822fc28042c430b2f3674e1a27def8059e88 100644 (file)
@@ -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)
 {}
 
index b5fdde8a7761eed6c583548e2b33b32e189f22a5..8e929113053554500fa257eb7f5234f25d5c8324 100644 (file)
@@ -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);
index cbc28bb36bcf59ab1de93358adb189f27e4aa315..ca62c762b94d94dee3cbbc5c7c30483aaa95ba77 100644 (file)
@@ -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;