Skip to content

Commit

Permalink
Merge pull request #6174 from liewegas/wip-13345
Browse files Browse the repository at this point in the history
fix MOSDOp encoding

Reviewed-by: Kefu Chai <kchai@redhat.com>
  • Loading branch information
liewegas committed Oct 20, 2015
2 parents 0278f5f + 0bf2a79 commit 29fdadc
Showing 1 changed file with 128 additions and 86 deletions.
214 changes: 128 additions & 86 deletions src/messages/MOSDOp.h
Expand Up @@ -77,28 +77,65 @@ class MOSDOp : public Message {
}

// Fields decoded in partial decoding
const pg_t& get_pg() const { assert(!partial_decode_needed); return pgid; }
epoch_t get_map_epoch() { assert(!partial_decode_needed); return osdmap_epoch; }
int get_flags() const { assert(!partial_decode_needed); return flags; }
const eversion_t& get_version() { assert(!partial_decode_needed); return reassert_version; }
const pg_t& get_pg() const {
assert(!partial_decode_needed);
return pgid;
}
epoch_t get_map_epoch() const {
assert(!partial_decode_needed);
return osdmap_epoch;
}
int get_flags() const {
assert(!partial_decode_needed);
return flags;
}
const eversion_t& get_version() const {
assert(!partial_decode_needed);
return reassert_version;
}
osd_reqid_t get_reqid() const {
assert(!partial_decode_needed);
if (reqid != osd_reqid_t())
if (reqid.name != entity_name_t() || reqid.tid != 0) {
return reqid;
else
} else {
if (!final_decode_needed)
assert(reqid.inc == client_inc); // decode() should have done this
return osd_reqid_t(get_orig_source(),
client_inc,
reqid.inc,
header.tid);
}
}

// Fields decoded in final decoding
int get_client_inc() { assert(!final_decode_needed); return client_inc; }
utime_t get_mtime() { assert(!final_decode_needed); return mtime; }
const object_locator_t& get_object_locator() const { assert(!final_decode_needed); return oloc; }
object_t& get_oid() { assert(!final_decode_needed); return oid; }
const snapid_t& get_snapid() { assert(!final_decode_needed); return snapid; }
const snapid_t& get_snap_seq() const { assert(!final_decode_needed); return snap_seq; }
const vector<snapid_t> &get_snaps() const { assert(!final_decode_needed); return snaps; }
int get_client_inc() const {
assert(!final_decode_needed);
return client_inc;
}
utime_t get_mtime() const {
assert(!final_decode_needed);
return mtime;
}
const object_locator_t& get_object_locator() const {
assert(!final_decode_needed);
return oloc;
}
object_t& get_oid() {
assert(!final_decode_needed);
return oid;
}
const snapid_t& get_snapid() {
assert(!final_decode_needed);
return snapid;
}
const snapid_t& get_snap_seq() const {
assert(!final_decode_needed);
return snap_seq;
}
const vector<snapid_t> &get_snaps() const {
assert(!final_decode_needed);
return snaps;
}

