1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
11 #include "include/types.h"
13 #include "global/global_context.h"
17 #include "messages/MPGStats.h"
19 #include "messages/MGenericMessage.h"
21 #include "messages/MPGStatsAck.h"
23 #include "messages/MStatfs.h"
24 #include "messages/MStatfsReply.h"
26 #include "messages/MGetPoolStats.h"
27 #include "messages/MGetPoolStatsReply.h"
30 #include "messages/MPoolOp.h"
31 #include "messages/MPoolOpReply.h"
33 #include "messages/PaxosServiceMessage.h"
34 #include "messages/MMonCommand.h"
35 #include "messages/MMonCommandAck.h"
36 #include "messages/MMonPaxos.h"
37 #include "messages/MConfig.h"
38 #include "messages/MGetConfig.h"
39 #include "messages/MKVData.h"
41 #include "messages/MMonProbe.h"
42 #include "messages/MMonJoin.h"
43 #include "messages/MMonElection.h"
44 #include "messages/MMonSync.h"
45 #include "messages/MMonPing.h"
46 #include "messages/MMonScrub.h"
48 #include "messages/MLog.h"
49 #include "messages/MLogAck.h"
51 #include "messages/MPing.h"
53 #include "messages/MCommand.h"
54 #include "messages/MCommandReply.h"
55 #include "messages/MBackfillReserve.h"
56 #include "messages/MRecoveryReserve.h"
58 #include "messages/MRoute.h"
59 #include "messages/MForward.h"
61 #include "messages/MOSDBoot.h"
62 #include "messages/MOSDAlive.h"
63 #include "messages/MOSDBeacon.h"
64 #include "messages/MOSDPGTemp.h"
65 #include "messages/MOSDFailure.h"
66 #include "messages/MOSDMarkMeDown.h"
67 #include "messages/MOSDMarkMeDead.h"
68 #include "messages/MOSDFull.h"
69 #include "messages/MOSDPing.h"
70 #include "messages/MOSDOp.h"
71 #include "messages/MOSDOpReply.h"
72 #include "messages/MOSDRepOp.h"
73 #include "messages/MOSDRepOpReply.h"
74 #include "messages/MOSDMap.h"
75 #include "messages/MMonGetOSDMap.h"
76 #include "messages/MMonGetPurgedSnaps.h"
77 #include "messages/MMonGetPurgedSnapsReply.h"
79 #include "messages/MOSDPGCreated.h"
80 #include "messages/MOSDPGNotify.h"
81 #include "messages/MOSDPGNotify2.h"
82 #include "messages/MOSDPGQuery.h"
83 #include "messages/MOSDPGQuery2.h"
84 #include "messages/MOSDPGLog.h"
85 #include "messages/MOSDPGRemove.h"
86 #include "messages/MOSDPGInfo.h"
87 #include "messages/MOSDPGInfo2.h"
88 #include "messages/MOSDPGCreate.h"
89 #include "messages/MOSDPGCreate2.h"
90 #include "messages/MOSDPGTrim.h"
91 #include "messages/MOSDPGLease.h"
92 #include "messages/MOSDPGLeaseAck.h"
93 #include "messages/MOSDScrub.h"
94 #include "messages/MOSDScrub2.h"
95 #include "messages/MOSDScrubReserve.h"
96 #include "messages/MOSDRepScrub.h"
97 #include "messages/MOSDRepScrubMap.h"
98 #include "messages/MOSDForceRecovery.h"
99 #include "messages/MOSDPGScan.h"
100 #include "messages/MOSDPGBackfill.h"
101 #include "messages/MOSDBackoff.h"
102 #include "messages/MOSDPGBackfillRemove.h"
103 #include "messages/MOSDPGRecoveryDelete.h"
104 #include "messages/MOSDPGRecoveryDeleteReply.h"
105 #include "messages/MOSDPGReadyToMerge.h"
107 #include "messages/MRemoveSnaps.h"
109 #include "messages/MMonMap.h"
110 #include "messages/MMonGetMap.h"
111 #include "messages/MMonGetVersion.h"
112 #include "messages/MMonGetVersionReply.h"
113 #include "messages/MMonHealth.h"
114 #include "messages/MMonHealthChecks.h"
115 #include "messages/MAuth.h"
116 #include "messages/MAuthReply.h"
117 #include "messages/MMonSubscribe.h"
118 #include "messages/MMonSubscribeAck.h"
119 #include "messages/MMonGlobalID.h"
120 #include "messages/MMonUsedPendingKeys.h"
121 #include "messages/MClientSession.h"
122 #include "messages/MClientReconnect.h"
123 #include "messages/MClientRequest.h"
124 #include "messages/MClientRequestForward.h"
125 #include "messages/MClientReply.h"
126 #include "messages/MClientReclaim.h"
127 #include "messages/MClientReclaimReply.h"
128 #include "messages/MClientCaps.h"
129 #include "messages/MClientCapRelease.h"
130 #include "messages/MClientLease.h"
131 #include "messages/MClientSnap.h"
132 #include "messages/MClientQuota.h"
133 #include "messages/MClientMetrics.h"
135 #include "messages/MMDSPeerRequest.h"
137 #include "messages/MMDSMap.h"
138 #include "messages/MFSMap.h"
139 #include "messages/MFSMapUser.h"
140 #include "messages/MMDSBeacon.h"
141 #include "messages/MMDSLoadTargets.h"
142 #include "messages/MMDSResolve.h"
143 #include "messages/MMDSResolveAck.h"
144 #include "messages/MMDSCacheRejoin.h"
145 #include "messages/MMDSFindIno.h"
146 #include "messages/MMDSFindInoReply.h"
147 #include "messages/MMDSOpenIno.h"
148 #include "messages/MMDSOpenInoReply.h"
149 #include "messages/MMDSSnapUpdate.h"
150 #include "messages/MMDSScrub.h"
151 #include "messages/MMDSScrubStats.h"
153 #include "messages/MDirUpdate.h"
154 #include "messages/MDiscover.h"
155 #include "messages/MDiscoverReply.h"
157 #include "messages/MMDSFragmentNotify.h"
158 #include "messages/MMDSFragmentNotifyAck.h"
160 #include "messages/MExportDirDiscover.h"
161 #include "messages/MExportDirDiscoverAck.h"
162 #include "messages/MExportDirCancel.h"
163 #include "messages/MExportDirPrep.h"
164 #include "messages/MExportDirPrepAck.h"
165 #include "messages/MExportDir.h"
166 #include "messages/MExportDirAck.h"
167 #include "messages/MExportDirNotify.h"
168 #include "messages/MExportDirNotifyAck.h"
169 #include "messages/MExportDirFinish.h"
171 #include "messages/MExportCaps.h"
172 #include "messages/MExportCapsAck.h"
173 #include "messages/MGatherCaps.h"
176 #include "messages/MDentryUnlink.h"
177 #include "messages/MDentryLink.h"
179 #include "messages/MHeartbeat.h"
181 #include "messages/MMDSTableRequest.h"
182 #include "messages/MMDSMetrics.h"
183 #include "messages/MMDSPing.h"
185 //#include "messages/MInodeUpdate.h"
186 #include "messages/MCacheExpire.h"
187 #include "messages/MInodeFileCaps.h"
189 #include "messages/MMgrBeacon.h"
190 #include "messages/MMgrMap.h"
191 #include "messages/MMgrDigest.h"
192 #include "messages/MMgrReport.h"
193 #include "messages/MMgrOpen.h"
194 #include "messages/MMgrUpdate.h"
195 #include "messages/MMgrClose.h"
196 #include "messages/MMgrConfigure.h"
197 #include "messages/MMonMgrReport.h"
198 #include "messages/MMgrCommand.h"
199 #include "messages/MMgrCommandReply.h"
200 #include "messages/MServiceMap.h"
202 #include "messages/MLock.h"
204 #include "messages/MWatchNotify.h"
205 #include "messages/MTimeCheck.h"
206 #include "messages/MTimeCheck2.h"
208 #include "common/config.h"
210 #include "messages/MOSDPGPush.h"
211 #include "messages/MOSDPGPushReply.h"
212 #include "messages/MOSDPGPull.h"
214 #include "messages/MOSDECSubOpWrite.h"
215 #include "messages/MOSDECSubOpWriteReply.h"
216 #include "messages/MOSDECSubOpRead.h"
217 #include "messages/MOSDECSubOpReadReply.h"
219 #include "messages/MOSDPGUpdateLogMissing.h"
220 #include "messages/MOSDPGUpdateLogMissingReply.h"
223 #include "Messenger.h"
226 #define DEBUGLVL 10 // debug level of output
228 #define dout_subsys ceph_subsys_ms
230 void Message::encode(uint64_t features
, int crcflags
, bool skip_header_crc
)
232 // encode and copy out of *m
233 if (empty_payload()) {
234 ceph_assert(middle
.length() == 0);
235 encode_payload(features
);
237 if (byte_throttler
) {
238 byte_throttler
->take(payload
.length() + middle
.length());
241 // if the encoder didn't specify past compatibility, we assume it
243 if (header
.compat_version
== 0)
244 header
.compat_version
= header
.version
;
246 if (crcflags
& MSG_CRC_HEADER
)
250 header
.front_len
= get_payload().length();
251 header
.middle_len
= get_middle().length();
252 header
.data_len
= get_data().length();
253 if (!skip_header_crc
&& (crcflags
& MSG_CRC_HEADER
))
256 footer
.flags
= CEPH_MSG_FOOTER_COMPLETE
;
258 if (crcflags
& MSG_CRC_DATA
) {
263 encode(get_header(), bl
);
265 // dump the old footer format
266 ceph_msg_footer_old old_footer
;
267 old_footer
.front_crc
= footer
.front_crc
;
268 old_footer
.middle_crc
= footer
.middle_crc
;
269 old_footer
.data_crc
= footer
.data_crc
;
270 old_footer
.flags
= footer
.flags
;
271 encode(old_footer
, bl
);
273 encode(get_payload(), bl
);
274 encode(get_middle(), bl
);
275 encode(get_data(), bl
);
277 // this is almost an exponential backoff, except because we count
278 // bits we tend to sample things we encode later, which should be
279 // more representative.
283 for (unsigned t
= i
; t
; bits
++)
288 snprintf(fn
, sizeof(fn
), ENCODE_STRINGIFY(ENCODE_DUMP
) "/%s__%d.%x",
289 abi::__cxa_demangle(typeid(*this).name(), 0, 0, &status
),
291 int fd
= ::open(fn
, O_WRONLY
|O_TRUNC
|O_CREAT
|O_CLOEXEC
|O_BINARY
, 0644);
299 footer
.flags
= (unsigned)footer
.flags
| CEPH_MSG_FOOTER_NOCRC
;
303 void Message::dump(ceph::Formatter
*f
) const
305 std::stringstream ss
;
307 f
->dump_string("summary", ss
.str());
310 Message
*decode_message(CephContext
*cct
,
312 ceph_msg_header
& header
,
313 ceph_msg_footer
& footer
,
314 ceph::bufferlist
& front
,
315 ceph::bufferlist
& middle
,
316 ceph::bufferlist
& data
,
317 Message::ConnectionRef conn
)
320 if (crcflags
& MSG_CRC_HEADER
) {
321 __u32 front_crc
= front
.crc32c(0);
322 __u32 middle_crc
= middle
.crc32c(0);
324 if (front_crc
!= footer
.front_crc
) {
326 ldout(cct
, 0) << "bad crc in front " << front_crc
<< " != exp " << footer
.front_crc
327 << " from " << conn
->get_peer_addr() << dendl
;
328 ldout(cct
, 20) << " ";
329 front
.hexdump(*_dout
);
334 if (middle_crc
!= footer
.middle_crc
) {
336 ldout(cct
, 0) << "bad crc in middle " << middle_crc
<< " != exp " << footer
.middle_crc
337 << " from " << conn
->get_peer_addr() << dendl
;
338 ldout(cct
, 20) << " ";
339 middle
.hexdump(*_dout
);
345 if (crcflags
& MSG_CRC_DATA
) {
346 if ((footer
.flags
& CEPH_MSG_FOOTER_NOCRC
) == 0) {
347 __u32 data_crc
= data
.crc32c(0);
348 if (data_crc
!= footer
.data_crc
) {
350 ldout(cct
, 0) << "bad crc in data " << data_crc
<< " != exp " << footer
.data_crc
351 << " from " << conn
->get_peer_addr() << dendl
;
352 ldout(cct
, 20) << " ";
353 data
.hexdump(*_dout
);
362 ceph::ref_t
<Message
> m
;
363 int type
= header
.type
;
366 // -- with payload --
368 using ceph::make_message
;
371 m
= make_message
<MPGStats
>();
374 m
= make_message
<MPGStatsAck
>();
377 case CEPH_MSG_STATFS
:
378 m
= make_message
<MStatfs
>();
380 case CEPH_MSG_STATFS_REPLY
:
381 m
= make_message
<MStatfsReply
>();
383 case MSG_GETPOOLSTATS
:
384 m
= make_message
<MGetPoolStats
>();
386 case MSG_GETPOOLSTATSREPLY
:
387 m
= make_message
<MGetPoolStatsReply
>();
389 case CEPH_MSG_POOLOP
:
390 m
= make_message
<MPoolOp
>();
392 case CEPH_MSG_POOLOP_REPLY
:
393 m
= make_message
<MPoolOpReply
>();
395 case MSG_MON_COMMAND
:
396 m
= make_message
<MMonCommand
>();
398 case MSG_MON_COMMAND_ACK
:
399 m
= make_message
<MMonCommandAck
>();
402 m
= make_message
<MMonPaxos
>();
405 m
= make_message
<MConfig
>();
408 m
= make_message
<MGetConfig
>();
411 m
= make_message
<MKVData
>();
415 m
= make_message
<MMonProbe
>();
418 m
= make_message
<MMonJoin
>();
420 case MSG_MON_ELECTION
:
421 m
= make_message
<MMonElection
>();
424 m
= make_message
<MMonSync
>();
427 m
= make_message
<MMonPing
>();
430 m
= make_message
<MMonScrub
>();
434 m
= make_message
<MLog
>();
437 m
= make_message
<MLogAck
>();
441 m
= make_message
<MPing
>();
444 m
= make_message
<MCommand
>();
446 case MSG_COMMAND_REPLY
:
447 m
= make_message
<MCommandReply
>();
449 case MSG_OSD_BACKFILL_RESERVE
:
450 m
= make_message
<MBackfillReserve
>();
452 case MSG_OSD_RECOVERY_RESERVE
:
453 m
= make_message
<MRecoveryReserve
>();
455 case MSG_OSD_FORCE_RECOVERY
:
456 m
= make_message
<MOSDForceRecovery
>();
460 m
= make_message
<MRoute
>();
463 m
= make_message
<MForward
>();
466 case CEPH_MSG_MON_MAP
:
467 m
= make_message
<MMonMap
>();
469 case CEPH_MSG_MON_GET_MAP
:
470 m
= make_message
<MMonGetMap
>();
472 case CEPH_MSG_MON_GET_OSDMAP
:
473 m
= make_message
<MMonGetOSDMap
>();
475 case MSG_MON_GET_PURGED_SNAPS
:
476 m
= make_message
<MMonGetPurgedSnaps
>();
478 case MSG_MON_GET_PURGED_SNAPS_REPLY
:
479 m
= make_message
<MMonGetPurgedSnapsReply
>();
481 case CEPH_MSG_MON_GET_VERSION
:
482 m
= make_message
<MMonGetVersion
>();
484 case CEPH_MSG_MON_GET_VERSION_REPLY
:
485 m
= make_message
<MMonGetVersionReply
>();
489 m
= make_message
<MOSDBoot
>();
492 m
= make_message
<MOSDAlive
>();
495 m
= make_message
<MOSDBeacon
>();
498 m
= make_message
<MOSDPGTemp
>();
500 case MSG_OSD_FAILURE
:
501 m
= make_message
<MOSDFailure
>();
503 case MSG_OSD_MARK_ME_DOWN
:
504 m
= make_message
<MOSDMarkMeDown
>();
506 case MSG_OSD_MARK_ME_DEAD
:
507 m
= make_message
<MOSDMarkMeDead
>();
510 m
= make_message
<MOSDFull
>();
513 m
= make_message
<MOSDPing
>();
515 case CEPH_MSG_OSD_OP
:
516 m
= make_message
<MOSDOp
>();
518 case CEPH_MSG_OSD_OPREPLY
:
519 m
= make_message
<MOSDOpReply
>();
522 m
= make_message
<MOSDRepOp
>();
524 case MSG_OSD_REPOPREPLY
:
525 m
= make_message
<MOSDRepOpReply
>();
527 case MSG_OSD_PG_CREATED
:
528 m
= make_message
<MOSDPGCreated
>();
530 case MSG_OSD_PG_UPDATE_LOG_MISSING
:
531 m
= make_message
<MOSDPGUpdateLogMissing
>();
533 case MSG_OSD_PG_UPDATE_LOG_MISSING_REPLY
:
534 m
= make_message
<MOSDPGUpdateLogMissingReply
>();
536 case CEPH_MSG_OSD_BACKOFF
:
537 m
= make_message
<MOSDBackoff
>();
540 case CEPH_MSG_OSD_MAP
:
541 m
= make_message
<MOSDMap
>();
544 case CEPH_MSG_WATCH_NOTIFY
:
545 m
= make_message
<MWatchNotify
>();
548 case MSG_OSD_PG_NOTIFY
:
549 m
= make_message
<MOSDPGNotify
>();
551 case MSG_OSD_PG_NOTIFY2
:
552 m
= make_message
<MOSDPGNotify2
>();
554 case MSG_OSD_PG_QUERY
:
555 m
= make_message
<MOSDPGQuery
>();
557 case MSG_OSD_PG_QUERY2
:
558 m
= make_message
<MOSDPGQuery2
>();
561 m
= make_message
<MOSDPGLog
>();
563 case MSG_OSD_PG_REMOVE
:
564 m
= make_message
<MOSDPGRemove
>();
566 case MSG_OSD_PG_INFO
:
567 m
= make_message
<MOSDPGInfo
>();
569 case MSG_OSD_PG_INFO2
:
570 m
= make_message
<MOSDPGInfo2
>();
572 case MSG_OSD_PG_CREATE
:
573 m
= make_message
<MOSDPGCreate
>();
575 case MSG_OSD_PG_CREATE2
:
576 m
= make_message
<MOSDPGCreate2
>();
578 case MSG_OSD_PG_TRIM
:
579 m
= make_message
<MOSDPGTrim
>();
581 case MSG_OSD_PG_LEASE
:
582 m
= make_message
<MOSDPGLease
>();
584 case MSG_OSD_PG_LEASE_ACK
:
585 m
= make_message
<MOSDPGLeaseAck
>();
589 m
= make_message
<MOSDScrub
>();
592 m
= make_message
<MOSDScrub2
>();
594 case MSG_OSD_SCRUB_RESERVE
:
595 m
= make_message
<MOSDScrubReserve
>();
597 case MSG_REMOVE_SNAPS
:
598 m
= make_message
<MRemoveSnaps
>();
600 case MSG_OSD_REP_SCRUB
:
601 m
= make_message
<MOSDRepScrub
>();
603 case MSG_OSD_REP_SCRUBMAP
:
604 m
= make_message
<MOSDRepScrubMap
>();
606 case MSG_OSD_PG_SCAN
:
607 m
= make_message
<MOSDPGScan
>();
609 case MSG_OSD_PG_BACKFILL
:
610 m
= make_message
<MOSDPGBackfill
>();
612 case MSG_OSD_PG_BACKFILL_REMOVE
:
613 m
= make_message
<MOSDPGBackfillRemove
>();
615 case MSG_OSD_PG_PUSH
:
616 m
= make_message
<MOSDPGPush
>();
618 case MSG_OSD_PG_PULL
:
619 m
= make_message
<MOSDPGPull
>();
621 case MSG_OSD_PG_PUSH_REPLY
:
622 m
= make_message
<MOSDPGPushReply
>();
624 case MSG_OSD_PG_RECOVERY_DELETE
:
625 m
= make_message
<MOSDPGRecoveryDelete
>();
627 case MSG_OSD_PG_RECOVERY_DELETE_REPLY
:
628 m
= make_message
<MOSDPGRecoveryDeleteReply
>();
630 case MSG_OSD_PG_READY_TO_MERGE
:
631 m
= make_message
<MOSDPGReadyToMerge
>();
633 case MSG_OSD_EC_WRITE
:
634 m
= make_message
<MOSDECSubOpWrite
>();
636 case MSG_OSD_EC_WRITE_REPLY
:
637 m
= make_message
<MOSDECSubOpWriteReply
>();
639 case MSG_OSD_EC_READ
:
640 m
= make_message
<MOSDECSubOpRead
>();
642 case MSG_OSD_EC_READ_REPLY
:
643 m
= make_message
<MOSDECSubOpReadReply
>();
647 m
= make_message
<MAuth
>();
649 case CEPH_MSG_AUTH_REPLY
:
650 m
= make_message
<MAuthReply
>();
653 case MSG_MON_GLOBAL_ID
:
654 m
= make_message
<MMonGlobalID
>();
656 case MSG_MON_USED_PENDING_KEYS
:
657 m
= make_message
<MMonUsedPendingKeys
>();
661 case CEPH_MSG_MON_SUBSCRIBE
:
662 m
= make_message
<MMonSubscribe
>();
664 case CEPH_MSG_MON_SUBSCRIBE_ACK
:
665 m
= make_message
<MMonSubscribeAck
>();
667 case CEPH_MSG_CLIENT_SESSION
:
668 m
= make_message
<MClientSession
>();
670 case CEPH_MSG_CLIENT_RECONNECT
:
671 m
= make_message
<MClientReconnect
>();
673 case CEPH_MSG_CLIENT_REQUEST
:
674 m
= make_message
<MClientRequest
>();
676 case CEPH_MSG_CLIENT_REQUEST_FORWARD
:
677 m
= make_message
<MClientRequestForward
>();
679 case CEPH_MSG_CLIENT_REPLY
:
680 m
= make_message
<MClientReply
>();
682 case CEPH_MSG_CLIENT_RECLAIM
:
683 m
= make_message
<MClientReclaim
>();
685 case CEPH_MSG_CLIENT_RECLAIM_REPLY
:
686 m
= make_message
<MClientReclaimReply
>();
688 case CEPH_MSG_CLIENT_CAPS
:
689 m
= make_message
<MClientCaps
>();
691 case CEPH_MSG_CLIENT_CAPRELEASE
:
692 m
= make_message
<MClientCapRelease
>();
694 case CEPH_MSG_CLIENT_LEASE
:
695 m
= make_message
<MClientLease
>();
697 case CEPH_MSG_CLIENT_SNAP
:
698 m
= make_message
<MClientSnap
>();
700 case CEPH_MSG_CLIENT_QUOTA
:
701 m
= make_message
<MClientQuota
>();
703 case CEPH_MSG_CLIENT_METRICS
:
704 m
= make_message
<MClientMetrics
>();
708 case MSG_MDS_PEER_REQUEST
:
709 m
= make_message
<MMDSPeerRequest
>();
712 case CEPH_MSG_MDS_MAP
:
713 m
= make_message
<MMDSMap
>();
715 case CEPH_MSG_FS_MAP
:
716 m
= make_message
<MFSMap
>();
718 case CEPH_MSG_FS_MAP_USER
:
719 m
= make_message
<MFSMapUser
>();
722 m
= make_message
<MMDSBeacon
>();
724 case MSG_MDS_OFFLOAD_TARGETS
:
725 m
= make_message
<MMDSLoadTargets
>();
727 case MSG_MDS_RESOLVE
:
728 m
= make_message
<MMDSResolve
>();
730 case MSG_MDS_RESOLVEACK
:
731 m
= make_message
<MMDSResolveAck
>();
733 case MSG_MDS_CACHEREJOIN
:
734 m
= make_message
<MMDSCacheRejoin
>();
737 case MSG_MDS_DIRUPDATE
:
738 m
= make_message
<MDirUpdate
>();
741 case MSG_MDS_DISCOVER
:
742 m
= make_message
<MDiscover
>();
744 case MSG_MDS_DISCOVERREPLY
:
745 m
= make_message
<MDiscoverReply
>();
748 case MSG_MDS_FINDINO
:
749 m
= make_message
<MMDSFindIno
>();
751 case MSG_MDS_FINDINOREPLY
:
752 m
= make_message
<MMDSFindInoReply
>();
755 case MSG_MDS_OPENINO
:
756 m
= make_message
<MMDSOpenIno
>();
758 case MSG_MDS_OPENINOREPLY
:
759 m
= make_message
<MMDSOpenInoReply
>();
762 case MSG_MDS_SNAPUPDATE
:
763 m
= make_message
<MMDSSnapUpdate
>();
766 case MSG_MDS_FRAGMENTNOTIFY
:
767 m
= make_message
<MMDSFragmentNotify
>();
770 case MSG_MDS_FRAGMENTNOTIFYACK
:
771 m
= make_message
<MMDSFragmentNotifyAck
>();
775 m
= make_message
<MMDSScrub
>();
778 case MSG_MDS_SCRUB_STATS
:
779 m
= make_message
<MMDSScrubStats
>();
782 case MSG_MDS_EXPORTDIRDISCOVER
:
783 m
= make_message
<MExportDirDiscover
>();
785 case MSG_MDS_EXPORTDIRDISCOVERACK
:
786 m
= make_message
<MExportDirDiscoverAck
>();
788 case MSG_MDS_EXPORTDIRCANCEL
:
789 m
= make_message
<MExportDirCancel
>();
792 case MSG_MDS_EXPORTDIR
:
793 m
= make_message
<MExportDir
>();
795 case MSG_MDS_EXPORTDIRACK
:
796 m
= make_message
<MExportDirAck
>();
798 case MSG_MDS_EXPORTDIRFINISH
:
799 m
= make_message
<MExportDirFinish
>();
802 case MSG_MDS_EXPORTDIRNOTIFY
:
803 m
= make_message
<MExportDirNotify
>();
806 case MSG_MDS_EXPORTDIRNOTIFYACK
:
807 m
= make_message
<MExportDirNotifyAck
>();
810 case MSG_MDS_EXPORTDIRPREP
:
811 m
= make_message
<MExportDirPrep
>();
814 case MSG_MDS_EXPORTDIRPREPACK
:
815 m
= make_message
<MExportDirPrepAck
>();
818 case MSG_MDS_EXPORTCAPS
:
819 m
= make_message
<MExportCaps
>();
821 case MSG_MDS_EXPORTCAPSACK
:
822 m
= make_message
<MExportCapsAck
>();
824 case MSG_MDS_GATHERCAPS
:
825 m
= make_message
<MGatherCaps
>();
829 case MSG_MDS_DENTRYUNLINK_ACK
:
830 m
= make_message
<MDentryUnlinkAck
>();
832 case MSG_MDS_DENTRYUNLINK
:
833 m
= make_message
<MDentryUnlink
>();
835 case MSG_MDS_DENTRYLINK
:
836 m
= make_message
<MDentryLink
>();
839 case MSG_MDS_HEARTBEAT
:
840 m
= make_message
<MHeartbeat
>();
843 case MSG_MDS_CACHEEXPIRE
:
844 m
= make_message
<MCacheExpire
>();
847 case MSG_MDS_TABLE_REQUEST
:
848 m
= make_message
<MMDSTableRequest
>();
851 /* case MSG_MDS_INODEUPDATE:
852 m = make_message<MInodeUpdate>();
856 case MSG_MDS_INODEFILECAPS
:
857 m
= make_message
<MInodeFileCaps
>();
861 m
= make_message
<MLock
>();
864 case MSG_MDS_METRICS
:
865 m
= make_message
<MMDSMetrics
>();
869 m
= make_message
<MMDSPing
>();
873 m
= make_message
<MMgrBeacon
>();
876 case MSG_MON_MGR_REPORT
:
877 m
= make_message
<MMonMgrReport
>();
880 case MSG_SERVICE_MAP
:
881 m
= make_message
<MServiceMap
>();
885 m
= make_message
<MMgrMap
>();
889 m
= make_message
<MMgrDigest
>();
892 case MSG_MGR_COMMAND
:
893 m
= make_message
<MMgrCommand
>();
896 case MSG_MGR_COMMAND_REPLY
:
897 m
= make_message
<MMgrCommandReply
>();
901 m
= make_message
<MMgrOpen
>();
905 m
= make_message
<MMgrUpdate
>();
909 m
= make_message
<MMgrClose
>();
913 m
= make_message
<MMgrReport
>();
916 case MSG_MGR_CONFIGURE
:
917 m
= make_message
<MMgrConfigure
>();
921 m
= make_message
<MTimeCheck
>();
924 m
= make_message
<MTimeCheck2
>();
928 m
= make_message
<MMonHealth
>();
931 case MSG_MON_HEALTH_CHECKS
:
932 m
= make_message
<MMonHealthChecks
>();
935 // -- simple messages without payload --
937 case CEPH_MSG_SHUTDOWN
:
938 m
= make_message
<MGenericMessage
>(type
);
943 ldout(cct
, 0) << "can't decode unknown message type " << type
<< " MSG_AUTH=" << CEPH_MSG_AUTH
<< dendl
;
944 if (cct
->_conf
->ms_die_on_bad_msg
)
952 // m->header.version, if non-zero, should be populated with the
953 // newest version of the encoding the code supports. If set, check
954 // it against compat_version.
955 if (m
->get_header().version
&&
956 m
->get_header().version
< header
.compat_version
) {
958 ldout(cct
, 0) << "will not decode message of type " << type
959 << " version " << header
.version
960 << " because compat_version " << header
.compat_version
961 << " > supported version " << m
->get_header().version
<< dendl
;
962 if (cct
->_conf
->ms_die_on_bad_msg
)
968 m
->set_connection(std::move(conn
));
969 m
->set_header(header
);
970 m
->set_footer(footer
);
971 m
->set_payload(front
);
972 m
->set_middle(middle
);
978 catch (const ceph::buffer::error
&e
) {
980 lderr(cct
) << "failed to decode message of type " << type
981 << " v" << header
.version
982 << ": " << e
.what() << dendl
;
983 ldout(cct
, ceph::dout::need_dynamic(
984 cct
->_conf
->ms_dump_corrupt_message_level
)) << "dump: \n";
985 m
->get_payload().hexdump(*_dout
);
987 if (cct
->_conf
->ms_die_on_bad_msg
)
997 void Message::encode_trace(ceph::bufferlist
&bl
, uint64_t features
) const
1000 auto p
= trace
.get_info();
1001 static const blkin_trace_info empty
= { 0, 0, 0 };
1008 void Message::decode_trace(ceph::bufferlist::const_iterator
&p
, bool create
)
1010 blkin_trace_info info
= {};
1017 const auto msgr
= connection
->get_messenger();
1018 const auto endpoint
= msgr
->get_trace_endpoint();
1019 if (info
.trace_id
) {
1020 trace
.init(get_type_name().data(), endpoint
, &info
, true);
1021 trace
.event("decoded trace");
1022 } else if (create
|| (msgr
->get_myname().is_osd() &&
1023 msgr
->cct
->_conf
->osd_blkin_trace_all
)) {
1024 // create a trace even if we didn't get one on the wire
1025 trace
.init(get_type_name().data(), endpoint
);
1026 trace
.event("created trace");
1028 trace
.keyval("tid", get_tid());
1029 trace
.keyval("entity type", get_source().type_str());
1030 trace
.keyval("entity num", get_source().num());
1035 // This routine is not used for ordinary messages, but only when encapsulating a message
1036 // for forwarding and routing. It's also used in a backward compatibility test, which only
1037 // effectively tests backward compability for those functions. To avoid backward compatibility
1038 // problems, we currently always encode and decode using the old footer format that doesn't
1039 // allow for message authentication. Eventually we should fix that. PLR
1041 void encode_message(Message
*msg
, uint64_t features
, ceph::bufferlist
& payload
)
1043 ceph_msg_footer_old old_footer
;
1044 msg
->encode(features
, MSG_CRC_ALL
);
1045 encode(msg
->get_header(), payload
);
1047 // Here's where we switch to the old footer format. PLR
1048 ceph_msg_footer footer
= msg
->get_footer();
1049 old_footer
.front_crc
= footer
.front_crc
;
1050 old_footer
.middle_crc
= footer
.middle_crc
;
1051 old_footer
.data_crc
= footer
.data_crc
;
1052 old_footer
.flags
= footer
.flags
;
1053 encode(old_footer
, payload
);
1056 encode(msg
->get_payload(), payload
);
1057 encode(msg
->get_middle(), payload
);
1058 encode(msg
->get_data(), payload
);
1061 // See above for somewhat bogus use of the old message footer. We switch to the current footer
1062 // after decoding the old one so the other form of decode_message() doesn't have to change.
1063 // We've slipped in a 0 signature at this point, so any signature checking after this will
1066 Message
*decode_message(CephContext
*cct
, int crcflags
, ceph::bufferlist::const_iterator
& p
)
1069 ceph_msg_footer_old fo
;
1071 ceph::bufferlist fr
, mi
, da
;
1074 f
.front_crc
= fo
.front_crc
;
1075 f
.middle_crc
= fo
.middle_crc
;
1076 f
.data_crc
= fo
.data_crc
;
1083 return decode_message(cct
, crcflags
, h
, f
, fr
, mi
, da
, nullptr);