]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-dencoder: handle messages
authorSage Weil <sage.weil@dreamhost.com>
Mon, 30 Jan 2012 21:29:37 +0000 (13:29 -0800)
committerSage Weil <sage.weil@dreamhost.com>
Mon, 30 Jan 2012 21:30:01 +0000 (13:30 -0800)
Dump for now uses the string rendering function, and that's it.  Maybe
we'll write proper dump methods for all of these messages someday.

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/test/encoding/ceph_dencoder.cc
src/test/encoding/types.h

index aea0e7bdefc5f06a26e4557674fbf5661401329d..efc5bd29717f6bd1e599b09077e0b2e7afd513a8 100644 (file)
@@ -6,10 +6,13 @@
 #include "common/ceph_argparse.h"
 #include "common/Formatter.h"
 #include "common/errno.h"
+#include "msg/Message.h"
 
 #define TYPE(t)
+#define MESSAGE(t)
 #include "types.h"
 #undef TYPE
+#undef MESSAGE
 
 void usage(ostream &out)
 {
@@ -98,17 +101,28 @@ public:
 };
 
 template<class T>
-class MessageDencoderImpl : public DencoderImpl<T> {
-  T m_object;
-  list<T> m_list;
+class MessageDencoderImpl : public Dencoder {
+  T *m_object;
+  list<T*> m_list;
 
 public:
-  MessageDencoderImpl() {}
+  MessageDencoderImpl() {
+    m_object = new T;
+  }
+  ~MessageDencoderImpl() {
+    m_object->put();
+  }
 
   string decode(bufferlist bl) {
     bufferlist::iterator p = bl.begin();
     try {
-      ::decode(m_object, p);
+      Message *n = decode_message(NULL, p);
+      if (!n)
+       throw std::runtime_error("failed to decode");
+      if (n->get_type() != m_object->get_type())
+       throw std::runtime_error("decoded incorrect type message");
+      m_object->put();
+      m_object = (T *)n;
     }
     catch (buffer::error& e) {
       return e.what();
@@ -120,15 +134,15 @@ public:
 
   void encode(bufferlist& out, uint64_t features) {
     out.clear();
-    ::encode(m_object, out, features);
+    encode_message(m_object, features, out);
   }
 
   void dump(Formatter *f) {
-    m_object.dump(f);
+    m_object->dump(f);
   }
 
   void generate() {
-    T::generate_test_instances(m_list);
+    //T::generate_test_instances(m_list);
   }
   int num_generated() {
     return m_list.size();
@@ -139,8 +153,9 @@ public:
       i = m_list.size();
     if (i > m_list.size())
       return "invalid id for generated object";
-    typename list<T>::iterator p = m_list.begin();
+    typename list<T*>::iterator p = m_list.begin();
     for (i--; i > 0 && p != m_list.end(); ++p, --i) ;
+    m_object->put();
     m_object = *p;
     return string();
   }
@@ -160,6 +175,7 @@ int main(int argc, const char **argv)
 #define T_STR(x) #x
 #define T_STRINGIFY(x) T_STR(x)
 #define TYPE(t) dencoders[T_STRINGIFY(t)] = new DencoderImpl<t>;
+#define MESSAGE(t) dencoders[T_STRINGIFY(t)] = new MessageDencoderImpl<t>;
 #include "types.h"
 #undef TYPE
 #undef T_STR
index 738c2ccab4b7cf8f7e88824968ada239b06b3114..b6e3b19734b69e0d5c76d76a7ff4233328920f7a 100644 (file)
@@ -18,3 +18,7 @@ TYPE(watch_info_t)
 #include "os/ObjectStore.h"
 TYPE(ObjectStore::Transaction)
 
+
+// --- messages ---
+#include "messages/MPGStats.h"
+MESSAGE(MPGStats)