]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
admin_socket: implement schema request
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Tue, 26 Jul 2011 23:41:52 +0000 (16:41 -0700)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Tue, 26 Jul 2011 23:41:52 +0000 (16:41 -0700)
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
src/common/admin_socket.cc
src/common/admin_socket_client.cc
src/common/admin_socket_client.h
src/common/perf_counters.cc
src/common/perf_counters.h
src/test/perf_counters.cc

index a60e0200f0b84e3d6b777a55dc2effdb4ee13be2..0e5e8d492653c522360b25e13bf32d0e2aa627e2 100644 (file)
@@ -264,13 +264,13 @@ private:
        ret = handle_version_request(connection_fd);
        break;
       case 1:
-      case 2:
        /* data request */
-       ret = handle_data_request(connection_fd);
+       ret = handle_json_request(connection_fd, false);
+       break;
+      case 2:
+       /* schema request */
+       ret = handle_json_request(connection_fd, true);
        break;
-//     /* schema request */
-//     ret = handle_schema_request(connection_fd);
-//     break;
       default:
        lderr(m_parent->m_cct) << "AdminSocket: unknown request "
            << "code " << request << dendl;
@@ -293,14 +293,14 @@ private:
     return true;
   }
 
-  bool handle_data_request(int connection_fd)
+  bool handle_json_request(int connection_fd, bool schema)
   {
     std::vector<char> buffer;
     buffer.reserve(512);
 
     PerfCountersCollection *coll = m_parent->m_cct->GetPerfCountersCollection();
     if (coll) {
-      coll->write_json_to_buf(buffer);
+      coll->write_json_to_buf(buffer, schema);
     }
 
     uint32_t len = htonl(buffer.size());
@@ -316,17 +316,11 @@ private:
          << cpp_strerror(ret) << dendl;
       return false;
     }
-    ldout(m_parent->m_cct, 30) << "AdminSocket: handle_data_request succeeded."
+    ldout(m_parent->m_cct, 30) << "AdminSocket: handle_json_request succeeded."
         << dendl;
     return true;
   }
 
-  bool handle_schema_request(int connection_fd)
-  {
-    // TODO: implement!
-    return false;
-  }
-
   AdminSocket(AdminSocket &rhs);
   const AdminSocket &operator=(const AdminSocket &rhs);
 
index 9422b668c3a7090941876f14fc72549bf9157536..9efedf8b5a3f6a5ce5f16b5b48eed499d7d062a5 100644 (file)
@@ -156,8 +156,20 @@ done:
   return err;
 }
 
+std::string AdminSocketClient::
+get_schema(std::string *message)
+{
+  return get_json(message, 0x2);
+}
+
 std::string AdminSocketClient::
 get_message(std::string *message)
+{
+  return get_json(message, 0x1);
+}
+
+std::string AdminSocketClient::
+get_json(std::string *message, uint32_t request_code)
 {
   int socket_fd, res;
   std::vector<uint8_t> vec(65536, 0);
@@ -168,7 +180,7 @@ get_message(std::string *message)
   if (!err.empty()) {
     goto done;
   }
-  err = asok_request(socket_fd, 0x1);
+  err = asok_request(socket_fd, request_code);
   if (!err.empty()) {
     goto done;
   }
index 5092944fb98a1a259ed7fa107af46d26d4979acf..9b19b5e950329d14d05721232d147cdbfa59b86c 100644 (file)
@@ -26,7 +26,9 @@ class AdminSocketClient
 public:
   AdminSocketClient(const std::string &path);
   std::string get_version(uint32_t *version);
+  std::string get_schema(std::string *message);
   std::string get_message(std::string *message);
+  std::string get_json(std::string *message, uint32_t request_code);
 private:
   std::string m_path;
 };
index dbf34c876062b7be3a7870aa633f619f301e3f12..46c1833b35c919cd9af257d314cedb6bce8939ec 100644 (file)
@@ -78,7 +78,7 @@ logger_clear()
 }
 
 void PerfCountersCollection::
