From: Haomai Wang Date: Mon, 1 Jun 2015 06:50:45 +0000 (+0800) Subject: Message: Make encode_payload can be reentrant X-Git-Tag: v9.0.2~23^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=55e7cb9cd5e61d42825dc24452f7abb43c3f83fe;p=ceph.git Message: Make encode_payload can be reentrant Signed-off-by: Haomai Wang --- diff --git a/src/messages/MClientCaps.h b/src/messages/MClientCaps.h index 6aa89c87242c..91ffdf52ffdb 100644 --- a/src/messages/MClientCaps.h +++ b/src/messages/MClientCaps.h @@ -194,6 +194,7 @@ public: } } void encode_payload(uint64_t features) { + header.version = HEAD_VERSION; head.snap_trace_len = snapbl.length(); head.xattr_len = xattrbl.length(); diff --git a/src/messages/MClientReconnect.h b/src/messages/MClientReconnect.h index 1b072a35d553..8a9ff42f4a1c 100644 --- a/src/messages/MClientReconnect.h +++ b/src/messages/MClientReconnect.h @@ -56,6 +56,7 @@ public: data.clear(); if (features & CEPH_FEATURE_MDSENC) { ::encode(caps, data); + header.version = HEAD_VERSION; } else if (features & CEPH_FEATURE_FLOCK) { // encode with old cap_reconnect_t encoding __u32 n = caps.size(); diff --git a/src/messages/MClientSession.h b/src/messages/MClientSession.h index 3ef28e96c277..8975b18bce60 100644 --- a/src/messages/MClientSession.h +++ b/src/messages/MClientSession.h @@ -76,6 +76,7 @@ public: header.version = 1; } else { ::encode(client_meta, payload); + header.version = HEAD_VERSION; } } diff --git a/src/messages/MMonPaxos.h b/src/messages/MMonPaxos.h index 206586ccd215..b8a9d37545df 100644 --- a/src/messages/MMonPaxos.h +++ b/src/messages/MMonPaxos.h @@ -92,6 +92,8 @@ public: void encode_payload(uint64_t features) { if ((features & CEPH_FEATURE_MONCLOCKCHECK) == 0) header.version = 0; + else + header.version = HEAD_VERSION; ::encode(epoch, payload); ::encode(op, payload); ::encode(first_committed, payload); diff --git a/src/messages/MMonSubscribe.h b/src/messages/MMonSubscribe.h index 0233010fd895..2363775259cb 100644 --- a/src/messages/MMonSubscribe.h +++ b/src/messages/MMonSubscribe.h @@ -74,6 +74,7 @@ public: void encode_payload(uint64_t features) { if (features & CEPH_FEATURE_SUBSCRIBE2) { ::encode(what, payload); + header.version = HEAD_VERSION; } else { header.version = 0; map oldwhat; diff --git a/src/messages/MOSDMap.h b/src/messages/MOSDMap.h index 9c15290b7e9d..06e79de47794 100644 --- a/src/messages/MOSDMap.h +++ b/src/messages/MOSDMap.h @@ -80,6 +80,7 @@ public: } } void encode_payload(uint64_t features) { + header.version = HEAD_VERSION; ::encode(fsid, payload); if ((features & CEPH_FEATURE_PGID64) == 0 || (features & CEPH_FEATURE_PGPOOL3) == 0 || diff --git a/src/messages/MOSDOp.h b/src/messages/MOSDOp.h index 867ac0ae8cb0..628a21cc3d9e 100644 --- a/src/messages/MOSDOp.h +++ b/src/messages/MOSDOp.h @@ -241,6 +241,7 @@ struct ceph_osd_request_head { ::encode_nohead(oid.name, payload); ::encode_nohead(snaps, payload); } else { + header.version = HEAD_VERSION; ::encode(client_inc, payload); ::encode(osdmap_epoch, payload); ::encode(flags, payload); diff --git a/src/messages/MOSDOpReply.h b/src/messages/MOSDOpReply.h index b2d51555f623..45ec3d0dc25d 100644 --- a/src/messages/MOSDOpReply.h +++ b/src/messages/MOSDOpReply.h @@ -169,6 +169,7 @@ public: } ::encode_nohead(oid.name, payload); } else { + header.version = HEAD_VERSION; ::encode(oid, payload); ::encode(pgid, payload); ::encode(flags, payload); diff --git a/src/messages/MRoute.h b/src/messages/MRoute.h index d7a826e2dec7..5282d39ae8de 100644 --- a/src/messages/MRoute.h +++ b/src/messages/MRoute.h @@ -60,6 +60,8 @@ public: ::encode(session_mon_tid, payload); ::encode(dest, payload); if (features & CEPH_FEATURE_MON_NULLROUTE) { + header.version = HEAD_VERSION; + header.compat_version = COMPAT_VERSION; bool m = msg ? true : false; ::encode(m, payload); if (msg) diff --git a/src/msg/async/AsyncConnection.cc b/src/msg/async/AsyncConnection.cc index 43b4ca515f28..db2ed403b174 100644 --- a/src/msg/async/AsyncConnection.cc +++ b/src/msg/async/AsyncConnection.cc @@ -1968,6 +1968,7 @@ int AsyncConnection::send_message(Message *m) if (can_write == NOWRITE || get_features() != f) { // ensure the correctness of message encoding bl.clear(); + m->get_payload().clear(); ldout(async_msgr->cct, 5) << __func__ << " clear encoded buffer, can_write=" << can_write << " previous " << f << " != " << get_features() << dendl; }