]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
fixed osd message encoding
authorSage Weil <sage@newdream.net>
Thu, 8 May 2008 23:29:46 +0000 (16:29 -0700)
committerSage Weil <sage@newdream.net>
Thu, 8 May 2008 23:29:46 +0000 (16:29 -0700)
20 files changed:
src/include/types.h
src/messages/MOSDBoot.h
src/messages/MOSDFailure.h
src/messages/MOSDGetMap.h
src/messages/MOSDMap.h
src/messages/MOSDOp.h
src/messages/MOSDOpReply.h
src/messages/MOSDPGCreate.h
src/messages/MOSDPGInfo.h
src/messages/MOSDPGNotify.h
src/messages/MOSDPGPeer.h
src/messages/MOSDPGPeerAck.h
src/messages/MOSDPGPeerRequest.h
src/messages/MOSDPGQuery.h
src/messages/MOSDPGRemove.h
src/messages/MOSDPGSummary.h
src/messages/MOSDPing.h
src/messages/MOSDSubOp.h
src/messages/MOSDSubOpReply.h
src/osd/osd_types.h

index f83b78b69840c29e91bcac254e8ab60d35564a2f..128fe26da0974ca75dacc4779dd7506b907ece5e 100644 (file)
@@ -117,7 +117,9 @@ WRITE_RAW_ENCODER(ceph_mds_file_caps);
 WRITE_RAW_ENCODER(ceph_mds_lease);
 WRITE_RAW_ENCODER(ceph_mds_reply_head);
 WRITE_RAW_ENCODER(ceph_mds_reply_inode);
+
 WRITE_RAW_ENCODER(ceph_osd_request_head);
+WRITE_RAW_ENCODER(ceph_osd_reply_head);
 
 // ----------------------
 // some basic types
index 9b4f8b00defe3124cc7d6d7df8e261bf167bed94..8e22755dfc4a77a6e7c1933cee51b81dee055a58 100644 (file)
@@ -38,13 +38,13 @@ class MOSDBoot : public Message {
   }
   
   void encode_payload() {
-    ::_encode(inst, payload);
-    ::_encode(sb, payload);
+    ::encode(inst, payload);
+    ::encode(sb, payload);
   }
   void decode_payload() {
-    int off = 0;
-    ::_decode(inst, payload, off);
-    ::_decode(sb, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(inst, p);
+    ::decode(sb, p);
   }
 };
 