-write_json_to_buf(std::vector <char> &buffer)
+write_json_to_buf(std::vector <char> &buffer, bool schema)
 {
   Mutex::Locker lck(m_lock);
   buffer.push_back('{');
@@ -86,7 +86,7 @@ write_json_to_buf(std::vector <char> &buffer)
   perf_counters_set_t::iterator l_end = m_loggers.end();
   if (l != l_end) {
     while (true) {
-      (*l)->write_json_to_buf(buffer);
+      (*l)->write_json_to_buf(buffer, schema);
       if (++l == l_end)
        break;
       buffer.push_back(',');
@@ -190,7 +190,7 @@ static inline void append_to_vector(std::vector <char> &buffer, char *buf)
 }
 
 void PerfCounters::
-write_json_to_buf(std::vector <char> &buffer)
+write_json_to_buf(std::vector <char> &buffer, bool schema)
 {
   char buf[512];
   Mutex::Locker lck(m_lock);
@@ -207,7 +207,10 @@ write_json_to_buf(std::vector <char> &buffer)
   while (true) {
     const perf_counter_data_any_d &data(*d);
     buf[0] = '\0';
-    data.write_json(buf, sizeof(buf));
+    if (schema)
+      data.write_schema_json(buf, sizeof(buf));
+    else
+      data.write_json(buf, sizeof(buf));
 
     append_to_vector(buffer, buf);
     if (++d == d_end)
@@ -245,6 +248,12 @@ perf_counter_data_any_d()
   memset(&u, 0, sizeof(u));
 }
 
+void  PerfCounters::perf_counter_data_any_d::
+write_schema_json(char *buf, size_t buf_sz) const
+{
+  snprintf(buf, buf_sz, "\"%s\":{\"type\":%d}", name, type);
+}
+
 void  PerfCounters::perf_counter_data_any_d::
 write_json(char *buf, size_t buf_sz) const
 {
index ebd13b7788ec9fec821fb18c40c3144b385b8a1a..87292be8ce7a7990557cbb36b376776518928918 100644 (file)
@@ -57,7 +57,7 @@ public:
   void finc(int idx, double v);
   double fget(int idx) const;
 
-  void write_json_to_buf(std::vector <char> &buffer);
+  void write_json_to_buf(std::vector <char> &buffer, bool schema);
 
   const std::string& get_name() const;
 
@@ -70,6 +70,7 @@ private:
   /** Represents a PerfCounters data element. */
   struct perf_counter_data_any_d {
     perf_counter_data_any_d();
+    void write_schema_json(char *buf, size_t buf_sz) const;
     void  write_json(char *buf, size_t buf_sz) const;
 
     const char *name;
@@ -116,7 +117,7 @@ public:
   void logger_add(class PerfCounters *l);
   void logger_remove(class PerfCounters *l);
   void logger_clear();
-  void write_json_to_buf(std::vector <char> &buffer);
+  void write_json_to_buf(std::vector <char> &buffer, bool schema);
 private:
   bool init(const std::string &uri);
   void shutdown();
index b32bae6949f882d900b75f84bdeff536b11bfc5c..04ed146a1bcd97a46ff648c1a00a2ae7e581296a 100644 (file)
@@ -140,7 +140,9 @@ TEST(PerfCounters, MultiplePerfCounters) {
   ASSERT_EQ("", client.get_message(&msg));
   ASSERT_EQ(sd("{'test_perfcounter_1':{'element1':6,'element2':0,"
            "'element3':{'avgcount':0,'sum':0}}}"), msg);
-
+  ASSERT_EQ("", client.get_schema(&msg));
+  ASSERT_EQ(sd("{'test_perfcounter_1':{'element1':{'type':2},"
+              "'element2':{'type':1},'element3':{'type':5}}}"), msg);
   coll->logger_clear();
   ASSERT_EQ("", client.get_message(&msg));
   ASSERT_EQ("{}", msg);