/**
* get retry attempt
*
Expand All @@ -116,16 +153,25 @@ class MOSDOp : public Message {
}

MOSDOp()
: Message(CEPH_MSG_OSD_OP, HEAD_VERSION, COMPAT_VERSION), partial_decode_needed(true), final_decode_needed(true) { }
: Message(CEPH_MSG_OSD_OP, HEAD_VERSION, COMPAT_VERSION),
partial_decode_needed(true),
final_decode_needed(true) { }
MOSDOp(int inc, long tid,
object_t& _oid, object_locator_t& _oloc, pg_t& _pgid, epoch_t _osdmap_epoch,
object_t& _oid, object_locator_t& _oloc, pg_t& _pgid,
epoch_t _osdmap_epoch,
int _flags, uint64_t feat)
: Message(CEPH_MSG_OSD_OP, HEAD_VERSION, COMPAT_VERSION),
client_inc(inc),
osdmap_epoch(_osdmap_epoch), flags(_flags), retry_attempt(-1),
oid(_oid), oloc(_oloc), pgid(_pgid), partial_decode_needed(false), final_decode_needed(false),
oid(_oid), oloc(_oloc), pgid(_pgid),
partial_decode_needed(false),
final_decode_needed(false),
features(feat) {
set_tid(tid);

// also put the client_inc in reqid.inc, so that get_reqid() can
// be used before the full message is decoded.
reqid.inc = inc;
}
private:
~MOSDOp() {}
Expand Down Expand Up @@ -339,11 +385,14 @@ struct ceph_osd_request_head {

retry_attempt = -1;
features = 0;
reqid = osd_reqid_t();
OSDOp::split_osd_op_vector_in_data(ops, data);
// In old versions, final decoding is done in first step

// we did the full decode
final_decode_needed = false;

// put client_inc in reqid.inc for get_reqid()'s benefit
reqid = osd_reqid_t();
reqid.inc = client_inc;
} else if (header.version < 7) {
::decode(client_inc, p);
::decode(osdmap_epoch, p);
Expand All @@ -361,26 +410,6 @@ struct ceph_osd_request_head {
::decode(pgid, p);
}

} else {
// new, v7 decode, splitted to partial and final
::decode(pgid, p);
::decode(osdmap_epoch, p);
::decode(flags, p);
::decode(reassert_version, p);
::decode(reqid, p);
}

partial_decode_needed = false;

}

void finish_decode() {
assert(!partial_decode_needed); // partial decoding required

if (!final_decode_needed)
return; //Message is already final decoded

if (header.version < 7) {
::decode(oid, p);

//::decode(ops, p);
Expand Down Expand Up @@ -411,29 +440,50 @@ struct ceph_osd_request_head {

OSDOp::split_osd_op_vector_in_data(ops, data);

} else { // final decoding for reordered v7
::decode(client_inc, p);
::decode(mtime, p);
::decode(oloc, p);
::decode(oid, p);
// we did the full decode
final_decode_needed = false;

__u16 num_ops;
::decode(num_ops, p);
ops.resize(num_ops);
for (unsigned i = 0; i < num_ops; i++)
::decode(ops[i].op, p);
// put client_inc in reqid.inc for get_reqid()'s benefit
if (reqid.name == entity_name_t() && reqid.tid == 0)
reqid.inc = client_inc;
} else {
// new, v7 decode, splitted to partial and final
::decode(pgid, p);
::decode(osdmap_epoch, p);
::decode(flags, p);
::decode(reassert_version, p);
::decode(reqid, p);
}

::decode(snapid, p);
::decode(snap_seq, p);
::decode(snaps, p);
partial_decode_needed = false;
}

::decode(retry_attempt, p);
void finish_decode() {
assert(!partial_decode_needed); // partial decoding required
if (!final_decode_needed)
return; // Message is already final decoded
assert(header.version >= 7);

::decode(features, p);
::decode(client_inc, p);
::decode(mtime, p);
::decode(oloc, p);
::decode(oid, p);

OSDOp::split_osd_op_vector_in_data(ops, data);
__u16 num_ops;
::decode(num_ops, p);
ops.resize(num_ops);
for (unsigned i = 0; i < num_ops; i++)
::decode(ops[i].op, p);

}
::decode(snapid, p);
::decode(snap_seq, p);
::decode(snaps, p);

::decode(retry_attempt, p);

::decode(features, p);

OSDOp::split_osd_op_vector_in_data(ops, data);

final_decode_needed = false;
}
Expand All @@ -444,37 +494,29 @@ struct ceph_osd_request_head {

const char *get_type_name() const { return "osd_op"; }
void print(ostream& out) const {
if (!partial_decode_needed)
out << "osd_op(" << get_reqid();
out << " ";
if (!oloc.nspace.empty())
out << oloc.nspace << "/";
out << oid;

#if 0
out << " ";
if (may_read())
out << "r";
if (may_write())
out << "w";
#endif
if (snapid != CEPH_NOSNAP)
out << "@" << snapid;

if (oloc.key.size())
out << " " << oloc;

out << " " << ops;
out << " " << pgid;
if (is_retry_attempt())
out << " RETRY=" << get_retry_attempt();
if (reassert_version != eversion_t())
out << " reassert_version=" << reassert_version;
if (!final_decode_needed)
out << " snapc " << get_snap_seq() << "=" << snaps;
if (!partial_decode_needed)
out << "osd_op(";
if (!partial_decode_needed) {
out << get_reqid() << ' ';
out << pgid;
if (!final_decode_needed) {
out << ' ';
if (!oloc.nspace.empty())
out << oloc.nspace << "/";
out << oid
<< " " << ops
<< " snapc " << get_snap_seq() << "=" << snaps;
if (oloc.key.size())
out << " " << oloc;
if (is_retry_attempt())
out << " RETRY=" << get_retry_attempt();
} else {
out << " (undecoded)";
}
out << " " << ceph_osd_flag_string(get_flags());
out << " e" << osdmap_epoch;
if (reassert_version != eversion_t())
out << " reassert_version=" << reassert_version;
out << " e" << osdmap_epoch;
}
out << ")";
}
};
Expand Down

0 comments on commit 29fdadc

Please sign in to comment.