index f5ca4a0d218f41ba6b30131eb16e7b5f85f21b48..264abbf957f256718c53632707274ee3296a0773 100644 (file)
@@ -36,17 +36,17 @@ class MOSDFailure : public Message {
   epoch_t get_epoch() { return epoch; }
 
   void decode_payload() {
-    int off = 0;
-    ::_decode(fsid, payload, off);
-    ::_decode(from, payload, off);
-    ::_decode(failed, payload, off);
-    ::_decode(epoch, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(fsid, p);
+    ::decode(from, p);
+    ::decode(failed, p);
+    ::decode(epoch, p);
   }
   void encode_payload() {
-    ::_encode(fsid, payload);
-    ::_encode(from, payload);
-    ::_encode(failed, payload);
-    ::_encode(epoch, payload);
+    ::encode(fsid, payload);
+    ::encode(from, payload);
+    ::encode(failed, payload);
+    ::encode(epoch, payload);
   }
 
   const char *get_type_name() { return "osd_failure"; }
index 8a955d76969fd4eb62d313c52befcc28b8c55709..15b6b9fff635cfb84052ca06be479ea42efcbab0 100644 (file)
@@ -38,13 +38,13 @@ class MOSDGetMap : public Message {
   }
   
   void encode_payload() {
-    ::_encode(fsid, payload);
-    ::_encode(start, payload);
+    ::encode(fsid, payload);
+    ::encode(start, payload);
   }
   void decode_payload() {
-    int off = 0;
-    ::_decode(fsid, payload, off);
-    ::_decode(start, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(fsid, p);
+    ::decode(start, p);
   }
 };
 
index b03d93d174c40bda1967d133a26f54e43151eb4e..44574ae85881b46876b80d5dbc7651f6371654cf 100644 (file)
@@ -56,15 +56,15 @@ class MOSDMap : public Message {
 
   // marshalling
   void decode_payload() {
-    int off = 0;
-    ::_decode(fsid, payload, off);
-    ::_decode(incremental_maps, payload, off);
-    ::_decode(maps, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(fsid, p);
+    ::decode(incremental_maps, p);
+    ::decode(maps, p);
   }
   void encode_payload() {
-    ::_encode(fsid, payload);
-    ::_encode(incremental_maps, payload);
-    ::_encode(maps, payload);
+    ::encode(fsid, payload);
+    ::encode(incremental_maps, payload);
+    ::encode(maps, payload);
   }
 
   const char *get_type_name() { return "omap"; }
index 76df969b8670d8f5f2987b9286a7e7e4e15c9a32..13e43f18d97a9a3bc37599070fc2b22e2abe68af 100644 (file)
@@ -139,12 +139,12 @@ public:
 
   // marshalling
   virtual void decode_payload() {
-    int off = 0;
-    ::_decode(head, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(head, p);
   }
 
   virtual void encode_payload() {
-    ::_encode(head, payload);
+    ::encode(head, payload);
     env.data_off = get_offset();
   }
 
index 1e8c7564790aa654cb4bc33bd5973437ac555812..3216bede1d74b9fd86c9537f2abba8d6c9144ebe 100644 (file)
@@ -76,11 +76,11 @@ public:
 
   // marshalling
   virtual void decode_payload() {
-    int off = 0;
-    ::_decode(head, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(head, p);
   }
   virtual void encode_payload() {
-    ::_encode(head, payload);
+    ::encode(head, payload);
     env.data_off = get_offset();
   }
 
index ba1ee668b8c088a2ef73daf38957959ca6a2e289..8d7d5c4f03ac9f2d637ae2153266e6fc41a75c49 100644 (file)
@@ -28,7 +28,20 @@ struct MOSDPGCreate : public Message {
     epoch_t created;   // epoch pg created
     pg_t parent;       // split from parent (if != pg_t())
     int split_bits;
+
+    void encode(bufferlist &bl) const {
+      ::encode(created, bl);
+      ::encode(parent, bl);
+      ::encode(split_bits, bl);
+    }
+    void decode(bufferlist::iterator &bl) {
+      ::decode(created, bl);
+      ::decode(parent, bl);
+      ::decode(split_bits, bl);
+    }
   };
+  WRITE_CLASS_ENCODERS(create_rec)
+
   map<pg_t,create_rec> mkpg;
 
   MOSDPGCreate() {}
@@ -39,14 +52,16 @@ struct MOSDPGCreate : public Message {
   const char *get_type_name() { return "pg_create"; }
 
   void encode_payload() {
-    ::_encode(epoch, payload);
-    ::_encode(mkpg, payload);
+    ::encode(epoch, payload);
+    ::encode(mkpg, payload);
   }
   void decode_payload() {
-    int off = 0;
-    ::_decode(epoch, payload, off);
-    ::_decode(mkpg, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(epoch, p);
+    ::decode(mkpg, p);
   }
 };
 
+WRITE_CLASS_ENCODERS(MOSDPGCreate::create_rec)
+
 #endif
index 55d59d27f9f29b9fb9ab354fddf7a5df237b182c..2e030851ec7915503ad6cb3e24949d614c2ab75d 100644 (file)
@@ -37,13 +37,13 @@ public:
   }
 
   void encode_payload() {
-    ::_encode(epoch, payload);
-    ::_encode(pg_info, payload);
+    ::encode(epoch, payload);
+    ::encode(pg_info, payload);
   }
   void decode_payload() {
-    int off = 0;
-    ::_decode(epoch, payload, off);
-    ::_decode(pg_info, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(epoch, p);
+    ::decode(pg_info, p);
   }
 };
 
index 52394393c9e4e5178dd7038ce4c6c9026fb5b669..1294390d6f4ec68e81ad7e4e20c46c2fc7b1f8e4 100644 (file)
@@ -41,14 +41,13 @@ class MOSDPGNotify : public Message {
   const char *get_type_name() { return "PGnot"; }
 
   void encode_payload() {
-    payload.append((char*)&epoch, sizeof(epoch));
-    _encode(pg_list, payload);
+    ::encode(epoch, payload);
+    ::encode(pg_list, payload);
   }
   void decode_payload() {
-    int off = 0;
-    payload.copy(off, sizeof(epoch), (char*)&epoch);
-    off += sizeof(epoch);
-    _decode(pg_list, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(epoch, p);
+    ::decode(pg_list, p);
   }
 };
 
index dd3164cdc112408f826e5a612a27a2ad29647262..978f540c233536798a2527696fd436a530805d35 100644 (file)
@@ -41,17 +41,15 @@ class MOSDPGPeer : public Message {
   char *get_type_name() { return "PGPeer"; }
 
   void encode_payload() {
-    payload.append((char*)&map_version, sizeof(map_version));
-    payload.append((char*)&complete, sizeof(complete));
-    _encode(pg_list, payload);
+    ::encode(map_version, payload);
+    ::encode(complete, payload);
+    ::encode(pg_list, payload);
   }
   void decode_payload() {
-    int off = 0;
-    payload.copy(off, sizeof(map_version), (char*)&map_version);
-    off += sizeof(map_version);
-    payload.copy(off, sizeof(complete), (char*)&complete);
-    off += sizeof(complete);
-    _decode(pg_list, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(map_version, p);
+    ::decode(complete, p);
+    ::decode(pg_list, p);
   }
 };
 
index dc4fac1a9436b563d727e08976b7091b4adec5fd..88b6ddf434c695379abc5c518ab1cbe97c640423 100644 (file)
@@ -37,33 +37,15 @@ class MOSDPGPeerAck : public Message {
   char *get_type_name() { return "PGPeer"; }
 
   void encode_payload() {
-    payload.append((char*)&map_version, sizeof(map_version));
-    _encode(pg_dne, payload);
-    
-    int n = pg_state.size();
-    payload.append((char*)&n, sizeof(n));
-    for (map<pg_t, PGReplicaInfo >::iterator it = pg_state.begin();
-         it != pg_state.end();
-         it++) {
-      payload.append((char*)&it->first, sizeof(it->first));
-      it->second._encode(payload);
-    }
+    ::encode(map_version, payload);
+    ::encode(pg_dne, payload);
+    ::encode(pg_state, payload);
   }
   void decode_payload() {
-    int off = 0;
-    payload.copy(off, sizeof(map_version), (char*)&map_version);
-    off += sizeof(map_version);
-    _decode(pg_dne, payload, off);
-
-    int n;
-    payload.copy(off, sizeof(n), (char*)&n);
-    off += sizeof(n);
-    for (int i=0; i<n; i++) {
-      pg_t pgid;
-      payload.copy(off, sizeof(pgid), (char*)&pgid);
-      off += sizeof(pgid);
-      pg_state[pgid]._decode(payload, off);
-    }
+    bufferlist::iterator p = payload.begin();
+    ::decode(map_version, payload);
+    ::decode(pg_dne, payload);
+    ::decode(pg_state, payload);
   }
 };
 
index fab654237f4d7d160120dd6683fce7d87b2336e2..e6626c549ceb00ad8ab9a7b345366da44c8b1966 100644 (file)
@@ -37,14 +37,13 @@ class MOSDPGPeerRequest : public Message {
   char *get_type_name() { return "PGPR"; }
 
   void encode_payload() {
-    payload.append((char*)&map_version, sizeof(map_version));
-    _encode(pg_list, payload);
+    ::encode(map_version, payload);
+    ::encode(pg_list, payload);
   }
   void decode_payload() {
-    int off = 0;
-    payload.copy(off, sizeof(map_version), (char*)&map_version);
-    off += sizeof(map_version);
-    _decode(pg_list, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(map_version, p);
+    ::decode(pg_list, p);
   }
 };
 
index c8e1c94a49a965e0e917cdc926876137570f5260..870f41eae88e7056086175f6c6cc88aac854299a 100644 (file)
@@ -38,13 +38,13 @@ class MOSDPGQuery : public Message {
   const char *get_type_name() { return "PGq"; }
 
   void encode_payload() {
-    ::_encode(epoch, payload);
-    ::_encode(pg_list, payload);
+    ::encode(epoch, payload);
+    ::encode(pg_list, payload);
   }
   void decode_payload() {
-    int off = 0;
-    ::_decode(epoch, payload, off);
-    ::_decode(pg_list, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(epoch, p);
+    ::decode(pg_list, p);
   }
 };
 
index 18afb41a427e2177e1296a3707f49bcd16e85607..6903213e9260aa92c001340f0ed0d6e62685e575 100644 (file)
@@ -37,14 +37,13 @@ class MOSDPGRemove : public Message {
   const char *get_type_name() { return "PGrm"; }
 
   void encode_payload() {
-    payload.append((char*)&epoch, sizeof(epoch));
-    _encode(pg_list, payload);
+    ::encode(epoch, payload);
+    ::encode(pg_list, payload);
   }
   void decode_payload() {
-    int off = 0;
-    payload.copy(off, sizeof(epoch), (char*)&epoch);
-    off += sizeof(epoch);
-    _decode(pg_list, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(epoch, p);
+    ::decode(pg_list, p);
   }
 
 };
index 0dcebffaf74da9bc20b349dd2db36c4923f9995d..df2dae5d6e65c1384a83b49363b505f1ec5669cb 100644 (file)
@@ -33,7 +33,7 @@ public:
     Message(MSG_OSD_PG_SUMMARY) {
     this->epoch = mv;
     this->pgid = pgid;
-    summary._encode(sumbl);
+    summary.encode(sumbl);
   }
 
   pg_t get_pgid() { return pgid; }
index 84689676b1428e3d7678d14ed14e99b7f2533102..2bff616fb35d3ea098f7084d993cec9220982f6a 100644 (file)
@@ -32,15 +32,15 @@ class MOSDPing : public Message {
   MOSDPing() {}
 
   void decode_payload() {
-    int off = 0;
-    ::_decode(map_epoch, payload, off);
-    ::_decode(ack, payload, off);
-    ::_decode(peer_stat, payload, off);
+    bufferlist::iterator p = payload.begin();
+    ::decode(map_epoch, p);
+    ::decode(ack, p);
+    ::decode(peer_stat, p);
   }
   void encode_payload() {
-    ::_encode(map_epoch, payload);
-    ::_encode(ack, payload);
-    ::_encode(peer_stat, payload);
+    ::encode(map_epoch, payload);
+    ::encode(ack, payload);
+    ::encode(peer_stat, payload);
   }
 
   const char *get_type_name() { return "osd_ping"; }
index c52374c717214d7806a2246aaed8591ffc5394b3..2155022a0b7e73d8ac83aedc3f8a05a4d839abda 100644 (file)
 class MOSDSubOp : public Message {
 public:
 private:
-  struct st_ {
-    epoch_t map_epoch;
+  epoch_t map_epoch;
+  
+  // metadata from original request
+  osd_reqid_t reqid;
+  
+  // subop
+  pg_t pgid;
+  pobject_t poid;
+  int32_t op;
+  off_t offset, length;
+  
+  // subop metadata
+  tid_t rep_tid;
+  eversion_t version;
+  uint32_t inc_lock;
+  
+  // piggybacked osd/og state
+  eversion_t pg_trim_to;   // primary->replica: trim to here
+  osd_peer_stat_t peer_stat;
 
-    // metadata from original request
-    osd_reqid_t reqid;
+  map<string,bufferptr> attrset;
 
-    // subop
-    pg_t pgid;
-    pobject_t poid;
-    int32_t op;
-    off_t offset, length;
+public:
+ virtual void decode_payload() {
+    bufferlist::iterator p = payload.begin();
+    ::decode(map_epoch, p);
+    ::decode(reqid, p);
+    ::decode(pgid, p);
+    ::decode(poid, p);
+    ::decode(op, p);
+    ::decode(offset, p);
+    ::decode(length, p);
+    ::decode(rep_tid, p);
+    ::decode(version, p);
+    ::decode(inc_lock, p);
+    ::decode(pg_trim_to, p);
+    ::decode(peer_stat, p);
+    ::decode(attrset, p);
+  }
 
-    // subop metadata
-    tid_t rep_tid;
-    eversion_t version;
-    uint32_t inc_lock;
+  virtual void encode_payload() {
+    ::encode(map_epoch, payload);
+    ::encode(reqid, payload);
+    ::encode(pgid, payload);
+    ::encode(poid, payload);
+    ::encode(op, payload);
+    ::encode(offset, payload);
+    ::encode(length, payload);
+    ::encode(rep_tid, payload);
+    ::encode(version, payload);
+    ::encode(inc_lock, payload);
+    ::encode(pg_trim_to, payload);
+    ::encode(peer_stat, payload);
+    ::encode(attrset, payload);
+    env.data_off = offset;
+  }
 
-    // piggybacked osd/og state
-    eversion_t pg_trim_to;   // primary->replica: trim to here
-    osd_peer_stat_t peer_stat;
-  } st;
 
-  map<string,bufferptr> attrset;
 
+  const epoch_t get_map_epoch() { return map_epoch; }
 
-public:
-  const epoch_t get_map_epoch() { return st.map_epoch; }
-
-  const osd_reqid_t&    get_reqid() { return st.reqid; }
+  const osd_reqid_t&    get_reqid() { return reqid; }
 
   bool wants_reply() {
-    if (st.op < 100) return true;
+    if (op < 100) return true;
     return false;  // no reply needed for primary-lock, -unlock.
   }
 
-  const pg_t get_pg() { return st.pgid; }
-  const pobject_t get_poid() { return st.poid; }
-  const int get_op() { return st.op; }
-  bool is_read() { return st.op < 10; }
-  const off_t get_length() { return st.length; }
-  const off_t get_offset() { return st.offset; }
+  const pg_t get_pg() { return pgid; }
+  const pobject_t get_poid() { return poid; }
+  const int get_op() { return op; }
+  bool is_read() { return op < 10; }
+  const off_t get_length() { return length; }
+  const off_t get_offset() { return offset; }
 
-  const tid_t get_rep_tid() { return st.rep_tid; }
-  const eversion_t get_version() { return st.version; }
-  const eversion_t get_pg_trim_to() { return st.pg_trim_to; }
-  void set_pg_trim_to(eversion_t v) { st.pg_trim_to = v; }
+  const tid_t get_rep_tid() { return rep_tid; }
+  const eversion_t get_version() { return version; }
+  const eversion_t get_pg_trim_to() { return pg_trim_to; }
+  void set_pg_trim_to(eversion_t v) { pg_trim_to = v; }
 
-  unsigned get_inc_lock() { return st.inc_lock; }
-  void set_inc_lock(unsigned i) { st.inc_lock = i; }
+  unsigned get_inc_lock() { return inc_lock; }
+  void set_inc_lock(unsigned i) { inc_lock = i; }
 
   map<string,bufferptr>& get_attrset() { return attrset; }
   void set_attrset(map<string,bufferptr> &as) { attrset.swap(as); }
 
-  void set_peer_stat(const osd_peer_stat_t& stat) { st.peer_stat = stat; }
-  const osd_peer_stat_t& get_peer_stat() { return st.peer_stat; }
+  void set_peer_stat(const osd_peer_stat_t& stat) { peer_stat = stat; }
+  const osd_peer_stat_t& get_peer_stat() { return peer_stat; }
  
   MOSDSubOp(osd_reqid_t r, pg_t p, pobject_t po, int o, off_t of, off_t le,
            epoch_t mape, tid_t rtid, unsigned il, eversion_t v) :
-    Message(MSG_OSD_SUBOP) {
-    memset(&st, 0, sizeof(st));
-    st.reqid = r;
-
-    st.pgid = p;
-    st.poid = po;
-    st.op = o;
-    st.offset = of;
-    st.length = le;
-    st.map_epoch = mape;
-    st.rep_tid = rtid;
-    st.inc_lock = il;
-    st.version = v;
+    Message(MSG_OSD_SUBOP),
+    map_epoch(mape),
+    reqid(r),
+    pgid(p),
+    poid(po),
+    op(o),
+    offset(of),
+    length(le),
+    rep_tid(rtid),
+    version(v),
+    inc_lock(il)
+  {
+    memset(&peer_stat, 0, sizeof(peer_stat));
   }
   MOSDSubOp() {}
 
-  // marshalling
-  virtual void decode_payload() {
-    int off = 0;
-    ::_decode(st, payload, off);
-    ::_decode(attrset, payload, off);
-  }
-
-  virtual void encode_payload() {
-    ::_encode(st, payload);
-    ::_encode(attrset, payload);
-    env.data_off = st.offset;
-  }
-
   const char *get_type_name() { return "osd_sub_op"; }
   void print(ostream& out) {
-    out << "osd_sub_op(" << st.reqid
-       << " " << MOSDOp::get_opname(st.op)
-       << " " << st.poid
-       << " v" << st.version;    
-    if (st.length) out << " " << st.offset << "~" << st.length;
+    out << "osd_sub_op(" << reqid
+       << " " << MOSDOp::get_opname(op)
+       << " " << poid
+       << " v" << version;    
+    if (length) out << " " << offset << "~" << length;
     out << ")";
   }
 };
index f448279924912bf2302d10be1cddb9c78df20e4b..30b5c1ca5f085da97a4149d533a2b634c129ab0b 100644 (file)
  */
 
 class MOSDSubOpReply : public Message {
-  struct st_t {
-    epoch_t map_epoch;
-
-    // subop metadata
-    osd_reqid_t reqid;
-    pg_t pgid;
-    tid_t rep_tid;
-    int32_t op;
-    pobject_t poid;
-    off_t length, offset;
-
-    // result
-    bool commit;
-    int32_t result;
-
-    // piggybacked osd state
-    eversion_t pg_complete_thru;
-    osd_peer_stat_t peer_stat;
-  } st;
+  epoch_t map_epoch;
+  
+  // subop metadata
+  osd_reqid_t reqid;
+  pg_t pgid;
+  tid_t rep_tid;
+  int32_t op;
+  pobject_t poid;
+  off_t length, offset;
+  
+  // result
+  bool commit;
+  int32_t result;
+  
+  // piggybacked osd state
+  eversion_t pg_complete_thru;
+  osd_peer_stat_t peer_stat;
 
   map<string,bufferptr> attrset;
 
  public:
-  epoch_t get_map_epoch() { return st.map_epoch; }
+  virtual void decode_payload() {
+    bufferlist::iterator p = payload.begin();
+    ::decode(map_epoch, p);
+    ::decode(reqid, p);
+    ::decode(pgid, p);
+    ::decode(rep_tid, p);
+    ::decode(op, p);
+    ::decode(poid, p);
+    ::decode(length, p);
+    ::decode(offset, p);
+    ::decode(commit, p);
+    ::decode(result, p);
+    ::decode(pg_complete_thru, p);
+    ::decode(peer_stat, p);
+    ::decode(attrset, p);
+  }
+  virtual void encode_payload() {
+    ::encode(map_epoch, payload);
+    ::encode(reqid, payload);
+    ::encode(pgid, payload);
+    ::encode(rep_tid, payload);
+    ::encode(op, payload);
+    ::encode(poid, payload);
+    ::encode(length, payload);
+    ::encode(offset, payload);
+    ::encode(commit, payload);
+    ::encode(result, payload);
+    ::encode(pg_complete_thru, payload);
+    ::encode(peer_stat, payload);
+    ::encode(attrset, payload);
+    env.data_off = offset;
+  }
 
-  pg_t get_pg() { return st.pgid; }
-  tid_t get_rep_tid() { return st.rep_tid; }
-  int get_op()  { return st.op; }
-  pobject_t get_poid() { return st.poid; }
-  const off_t get_length() { return st.length; }
-  const off_t get_offset() { return st.offset; }
+  epoch_t get_map_epoch() { return map_epoch; }
 
-  bool get_commit() { return st.commit; }
-  int get_result() { return st.result; }
+  pg_t get_pg() { return pgid; }
+  tid_t get_rep_tid() { return rep_tid; }
+  int get_op()  { return op; }
+  pobject_t get_poid() { return poid; }
+  const off_t get_length() { return length; }
+  const off_t get_offset() { return offset; }
 
-  void set_pg_complete_thru(eversion_t v) { st.pg_complete_thru = v; }
-  eversion_t get_pg_complete_thru() { return st.pg_complete_thru; }
+  bool get_commit() { return commit; }
+  int get_result() { return result; }
 
-  void set_peer_stat(const osd_peer_stat_t& stat) { st.peer_stat = stat; }
-  const osd_peer_stat_t& get_peer_stat() { return st.peer_stat; }
+  void set_pg_complete_thru(eversion_t v) { pg_complete_thru = v; }
+  eversion_t get_pg_complete_thru() { return pg_complete_thru; }
+
+  void set_peer_stat(const osd_peer_stat_t& stat) { peer_stat = stat; }
+  const osd_peer_stat_t& get_peer_stat() { return peer_stat; }
 
   void set_attrset(map<string,bufferptr> &as) { attrset = as; }
   map<string,bufferptr>& get_attrset() { return attrset; } 
 
 public:
-  MOSDSubOpReply(MOSDSubOp *req, int result, epoch_t e, bool commit) :
-    Message(MSG_OSD_SUBOPREPLY) {
-    st.map_epoch = e;
-    st.reqid = req->get_reqid();
-    st.pgid = req->get_pg();
-    st.rep_tid = req->get_rep_tid();
-    st.op = req->get_op();
-    st.poid = req->get_poid();
-    st.commit = commit;
-    st.result = result;
-    st.length = req->get_length();
-    st.offset = req->get_offset();
+  MOSDSubOpReply(MOSDSubOp *req, int result_, epoch_t e, bool commit_) :
+    Message(MSG_OSD_SUBOPREPLY),
+    map_epoch(e),
+    reqid(req->get_reqid()),
+    pgid(req->get_pg()),
+    rep_tid(req->get_rep_tid()),
+    op(req->get_op()),
+    poid(req->get_poid()),
+    length(req->get_length()),
+    offset(req->get_offset()),
+    commit(commit_),
+    result(result_) {
+    memset(&peer_stat, 0, sizeof(peer_stat));
   }
   MOSDSubOpReply() {}
 
-
-  // marshalling
-  virtual void decode_payload() {
-    int off = 0;
-    ::_decode(st, payload, off);
-    ::_decode(attrset, payload, off);
-  }
-  virtual void encode_payload() {
-    ::_encode(st, payload);
-    ::_encode(attrset, payload);
-    env.data_off = st.offset;
-  }
-
   const char *get_type_name() { return "osd_op_reply"; }
   
   void print(ostream& out) {
-    out << "osd_sub_op_reply(" << st.reqid
-       << " " << MOSDOp::get_opname(st.op)
-       << " " << st.poid;
-    if (st.length) out << " " << st.offset << "~" << st.length;
-    if (st.op >= 10) {
-      if (st.commit)
+    out << "osd_sub_op_reply(" << reqid
+       << " " << MOSDOp::get_opname(op)
+       << " " << poid;
+    if (length) out << " " << offset << "~" << length;
+    if (op >= 10) {
+      if (commit)
        out << " commit";
       else
        out << " ack";
     }
-    out << " = " << st.result;
+    out << " = " << result;
     out << ")";
   }
 
index ee3a5f28636bb34671e2e16c5915c00c282e1251..9e525ca33c0ff16a7daaf7fef6456ae037866ab6 100644 (file)
@@ -323,6 +323,7 @@ struct pg_stat_t {
 WRITE_CLASS_ENCODERS(pg_stat_t)
 
 typedef struct ceph_osd_peer_stat osd_peer_stat_t;
+WRITE_RAW_ENCODER(osd_peer_stat_t)
 
 inline ostream& operator<<(ostream& out, const osd_peer_stat_t &stat) {
   return out << "stat(" << stat.stamp
@@ -371,12 +372,33 @@ public:
   epoch_t current_epoch;             // most recent epoch
   epoch_t oldest_map, newest_map;    // oldest/newest maps we have.
   double weight;
+
   OSDSuperblock(int w=0) : 
     magic(MAGIC), whoami(w), 
     current_epoch(0), oldest_map(0), newest_map(0), weight(0) {
     memset(&fsid, 0, sizeof(fsid));
   }
+
+  void encode(bufferlist &bl) const {
+    ::encode(magic, bl);
+    ::encode(fsid, bl);
+    ::encode(whoami, bl);
+    ::encode(current_epoch, bl);
+    ::encode(oldest_map, bl);
+    ::encode(newest_map, bl);
+    ::encode(weight, bl);
+  }
+  void decode(bufferlist::iterator &bl) {
+    ::decode(magic, bl);
+    ::decode(fsid, bl);
+    ::decode(whoami, bl);
+    ::decode(current_epoch, bl);
+    ::decode(oldest_map, bl);
+    ::decode(newest_map, bl);
+    ::decode(weight, bl);
+  }
 };
+WRITE_CLASS_ENCODERS(OSDSuperblock)
 
 inline ostream& operator<<(ostream& out, OSDSuperblock& sb)
 {