// parse type, length
bufferlist::iterator p = bl.begin();
__u32 type;
+ LogEvent *event = NULL;
::decode(type, p);
+ if (EVENT_NEW_ENCODING == type) {
+ DECODE_START(1, p);
+ ::decode(type, p);
+ event = decode_event(bl, p, type);
+ DECODE_FINISH(p);
+ } else { // we are using classic encoding
+ event = decode_event(bl, p, type);
+ }
+ return event;
+}
+
+LogEvent *LogEvent::decode_event(bufferlist& bl, bufferlist::iterator& p, __u32 type)
+{
int length = bl.length() - p.get_off();
generic_dout(15) << "decode_log_event type " << type << ", size " << length << dendl;
#ifndef CEPH_LOGEVENT_H
#define CEPH_LOGEVENT_H
+#define EVENT_NEW_ENCODING 0 // indicates that the encoding is versioned
#define EVENT_UNUSED 1 // was previously EVENT_STRING
#define EVENT_SUBTREEMAP 2
private:
__u32 _type;
uint64_t _start_off;
+ static LogEvent *decode_event(bufferlist& bl, bufferlist::iterator& p, __u32 type);
protected:
utime_t stamp;
static LogEvent *decode(bufferlist &bl);
void encode_with_header(bufferlist& bl) {
+ ::encode(EVENT_NEW_ENCODING, bl);
+ ENCODE_START(1, 1, bl)
::encode(_type, bl);
encode(bl);
+ ENCODE_FINISH(bl);
}
virtual void print(ostream& out) {