From 2458c89664d0959c35cb0679b93b580ebab73c54 Mon Sep 17 00:00:00 2001 From: Colin Patrick McCabe Date: Tue, 26 Jul 2011 16:41:52 -0700 Subject: [PATCH] admin_socket: implement schema request Signed-off-by: Colin McCabe --- src/common/admin_socket.cc | 22 ++++++++-------------- src/common/admin_socket_client.cc | 14 +++++++++++++- src/common/admin_socket_client.h | 2 ++ src/common/perf_counters.cc | 17 +++++++++++++---- src/common/perf_counters.h | 5 +++-- src/test/perf_counters.cc | 4 +++- 6 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/common/admin_socket.cc b/src/common/admin_socket.cc index a60e0200f0b84..0e5e8d492653c 100644 --- a/src/common/admin_socket.cc +++ b/src/common/admin_socket.cc @@ -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 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); diff --git a/src/common/admin_socket_client.cc b/src/common/admin_socket_client.cc index 9422b668c3a70..9efedf8b5a3f6 100644 --- a/src/common/admin_socket_client.cc +++ b/src/common/admin_socket_client.cc @@ -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 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; } diff --git a/src/common/admin_socket_client.h b/src/common/admin_socket_client.h index 5092944fb98a1..9b19b5e950329 100644 --- a/src/common/admin_socket_client.h +++ b/src/common/admin_socket_client.h @@ -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; }; diff --git a/src/common/perf_counters.cc b/src/common/perf_counters.cc index dbf34c876062b..46c1833b35c91 100644 --- a/src/common/perf_counters.cc +++ b/src/common/perf_counters.cc @@ -78,7 +78,7 @@ logger_clear() } void PerfCountersCollection:: -write_json_to_buf(std::vector &buffer) +write_json_to_buf(std::vector &buffer, bool schema) { Mutex::Locker lck(m_lock); buffer.push_back('{'); @@ -86,7 +86,7 @@ write_json_to_buf(std::vector &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 &buffer, char *buf) } void PerfCounters:: -write_json_to_buf(std::vector &buffer) +write_json_to_buf(std::vector &buffer, bool schema) { char buf[512]; Mutex::Locker lck(m_lock); @@ -207,7 +207,10 @@ write_json_to_buf(std::vector &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 { diff --git a/src/common/perf_counters.h b/src/common/perf_counters.h index ebd13b7788ec9..87292be8ce7a7 100644 --- a/src/common/perf_counters.h +++ b/src/common/perf_counters.h @@ -57,7 +57,7 @@ public: void finc(int idx, double v); double fget(int idx) const; - void write_json_to_buf(std::vector &buffer); + void write_json_to_buf(std::vector &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 &buffer); + void write_json_to_buf(std::vector &buffer, bool schema); private: bool init(const std::string &uri); void shutdown(); diff --git a/src/test/perf_counters.cc b/src/test/perf_counters.cc index b32bae6949f88..04ed146a1bcd9 100644 --- a/src/test/perf_counters.cc +++ b/src/test/perf_counters.cc @@ -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); -- 2.39.5