1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
12 #include "include/types.h"
14 #include "global/global_context.h"
18 #include "messages/MPGStats.h"
20 #include "messages/MGenericMessage.h"
22 #include "messages/MPGStatsAck.h"
24 #include "messages/MStatfs.h"
25 #include "messages/MStatfsReply.h"
27 #include "messages/MGetPoolStats.h"
28 #include "messages/MGetPoolStatsReply.h"
31 #include "messages/MPoolOp.h"
32 #include "messages/MPoolOpReply.h"
34 #include "messages/PaxosServiceMessage.h"
35 #include "messages/MMonCommand.h"
36 #include "messages/MMonCommandAck.h"
37 #include "messages/MMonPaxos.h"
39 #include "messages/MMonProbe.h"
40 #include "messages/MMonJoin.h"
41 #include "messages/MMonElection.h"
42 #include "messages/MMonSync.h"
43 #include "messages/MMonScrub.h"
45 #include "messages/MLog.h"
46 #include "messages/MLogAck.h"
48 #include "messages/MPing.h"
50 #include "messages/MCommand.h"
51 #include "messages/MCommandReply.h"
52 #include "messages/MBackfillReserve.h"
53 #include "messages/MRecoveryReserve.h"
55 #include "messages/MRoute.h"
56 #include "messages/MForward.h"
58 #include "messages/MOSDBoot.h"
59 #include "messages/MOSDAlive.h"
60 #include "messages/MOSDBeacon.h"
61 #include "messages/MOSDPGTemp.h"
62 #include "messages/MOSDFailure.h"
63 #include "messages/MOSDMarkMeDown.h"
64 #include "messages/MOSDFull.h"
65 #include "messages/MOSDPing.h"
66 #include "messages/MOSDOp.h"
67 #include "messages/MOSDOpReply.h"
68 #include "messages/MOSDSubOp.h"
69 #include "messages/MOSDSubOpReply.h"
70 #include "messages/MOSDRepOp.h"
71 #include "messages/MOSDRepOpReply.h"
72 #include "messages/MOSDMap.h"
73 #include "messages/MMonGetOSDMap.h"
75 #include "messages/MOSDPGCreated.h"
76 #include "messages/MOSDPGNotify.h"
77 #include "messages/MOSDPGQuery.h"
78 #include "messages/MOSDPGLog.h"
79 #include "messages/MOSDPGRemove.h"
80 #include "messages/MOSDPGInfo.h"
81 #include "messages/MOSDPGCreate.h"
82 #include "messages/MOSDPGTrim.h"
83 #include "messages/MOSDScrub.h"
84 #include "messages/MOSDScrubReserve.h"
85 #include "messages/MOSDRepScrub.h"
86 #include "messages/MOSDRepScrubMap.h"
87 #include "messages/MOSDForceRecovery.h"
88 #include "messages/MOSDPGScan.h"
89 #include "messages/MOSDPGBackfill.h"
90 #include "messages/MOSDBackoff.h"
91 #include "messages/MOSDPGBackfillRemove.h"
92 #include "messages/MOSDPGRecoveryDelete.h"
93 #include "messages/MOSDPGRecoveryDeleteReply.h"
95 #include "messages/MRemoveSnaps.h"
97 #include "messages/MMonMap.h"
98 #include "messages/MMonGetMap.h"
99 #include "messages/MMonGetVersion.h"
100 #include "messages/MMonGetVersionReply.h"
101 #include "messages/MMonHealth.h"
102 #include "messages/MMonHealthChecks.h"
103 #include "messages/MMonMetadata.h"
104 #include "messages/MDataPing.h"
105 #include "messages/MAuth.h"
106 #include "messages/MAuthReply.h"
107 #include "messages/MMonSubscribe.h"
108 #include "messages/MMonSubscribeAck.h"
109 #include "messages/MMonGlobalID.h"
110 #include "messages/MClientSession.h"
111 #include "messages/MClientReconnect.h"
112 #include "messages/MClientRequest.h"
113 #include "messages/MClientRequestForward.h"
114 #include "messages/MClientReply.h"
115 #include "messages/MClientCaps.h"
116 #include "messages/MClientCapRelease.h"
117 #include "messages/MClientLease.h"
118 #include "messages/MClientSnap.h"
119 #include "messages/MClientQuota.h"
121 #include "messages/MMDSSlaveRequest.h"
123 #include "messages/MMDSMap.h"
124 #include "messages/MFSMap.h"
125 #include "messages/MFSMapUser.h"
126 #include "messages/MMDSBeacon.h"
127 #include "messages/MMDSLoadTargets.h"
128 #include "messages/MMDSResolve.h"
129 #include "messages/MMDSResolveAck.h"
130 #include "messages/MMDSCacheRejoin.h"
131 #include "messages/MMDSFindIno.h"
132 #include "messages/MMDSFindInoReply.h"
133 #include "messages/MMDSOpenIno.h"
134 #include "messages/MMDSOpenInoReply.h"
136 #include "messages/MDirUpdate.h"
137 #include "messages/MDiscover.h"
138 #include "messages/MDiscoverReply.h"
140 #include "messages/MMDSFragmentNotify.h"
141 #include "messages/MMDSFragmentNotifyAck.h"
143 #include "messages/MExportDirDiscover.h"
144 #include "messages/MExportDirDiscoverAck.h"
145 #include "messages/MExportDirCancel.h"
146 #include "messages/MExportDirPrep.h"
147 #include "messages/MExportDirPrepAck.h"
148 #include "messages/MExportDir.h"
149 #include "messages/MExportDirAck.h"
150 #include "messages/MExportDirNotify.h"
151 #include "messages/MExportDirNotifyAck.h"
152 #include "messages/MExportDirFinish.h"
154 #include "messages/MExportCaps.h"
155 #include "messages/MExportCapsAck.h"
156 #include "messages/MGatherCaps.h"
159 #include "messages/MDentryUnlink.h"
160 #include "messages/MDentryLink.h"
162 #include "messages/MHeartbeat.h"
164 #include "messages/MMDSTableRequest.h"
166 //#include "messages/MInodeUpdate.h"
167 #include "messages/MCacheExpire.h"
168 #include "messages/MInodeFileCaps.h"
170 #include "messages/MMgrBeacon.h"
171 #include "messages/MMgrMap.h"
172 #include "messages/MMgrDigest.h"
173 #include "messages/MMgrReport.h"
174 #include "messages/MMgrOpen.h"
175 #include "messages/MMgrConfigure.h"
176 #include "messages/MMonMgrReport.h"
177 #include "messages/MServiceMap.h"
179 #include "messages/MLock.h"
181 #include "messages/MWatchNotify.h"
182 #include "messages/MTimeCheck.h"
184 #include "common/config.h"
186 #include "messages/MOSDPGPush.h"
187 #include "messages/MOSDPGPushReply.h"
188 #include "messages/MOSDPGPull.h"
190 #include "messages/MOSDECSubOpWrite.h"
191 #include "messages/MOSDECSubOpWriteReply.h"
192 #include "messages/MOSDECSubOpRead.h"
193 #include "messages/MOSDECSubOpReadReply.h"
195 #include "messages/MOSDPGUpdateLogMissing.h"
196 #include "messages/MOSDPGUpdateLogMissingReply.h"
198 #define DEBUGLVL 10 // debug level of output
200 #define dout_subsys ceph_subsys_ms
202 void Message::encode(uint64_t features
, int crcflags
)
204 // encode and copy out of *m
205 if (empty_payload()) {
206 assert(middle
.length() == 0);
207 encode_payload(features
);
209 if (byte_throttler
) {
210 byte_throttler
->take(payload
.length() + middle
.length());
213 // if the encoder didn't specify past compatibility, we assume it
215 if (header
.compat_version
== 0)
216 header
.compat_version
= header
.version
;
218 if (crcflags
& MSG_CRC_HEADER
)
222 header
.front_len
= get_payload().length();
223 header
.middle_len
= get_middle().length();
224 header
.data_len
= get_data().length();
225 if (crcflags
& MSG_CRC_HEADER
)
228 footer
.flags
= CEPH_MSG_FOOTER_COMPLETE
;
230 if (crcflags
& MSG_CRC_DATA
) {
235 ::encode(get_header(), bl
);
237 // dump the old footer format
238 ceph_msg_footer_old old_footer
;
239 old_footer
.front_crc
= footer
.front_crc
;
240 old_footer
.middle_crc
= footer
.middle_crc
;
241 old_footer
.data_crc
= footer
.data_crc
;
242 old_footer
.flags
= footer
.flags
;
243 ::encode(old_footer
, bl
);
245 ::encode(get_payload(), bl
);
246 ::encode(get_middle(), bl
);
247 ::encode(get_data(), bl
);
249 // this is almost an exponential backoff, except because we count
250 // bits we tend to sample things we encode later, which should be
251 // more representative.
255 for (unsigned t
= i
; t
; bits
++)
260 snprintf(fn
, sizeof(fn
), ENCODE_STRINGIFY(ENCODE_DUMP
) "/%s__%d.%x",
261 abi::__cxa_demangle(typeid(*this).name(), 0, 0, &status
),
263 int fd
= ::open(fn
, O_WRONLY
|O_TRUNC
|O_CREAT
|O_CLOEXEC
, 0644);
271 footer
.flags
= (unsigned)footer
.flags
| CEPH_MSG_FOOTER_NOCRC
;
275 void Message::dump(Formatter
*f
) const
279 f
->dump_string("summary", ss
.str());
282 Message
*decode_message(CephContext
*cct
, int crcflags
,
283 ceph_msg_header
& header
,
284 ceph_msg_footer
& footer
,
285 bufferlist
& front
, bufferlist
& middle
,
286 bufferlist
& data
, Connection
* conn
)
289 if (crcflags
& MSG_CRC_HEADER
) {
290 __u32 front_crc
= front
.crc32c(0);
291 __u32 middle_crc
= middle
.crc32c(0);
293 if (front_crc
!= footer
.front_crc
) {
295 ldout(cct
, 0) << "bad crc in front " << front_crc
<< " != exp " << footer
.front_crc
<< dendl
;
296 ldout(cct
, 20) << " ";
297 front
.hexdump(*_dout
);
302 if (middle_crc
!= footer
.middle_crc
) {
304 ldout(cct
, 0) << "bad crc in middle " << middle_crc
<< " != exp " << footer
.middle_crc
<< dendl
;
305 ldout(cct
, 20) << " ";
306 middle
.hexdump(*_dout
);
312 if (crcflags
& MSG_CRC_DATA
) {
313 if ((footer
.flags
& CEPH_MSG_FOOTER_NOCRC
) == 0) {
314 __u32 data_crc
= data
.crc32c(0);
315 if (data_crc
!= footer
.data_crc
) {
317 ldout(cct
, 0) << "bad crc in data " << data_crc
<< " != exp " << footer
.data_crc
<< dendl
;
318 ldout(cct
, 20) << " ";
319 data
.hexdump(*_dout
);
329 int type
= header
.type
;
332 // -- with payload --
341 case CEPH_MSG_STATFS
:
344 case CEPH_MSG_STATFS_REPLY
:
345 m
= new MStatfsReply
;
347 case MSG_GETPOOLSTATS
:
348 m
= new MGetPoolStats
;
350 case MSG_GETPOOLSTATSREPLY
:
351 m
= new MGetPoolStatsReply
;
353 case CEPH_MSG_POOLOP
:
356 case CEPH_MSG_POOLOP_REPLY
:
357 m
= new MPoolOpReply
;
359 case MSG_MON_COMMAND
:
362 case MSG_MON_COMMAND_ACK
:
363 m
= new MMonCommandAck
;
375 case MSG_MON_ELECTION
:
376 m
= new MMonElection
;
398 case MSG_COMMAND_REPLY
:
399 m
= new MCommandReply
;
401 case MSG_OSD_BACKFILL_RESERVE
:
402 m
= new MBackfillReserve
;
404 case MSG_OSD_RECOVERY_RESERVE
:
405 m
= new MRecoveryReserve
;
407 case MSG_OSD_FORCE_RECOVERY
:
408 m
= new MOSDForceRecovery
;
418 case CEPH_MSG_MON_MAP
:
421 case CEPH_MSG_MON_GET_MAP
:
424 case CEPH_MSG_MON_GET_OSDMAP
:
425 m
= new MMonGetOSDMap
;
427 case CEPH_MSG_MON_GET_VERSION
:
428 m
= new MMonGetVersion();
430 case CEPH_MSG_MON_GET_VERSION_REPLY
:
431 m
= new MMonGetVersionReply();
433 case CEPH_MSG_MON_METADATA
:
434 m
= new MMonMetadata();
444 m
= new MOSDBeacon();
449 case MSG_OSD_FAILURE
:
450 m
= new MOSDFailure();
452 case MSG_OSD_MARK_ME_DOWN
:
453 m
= new MOSDMarkMeDown();
461 case CEPH_MSG_OSD_OP
:
464 case CEPH_MSG_OSD_OPREPLY
:
465 m
= new MOSDOpReply();
470 case MSG_OSD_SUBOPREPLY
:
471 m
= new MOSDSubOpReply();
476 case MSG_OSD_REPOPREPLY
:
477 m
= new MOSDRepOpReply();
479 case MSG_OSD_PG_CREATED
:
480 m
= new MOSDPGCreated();
482 case MSG_OSD_PG_UPDATE_LOG_MISSING
:
483 m
= new MOSDPGUpdateLogMissing();
485 case MSG_OSD_PG_UPDATE_LOG_MISSING_REPLY
:
486 m
= new MOSDPGUpdateLogMissingReply();
488 case CEPH_MSG_OSD_BACKOFF
:
492 case CEPH_MSG_OSD_MAP
:
496 case CEPH_MSG_WATCH_NOTIFY
:
497 m
= new MWatchNotify
;
500 case MSG_OSD_PG_NOTIFY
:
501 m
= new MOSDPGNotify
;
503 case MSG_OSD_PG_QUERY
:
509 case MSG_OSD_PG_REMOVE
:
510 m
= new MOSDPGRemove
;
512 case MSG_OSD_PG_INFO
:
515 case MSG_OSD_PG_CREATE
:
516 m
= new MOSDPGCreate
;
518 case MSG_OSD_PG_TRIM
:
525 case MSG_OSD_SCRUB_RESERVE
:
526 m
= new MOSDScrubReserve
;
528 case MSG_REMOVE_SNAPS
:
529 m
= new MRemoveSnaps
;
531 case MSG_OSD_REP_SCRUB
:
532 m
= new MOSDRepScrub
;
534 case MSG_OSD_REP_SCRUBMAP
:
535 m
= new MOSDRepScrubMap
;
537 case MSG_OSD_PG_SCAN
:
540 case MSG_OSD_PG_BACKFILL
:
541 m
= new MOSDPGBackfill
;
543 case MSG_OSD_PG_BACKFILL_REMOVE
:
544 m
= new MOSDPGBackfillRemove
;
546 case MSG_OSD_PG_PUSH
:
549 case MSG_OSD_PG_PULL
:
552 case MSG_OSD_PG_PUSH_REPLY
:
553 m
= new MOSDPGPushReply
;
555 case MSG_OSD_PG_RECOVERY_DELETE
:
556 m
= new MOSDPGRecoveryDelete
;
558 case MSG_OSD_PG_RECOVERY_DELETE_REPLY
:
559 m
= new MOSDPGRecoveryDeleteReply
;
561 case MSG_OSD_EC_WRITE
:
562 m
= new MOSDECSubOpWrite
;
564 case MSG_OSD_EC_WRITE_REPLY
:
565 m
= new MOSDECSubOpWriteReply
;
567 case MSG_OSD_EC_READ
:
568 m
= new MOSDECSubOpRead
;
570 case MSG_OSD_EC_READ_REPLY
:
571 m
= new MOSDECSubOpReadReply
;
577 case CEPH_MSG_AUTH_REPLY
:
581 case MSG_MON_GLOBAL_ID
:
582 m
= new MMonGlobalID
;
586 case CEPH_MSG_MON_SUBSCRIBE
:
587 m
= new MMonSubscribe
;
589 case CEPH_MSG_MON_SUBSCRIBE_ACK
:
590 m
= new MMonSubscribeAck
;
592 case CEPH_MSG_CLIENT_SESSION
:
593 m
= new MClientSession
;
595 case CEPH_MSG_CLIENT_RECONNECT
:
596 m
= new MClientReconnect
;
598 case CEPH_MSG_CLIENT_REQUEST
:
599 m
= new MClientRequest
;
601 case CEPH_MSG_CLIENT_REQUEST_FORWARD
:
602 m
= new MClientRequestForward
;
604 case CEPH_MSG_CLIENT_REPLY
:
605 m
= new MClientReply
;
607 case CEPH_MSG_CLIENT_CAPS
:
610 case CEPH_MSG_CLIENT_CAPRELEASE
:
611 m
= new MClientCapRelease
;
613 case CEPH_MSG_CLIENT_LEASE
:
614 m
= new MClientLease
;
616 case CEPH_MSG_CLIENT_SNAP
:
619 case CEPH_MSG_CLIENT_QUOTA
:
620 m
= new MClientQuota
;
624 case MSG_MDS_SLAVE_REQUEST
:
625 m
= new MMDSSlaveRequest
;
628 case CEPH_MSG_MDS_MAP
:
631 case CEPH_MSG_FS_MAP
:
634 case CEPH_MSG_FS_MAP_USER
:
640 case MSG_MDS_OFFLOAD_TARGETS
:
641 m
= new MMDSLoadTargets
;
643 case MSG_MDS_RESOLVE
:
646 case MSG_MDS_RESOLVEACK
:
647 m
= new MMDSResolveAck
;
649 case MSG_MDS_CACHEREJOIN
:
650 m
= new MMDSCacheRejoin
;
653 case MSG_MDS_DIRUPDATE
:
654 m
= new MDirUpdate();
657 case MSG_MDS_DISCOVER
:
660 case MSG_MDS_DISCOVERREPLY
:
661 m
= new MDiscoverReply();
664 case MSG_MDS_FINDINO
:
667 case MSG_MDS_FINDINOREPLY
:
668 m
= new MMDSFindInoReply
;
671 case MSG_MDS_OPENINO
:
674 case MSG_MDS_OPENINOREPLY
:
675 m
= new MMDSOpenInoReply
;
678 case MSG_MDS_FRAGMENTNOTIFY
:
679 m
= new MMDSFragmentNotify
;
682 case MSG_MDS_FRAGMENTNOTIFYACK
:
683 m
= new MMDSFragmentNotifyAck
;
686 case MSG_MDS_EXPORTDIRDISCOVER
:
687 m
= new MExportDirDiscover();
689 case MSG_MDS_EXPORTDIRDISCOVERACK
:
690 m
= new MExportDirDiscoverAck();
692 case MSG_MDS_EXPORTDIRCANCEL
:
693 m
= new MExportDirCancel();
696 case MSG_MDS_EXPORTDIR
:
699 case MSG_MDS_EXPORTDIRACK
:
700 m
= new MExportDirAck
;
702 case MSG_MDS_EXPORTDIRFINISH
:
703 m
= new MExportDirFinish
;
706 case MSG_MDS_EXPORTDIRNOTIFY
:
707 m
= new MExportDirNotify();
710 case MSG_MDS_EXPORTDIRNOTIFYACK
:
711 m
= new MExportDirNotifyAck();
714 case MSG_MDS_EXPORTDIRPREP
:
715 m
= new MExportDirPrep();
718 case MSG_MDS_EXPORTDIRPREPACK
:
719 m
= new MExportDirPrepAck();
722 case MSG_MDS_EXPORTCAPS
:
725 case MSG_MDS_EXPORTCAPSACK
:
726 m
= new MExportCapsAck
;
728 case MSG_MDS_GATHERCAPS
:
733 case MSG_MDS_DENTRYUNLINK
:
734 m
= new MDentryUnlink
;
736 case MSG_MDS_DENTRYLINK
:
740 case MSG_MDS_HEARTBEAT
:
741 m
= new MHeartbeat();
744 case MSG_MDS_CACHEEXPIRE
:
745 m
= new MCacheExpire();
748 case MSG_MDS_TABLE_REQUEST
:
749 m
= new MMDSTableRequest
;
752 /* case MSG_MDS_INODEUPDATE:
753 m = new MInodeUpdate();
757 case MSG_MDS_INODEFILECAPS
:
758 m
= new MInodeFileCaps();
766 m
= new MMgrBeacon();
769 case MSG_MON_MGR_REPORT
:
770 m
= new MMonMgrReport();
773 case MSG_SERVICE_MAP
:
774 m
= new MServiceMap();
782 m
= new MMgrDigest();
790 m
= new MMgrReport();
793 case MSG_MGR_CONFIGURE
:
794 m
= new MMgrConfigure();
798 m
= new MTimeCheck();
802 m
= new MMonHealth();
805 case MSG_MON_HEALTH_CHECKS
:
806 m
= new MMonHealthChecks();
809 #if defined(HAVE_XIO)
814 // -- simple messages without payload --
816 case CEPH_MSG_SHUTDOWN
:
817 m
= new MGenericMessage(type
);
822 ldout(cct
, 0) << "can't decode unknown message type " << type
<< " MSG_AUTH=" << CEPH_MSG_AUTH
<< dendl
;
823 if (cct
->_conf
->ms_die_on_bad_msg
)
831 // m->header.version, if non-zero, should be populated with the
832 // newest version of the encoding the code supports. If set, check
833 // it against compat_version.
834 if (m
->get_header().version
&&
835 m
->get_header().version
< header
.compat_version
) {
837 ldout(cct
, 0) << "will not decode message of type " << type
838 << " version " << header
.version
839 << " because compat_version " << header
.compat_version
840 << " > supported version " << m
->get_header().version
<< dendl
;
841 if (cct
->_conf
->ms_die_on_bad_msg
)
848 m
->set_connection(conn
);
849 m
->set_header(header
);
850 m
->set_footer(footer
);
851 m
->set_payload(front
);
852 m
->set_middle(middle
);
858 catch (const buffer::error
&e
) {
860 lderr(cct
) << "failed to decode message of type " << type
861 << " v" << header
.version
862 << ": " << e
.what() << dendl
;
863 ldout(cct
, cct
->_conf
->ms_dump_corrupt_message_level
) << "dump: \n";
864 m
->get_payload().hexdump(*_dout
);
866 if (cct
->_conf
->ms_die_on_bad_msg
)
877 void Message::encode_trace(bufferlist
&bl
, uint64_t features
) const
879 auto p
= trace
.get_info();
880 static const blkin_trace_info empty
= { 0, 0, 0 };
887 void Message::decode_trace(bufferlist::iterator
&p
, bool create
)
889 blkin_trace_info info
= {};
896 const auto msgr
= connection
->get_messenger();
897 const auto endpoint
= msgr
->get_trace_endpoint();
899 trace
.init(get_type_name(), endpoint
, &info
, true);
900 trace
.event("decoded trace");
901 } else if (create
|| (msgr
->get_myname().is_osd() &&
902 msgr
->cct
->_conf
->osd_blkin_trace_all
)) {
903 // create a trace even if we didn't get one on the wire
904 trace
.init(get_type_name(), endpoint
);
905 trace
.event("created trace");
907 trace
.keyval("tid", get_tid());
908 trace
.keyval("entity type", get_source().type_str());
909 trace
.keyval("entity num", get_source().num());
914 // This routine is not used for ordinary messages, but only when encapsulating a message
915 // for forwarding and routing. It's also used in a backward compatibility test, which only
916 // effectively tests backward compability for those functions. To avoid backward compatibility
917 // problems, we currently always encode and decode using the old footer format that doesn't
918 // allow for message authentication. Eventually we should fix that. PLR
920 void encode_message(Message
*msg
, uint64_t features
, bufferlist
& payload
)
922 bufferlist front
, middle
, data
;
923 ceph_msg_footer_old old_footer
;
924 ceph_msg_footer footer
;
925 msg
->encode(features
, MSG_CRC_ALL
);
926 ::encode(msg
->get_header(), payload
);
928 // Here's where we switch to the old footer format. PLR
930 footer
= msg
->get_footer();
931 old_footer
.front_crc
= footer
.front_crc
;
932 old_footer
.middle_crc
= footer
.middle_crc
;
933 old_footer
.data_crc
= footer
.data_crc
;
934 old_footer
.flags
= footer
.flags
;
935 ::encode(old_footer
, payload
);
937 ::encode(msg
->get_payload(), payload
);
938 ::encode(msg
->get_middle(), payload
);
939 ::encode(msg
->get_data(), payload
);
942 // See above for somewhat bogus use of the old message footer. We switch to the current footer
943 // after decoding the old one so the other form of decode_message() doesn't have to change.
944 // We've slipped in a 0 signature at this point, so any signature checking after this will
947 Message
*decode_message(CephContext
*cct
, int crcflags
, bufferlist::iterator
& p
)
950 ceph_msg_footer_old fo
;
952 bufferlist fr
, mi
, da
;
955 f
.front_crc
= fo
.front_crc
;
956 f
.middle_crc
= fo
.middle_crc
;
957 f
.data_crc
= fo
.data_crc
;
963 return decode_message(cct
, crcflags
, h
, f
, fr
, mi
, da
, nullptr);