]> git.proxmox.com Git - ceph.git/blame - ceph/src/msg/Message.cc
check in ceph 17.2.3 sources
[ceph.git] / ceph / src / msg / Message.cc
CommitLineData
7c673cae
FG
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3
4#ifdef ENCODE_DUMP
5# include <typeinfo>
6# include <cxxabi.h>
7#endif
8
9#include <iostream>
7c673cae
FG
10
11#include "include/types.h"
12
13#include "global/global_context.h"
14
15#include "Message.h"
16
17#include "messages/MPGStats.h"
18
19#include "messages/MGenericMessage.h"
20
21#include "messages/MPGStatsAck.h"
22
23#include "messages/MStatfs.h"
24#include "messages/MStatfsReply.h"
25
26#include "messages/MGetPoolStats.h"
27#include "messages/MGetPoolStatsReply.h"
28
29
30#include "messages/MPoolOp.h"
31#include "messages/MPoolOpReply.h"
32
33#include "messages/PaxosServiceMessage.h"
34#include "messages/MMonCommand.h"
35#include "messages/MMonCommandAck.h"
36#include "messages/MMonPaxos.h"
11fdf7f2
TL
37#include "messages/MConfig.h"
38#include "messages/MGetConfig.h"
f67539c2 39#include "messages/MKVData.h"
7c673cae
FG
40
41#include "messages/MMonProbe.h"
42#include "messages/MMonJoin.h"
43#include "messages/MMonElection.h"
44#include "messages/MMonSync.h"
f67539c2 45#include "messages/MMonPing.h"
7c673cae
FG
46#include "messages/MMonScrub.h"
47
48#include "messages/MLog.h"
49#include "messages/MLogAck.h"
50
51#include "messages/MPing.h"
52
53#include "messages/MCommand.h"
54#include "messages/MCommandReply.h"
55#include "messages/MBackfillReserve.h"
56#include "messages/MRecoveryReserve.h"
57
58#include "messages/MRoute.h"
59#include "messages/MForward.h"
60
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"
9f95a23c 67#include "messages/MOSDMarkMeDead.h"
7c673cae
FG
68#include "messages/MOSDFull.h"
69#include "messages/MOSDPing.h"
70#include "messages/MOSDOp.h"
71#include "messages/MOSDOpReply.h"
7c673cae
FG
72#include "messages/MOSDRepOp.h"
73#include "messages/MOSDRepOpReply.h"
74#include "messages/MOSDMap.h"
75#include "messages/MMonGetOSDMap.h"
9f95a23c
TL
76#include "messages/MMonGetPurgedSnaps.h"
77#include "messages/MMonGetPurgedSnapsReply.h"
7c673cae
FG
78
79#include "messages/MOSDPGCreated.h"
80#include "messages/MOSDPGNotify.h"
9f95a23c 81#include "messages/MOSDPGNotify2.h"
7c673cae 82#include "messages/MOSDPGQuery.h"
9f95a23c 83#include "messages/MOSDPGQuery2.h"
7c673cae
FG
84#include "messages/MOSDPGLog.h"
85#include "messages/MOSDPGRemove.h"
86#include "messages/MOSDPGInfo.h"
9f95a23c 87#include "messages/MOSDPGInfo2.h"
7c673cae 88#include "messages/MOSDPGCreate.h"
11fdf7f2 89#include "messages/MOSDPGCreate2.h"
7c673cae 90#include "messages/MOSDPGTrim.h"
9f95a23c
TL
91#include "messages/MOSDPGLease.h"
92#include "messages/MOSDPGLeaseAck.h"
7c673cae 93#include "messages/MOSDScrub.h"
11fdf7f2 94#include "messages/MOSDScrub2.h"
7c673cae
FG
95#include "messages/MOSDScrubReserve.h"
96#include "messages/MOSDRepScrub.h"
97#include "messages/MOSDRepScrubMap.h"
c07f9fc5 98#include "messages/MOSDForceRecovery.h"
7c673cae
FG
99#include "messages/MOSDPGScan.h"
100#include "messages/MOSDPGBackfill.h"
101#include "messages/MOSDBackoff.h"
102#include "messages/MOSDPGBackfillRemove.h"
c07f9fc5
FG
103#include "messages/MOSDPGRecoveryDelete.h"
104#include "messages/MOSDPGRecoveryDeleteReply.h"
11fdf7f2 105#include "messages/MOSDPGReadyToMerge.h"
7c673cae
FG
106
107#include "messages/MRemoveSnaps.h"
108
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"
224ce89b 114#include "messages/MMonHealthChecks.h"
7c673cae
FG
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/MClientSession.h"
121#include "messages/MClientReconnect.h"
122#include "messages/MClientRequest.h"
123#include "messages/MClientRequestForward.h"
124#include "messages/MClientReply.h"
11fdf7f2
TL
125#include "messages/MClientReclaim.h"
126#include "messages/MClientReclaimReply.h"
7c673cae
FG
127#include "messages/MClientCaps.h"
128#include "messages/MClientCapRelease.h"
129#include "messages/MClientLease.h"
130#include "messages/MClientSnap.h"
131#include "messages/MClientQuota.h"
f67539c2 132#include "messages/MClientMetrics.h"
7c673cae 133
f67539c2 134#include "messages/MMDSPeerRequest.h"
7c673cae
FG
135
136#include "messages/MMDSMap.h"
137#include "messages/MFSMap.h"
138#include "messages/MFSMapUser.h"
139#include "messages/MMDSBeacon.h"
140#include "messages/MMDSLoadTargets.h"
141#include "messages/MMDSResolve.h"
142#include "messages/MMDSResolveAck.h"
143#include "messages/MMDSCacheRejoin.h"
144#include "messages/MMDSFindIno.h"
145#include "messages/MMDSFindInoReply.h"
146#include "messages/MMDSOpenIno.h"
147#include "messages/MMDSOpenInoReply.h"
11fdf7f2 148#include "messages/MMDSSnapUpdate.h"
f67539c2
TL
149#include "messages/MMDSScrub.h"
150#include "messages/MMDSScrubStats.h"
7c673cae
FG
151
152#include "messages/MDirUpdate.h"
153#include "messages/MDiscover.h"
154#include "messages/MDiscoverReply.h"
155
156#include "messages/MMDSFragmentNotify.h"
a8e16298 157#include "messages/MMDSFragmentNotifyAck.h"
7c673cae
FG
158
159#include "messages/MExportDirDiscover.h"
160#include "messages/MExportDirDiscoverAck.h"
161#include "messages/MExportDirCancel.h"
162#include "messages/MExportDirPrep.h"
163#include "messages/MExportDirPrepAck.h"
164#include "messages/MExportDir.h"
165#include "messages/MExportDirAck.h"
166#include "messages/MExportDirNotify.h"
167#include "messages/MExportDirNotifyAck.h"
168#include "messages/MExportDirFinish.h"
169
170#include "messages/MExportCaps.h"
171#include "messages/MExportCapsAck.h"
172#include "messages/MGatherCaps.h"
173
174
175#include "messages/MDentryUnlink.h"
176#include "messages/MDentryLink.h"
177
178#include "messages/MHeartbeat.h"
179
180#include "messages/MMDSTableRequest.h"
f67539c2
TL
181#include "messages/MMDSMetrics.h"
182#include "messages/MMDSPing.h"
7c673cae
FG
183
184//#include "messages/MInodeUpdate.h"
185#include "messages/MCacheExpire.h"
186#include "messages/MInodeFileCaps.h"
187
188#include "messages/MMgrBeacon.h"
189#include "messages/MMgrMap.h"
190#include "messages/MMgrDigest.h"
191#include "messages/MMgrReport.h"
192#include "messages/MMgrOpen.h"
11fdf7f2 193#include "messages/MMgrClose.h"
7c673cae 194#include "messages/MMgrConfigure.h"
31f18b77 195#include "messages/MMonMgrReport.h"
9f95a23c
TL
196#include "messages/MMgrCommand.h"
197#include "messages/MMgrCommandReply.h"
224ce89b 198#include "messages/MServiceMap.h"
7c673cae
FG
199
200#include "messages/MLock.h"
201
202#include "messages/MWatchNotify.h"
203#include "messages/MTimeCheck.h"
11fdf7f2 204#include "messages/MTimeCheck2.h"
7c673cae
FG
205
206#include "common/config.h"
207
208#include "messages/MOSDPGPush.h"
209#include "messages/MOSDPGPushReply.h"
210#include "messages/MOSDPGPull.h"
211
212#include "messages/MOSDECSubOpWrite.h"
213#include "messages/MOSDECSubOpWriteReply.h"
214#include "messages/MOSDECSubOpRead.h"
215#include "messages/MOSDECSubOpReadReply.h"
216
217#include "messages/MOSDPGUpdateLogMissing.h"
218#include "messages/MOSDPGUpdateLogMissingReply.h"
219
f67539c2
TL
220#ifdef WITH_BLKIN
221#include "Messenger.h"
222#endif
223
7c673cae
FG
224#define DEBUGLVL 10 // debug level of output
225
226#define dout_subsys ceph_subsys_ms
227
9f95a23c 228void Message::encode(uint64_t features, int crcflags, bool skip_header_crc)
7c673cae
FG
229{
230 // encode and copy out of *m
231 if (empty_payload()) {
11fdf7f2 232 ceph_assert(middle.length() == 0);
7c673cae
FG
233 encode_payload(features);
234
235 if (byte_throttler) {
236 byte_throttler->take(payload.length() + middle.length());
237 }
238
239 // if the encoder didn't specify past compatibility, we assume it
240 // is incompatible.
241 if (header.compat_version == 0)
242 header.compat_version = header.version;
243 }
244 if (crcflags & MSG_CRC_HEADER)
245 calc_front_crc();
246
247 // update envelope
248 header.front_len = get_payload().length();
249 header.middle_len = get_middle().length();
250 header.data_len = get_data().length();
9f95a23c 251 if (!skip_header_crc && (crcflags & MSG_CRC_HEADER))
7c673cae
FG
252 calc_header_crc();
253
254 footer.flags = CEPH_MSG_FOOTER_COMPLETE;
255
256 if (crcflags & MSG_CRC_DATA) {
257 calc_data_crc();
258
259#ifdef ENCODE_DUMP
260 bufferlist bl;
11fdf7f2 261 encode(get_header(), bl);
7c673cae
FG
262
263 // dump the old footer format
264 ceph_msg_footer_old old_footer;
265 old_footer.front_crc = footer.front_crc;
266 old_footer.middle_crc = footer.middle_crc;
267 old_footer.data_crc = footer.data_crc;
268 old_footer.flags = footer.flags;
11fdf7f2 269 encode(old_footer, bl);
7c673cae 270
11fdf7f2
TL
271 encode(get_payload(), bl);
272 encode(get_middle(), bl);
273 encode(get_data(), bl);
7c673cae
FG
274
275 // this is almost an exponential backoff, except because we count
276 // bits we tend to sample things we encode later, which should be
277 // more representative.
278 static int i = 0;
279 i++;
280 int bits = 0;
281 for (unsigned t = i; t; bits++)
282 t &= t - 1;
283 if (bits <= 2) {
284 char fn[200];
285 int status;
286 snprintf(fn, sizeof(fn), ENCODE_STRINGIFY(ENCODE_DUMP) "/%s__%d.%x",
287 abi::__cxa_demangle(typeid(*this).name(), 0, 0, &status),
288 getpid(), i++);
f67539c2 289 int fd = ::open(fn, O_WRONLY|O_TRUNC|O_CREAT|O_CLOEXEC|O_BINARY, 0644);
7c673cae
FG
290 if (fd >= 0) {
291 bl.write_fd(fd);
292 ::close(fd);
293 }
294 }
295#endif
296 } else {
297 footer.flags = (unsigned)footer.flags | CEPH_MSG_FOOTER_NOCRC;
298 }
299}
300
f67539c2 301void Message::dump(ceph::Formatter *f) const
7c673cae 302{
f67539c2 303 std::stringstream ss;
7c673cae
FG
304 print(ss);
305 f->dump_string("summary", ss.str());
306}
307
9f95a23c
TL
308Message *decode_message(CephContext *cct,
309 int crcflags,
310 ceph_msg_header& header,
311 ceph_msg_footer& footer,
312 ceph::bufferlist& front,
313 ceph::bufferlist& middle,
314 ceph::bufferlist& data,
315 Message::ConnectionRef conn)
7c673cae
FG
316{
317 // verify crc
318 if (crcflags & MSG_CRC_HEADER) {
319 __u32 front_crc = front.crc32c(0);
320 __u32 middle_crc = middle.crc32c(0);
321
322 if (front_crc != footer.front_crc) {
323 if (cct) {
81eedcae
TL
324 ldout(cct, 0) << "bad crc in front " << front_crc << " != exp " << footer.front_crc
325 << " from " << conn->get_peer_addr() << dendl;
7c673cae
FG
326 ldout(cct, 20) << " ";
327 front.hexdump(*_dout);
328 *_dout << dendl;
329 }
330 return 0;
331 }
332 if (middle_crc != footer.middle_crc) {
333 if (cct) {
81eedcae
TL
334 ldout(cct, 0) << "bad crc in middle " << middle_crc << " != exp " << footer.middle_crc
335 << " from " << conn->get_peer_addr() << dendl;
7c673cae
FG
336 ldout(cct, 20) << " ";
337 middle.hexdump(*_dout);
338 *_dout << dendl;
339 }
340 return 0;
341 }
342 }
343 if (crcflags & MSG_CRC_DATA) {
344 if ((footer.flags & CEPH_MSG_FOOTER_NOCRC) == 0) {
345 __u32 data_crc = data.crc32c(0);
346 if (data_crc != footer.data_crc) {
347 if (cct) {
81eedcae
TL
348 ldout(cct, 0) << "bad crc in data " << data_crc << " != exp " << footer.data_crc
349 << " from " << conn->get_peer_addr() << dendl;
7c673cae
FG
350 ldout(cct, 20) << " ";
351 data.hexdump(*_dout);
352 *_dout << dendl;
353 }
354 return 0;
355 }
356 }
357 }
358
359 // make message
f67539c2 360 ceph::ref_t<Message> m;
7c673cae
FG
361 int type = header.type;
362 switch (type) {
363
364 // -- with payload --
365
f67539c2
TL
366 using ceph::make_message;
367
7c673cae 368 case MSG_PGSTATS:
9f95a23c 369 m = make_message<MPGStats>();
7c673cae
FG
370 break;
371 case MSG_PGSTATSACK:
9f95a23c 372 m = make_message<MPGStatsAck>();
7c673cae
FG
373 break;
374
375 case CEPH_MSG_STATFS:
9f95a23c 376 m = make_message<MStatfs>();
7c673cae
FG
377 break;
378 case CEPH_MSG_STATFS_REPLY:
9f95a23c 379 m = make_message<MStatfsReply>();
7c673cae
FG
380 break;
381 case MSG_GETPOOLSTATS:
9f95a23c 382 m = make_message<MGetPoolStats>();
7c673cae
FG
383 break;
384 case MSG_GETPOOLSTATSREPLY:
9f95a23c 385 m = make_message<MGetPoolStatsReply>();
7c673cae
FG
386 break;
387 case CEPH_MSG_POOLOP:
9f95a23c 388 m = make_message<MPoolOp>();
7c673cae
FG
389 break;
390 case CEPH_MSG_POOLOP_REPLY:
9f95a23c 391 m = make_message<MPoolOpReply>();
7c673cae
FG
392 break;
393 case MSG_MON_COMMAND:
9f95a23c 394 m = make_message<MMonCommand>();
7c673cae
FG
395 break;
396 case MSG_MON_COMMAND_ACK:
9f95a23c 397 m = make_message<MMonCommandAck>();
7c673cae
FG
398 break;
399 case MSG_MON_PAXOS:
9f95a23c 400 m = make_message<MMonPaxos>();
11fdf7f2
TL
401 break;
402 case MSG_CONFIG:
9f95a23c 403 m = make_message<MConfig>();
11fdf7f2
TL
404 break;
405 case MSG_GET_CONFIG:
9f95a23c 406 m = make_message<MGetConfig>();
7c673cae 407 break;
f67539c2
TL
408 case MSG_KV_DATA:
409 m = make_message<MKVData>();
410 break;
7c673cae
FG
411
412 case MSG_MON_PROBE:
9f95a23c 413 m = make_message<MMonProbe>();
7c673cae
FG
414 break;
415 case MSG_MON_JOIN:
9f95a23c 416 m = make_message<MMonJoin>();
7c673cae
FG
417 break;
418 case MSG_MON_ELECTION:
9f95a23c 419 m = make_message<MMonElection>();
7c673cae
FG
420 break;
421 case MSG_MON_SYNC:
9f95a23c 422 m = make_message<MMonSync>();
7c673cae 423 break;
f67539c2
TL
424 case MSG_MON_PING:
425 m = make_message<MMonPing>();
426 break;
7c673cae 427 case MSG_MON_SCRUB:
9f95a23c 428 m = make_message<MMonScrub>();
7c673cae
FG
429 break;
430
431 case MSG_LOG:
9f95a23c 432 m = make_message<MLog>();
7c673cae
FG
433 break;
434 case MSG_LOGACK:
9f95a23c 435 m = make_message<MLogAck>();
7c673cae
FG
436 break;
437
438 case CEPH_MSG_PING:
9f95a23c 439 m = make_message<MPing>();
7c673cae
FG
440 break;
441 case MSG_COMMAND:
9f95a23c 442 m = make_message<MCommand>();
7c673cae
FG
443 break;
444 case MSG_COMMAND_REPLY:
9f95a23c 445 m = make_message<MCommandReply>();
7c673cae
FG
446 break;
447 case MSG_OSD_BACKFILL_RESERVE:
9f95a23c 448 m = make_message<MBackfillReserve>();
7c673cae
FG
449 break;
450 case MSG_OSD_RECOVERY_RESERVE:
9f95a23c 451 m = make_message<MRecoveryReserve>();
7c673cae 452 break;
c07f9fc5 453 case MSG_OSD_FORCE_RECOVERY:
9f95a23c 454 m = make_message<MOSDForceRecovery>();
c07f9fc5 455 break;
7c673cae
FG
456
457 case MSG_ROUTE:
9f95a23c 458 m = make_message<MRoute>();
7c673cae
FG
459 break;
460 case MSG_FORWARD:
9f95a23c 461 m = make_message<MForward>();
7c673cae
FG
462 break;
463
464 case CEPH_MSG_MON_MAP:
9f95a23c 465 m = make_message<MMonMap>();
7c673cae
FG
466 break;
467 case CEPH_MSG_MON_GET_MAP:
9f95a23c 468 m = make_message<MMonGetMap>();
7c673cae
FG
469 break;
470 case CEPH_MSG_MON_GET_OSDMAP:
9f95a23c
TL
471 m = make_message<MMonGetOSDMap>();
472 break;
473 case MSG_MON_GET_PURGED_SNAPS:
474 m = make_message<MMonGetPurgedSnaps>();
475 break;
476 case MSG_MON_GET_PURGED_SNAPS_REPLY:
477 m = make_message<MMonGetPurgedSnapsReply>();
7c673cae
FG
478 break;
479 case CEPH_MSG_MON_GET_VERSION:
9f95a23c 480 m = make_message<MMonGetVersion>();
7c673cae
FG
481 break;
482 case CEPH_MSG_MON_GET_VERSION_REPLY:
9f95a23c 483 m = make_message<MMonGetVersionReply>();
7c673cae 484 break;
7c673cae
FG
485
486 case MSG_OSD_BOOT:
9f95a23c 487 m = make_message<MOSDBoot>();
7c673cae
FG
488 break;
489 case MSG_OSD_ALIVE:
9f95a23c 490 m = make_message<MOSDAlive>();
7c673cae
FG
491 break;
492 case MSG_OSD_BEACON:
9f95a23c 493 m = make_message<MOSDBeacon>();
7c673cae
FG
494 break;
495 case MSG_OSD_PGTEMP:
9f95a23c 496 m = make_message<MOSDPGTemp>();
7c673cae
FG
497 break;
498 case MSG_OSD_FAILURE:
9f95a23c 499 m = make_message<MOSDFailure>();
7c673cae
FG
500 break;
501 case MSG_OSD_MARK_ME_DOWN:
9f95a23c
TL
502 m = make_message<MOSDMarkMeDown>();
503 break;
504 case MSG_OSD_MARK_ME_DEAD:
505 m = make_message<MOSDMarkMeDead>();
7c673cae
FG
506 break;
507 case MSG_OSD_FULL:
9f95a23c 508 m = make_message<MOSDFull>();
7c673cae
FG
509 break;
510 case MSG_OSD_PING:
9f95a23c 511 m = make_message<MOSDPing>();
7c673cae
FG
512 break;
513 case CEPH_MSG_OSD_OP:
9f95a23c 514 m = make_message<MOSDOp>();
7c673cae
FG
515 break;
516 case CEPH_MSG_OSD_OPREPLY:
9f95a23c 517 m = make_message<MOSDOpReply>();
7c673cae
FG
518 break;
519 case MSG_OSD_REPOP:
9f95a23c 520 m = make_message<MOSDRepOp>();
7c673cae
FG
521 break;
522 case MSG_OSD_REPOPREPLY:
9f95a23c 523 m = make_message<MOSDRepOpReply>();
7c673cae
FG
524 break;
525 case MSG_OSD_PG_CREATED:
9f95a23c 526 m = make_message<MOSDPGCreated>();
7c673cae
FG
527 break;
528 case MSG_OSD_PG_UPDATE_LOG_MISSING:
9f95a23c 529 m = make_message<MOSDPGUpdateLogMissing>();
7c673cae
FG
530 break;
531 case MSG_OSD_PG_UPDATE_LOG_MISSING_REPLY:
9f95a23c 532 m = make_message<MOSDPGUpdateLogMissingReply>();
7c673cae
FG
533 break;
534 case CEPH_MSG_OSD_BACKOFF:
9f95a23c 535 m = make_message<MOSDBackoff>();
7c673cae
FG
536 break;
537
538 case CEPH_MSG_OSD_MAP:
9f95a23c 539 m = make_message<MOSDMap>();
7c673cae
FG
540 break;
541
542 case CEPH_MSG_WATCH_NOTIFY:
9f95a23c 543 m = make_message<MWatchNotify>();
7c673cae
FG
544 break;
545
546 case MSG_OSD_PG_NOTIFY:
9f95a23c
TL
547 m = make_message<MOSDPGNotify>();
548 break;
549 case MSG_OSD_PG_NOTIFY2:
550 m = make_message<MOSDPGNotify2>();
7c673cae
FG
551 break;
552 case MSG_OSD_PG_QUERY:
9f95a23c
TL
553 m = make_message<MOSDPGQuery>();
554 break;
555 case MSG_OSD_PG_QUERY2:
556 m = make_message<MOSDPGQuery2>();
7c673cae
FG
557 break;
558 case MSG_OSD_PG_LOG:
9f95a23c 559 m = make_message<MOSDPGLog>();
7c673cae
FG
560 break;
561 case MSG_OSD_PG_REMOVE:
9f95a23c 562 m = make_message<MOSDPGRemove>();
7c673cae
FG
563 break;
564 case MSG_OSD_PG_INFO:
9f95a23c
TL
565 m = make_message<MOSDPGInfo>();
566 break;
567 case MSG_OSD_PG_INFO2:
568 m = make_message<MOSDPGInfo2>();
7c673cae
FG
569 break;
570 case MSG_OSD_PG_CREATE:
9f95a23c 571 m = make_message<MOSDPGCreate>();
11fdf7f2
TL
572 break;
573 case MSG_OSD_PG_CREATE2:
9f95a23c 574 m = make_message<MOSDPGCreate2>();
7c673cae
FG
575 break;
576 case MSG_OSD_PG_TRIM:
9f95a23c
TL
577 m = make_message<MOSDPGTrim>();
578 break;
579 case MSG_OSD_PG_LEASE:
580 m = make_message<MOSDPGLease>();
581 break;
582 case MSG_OSD_PG_LEASE_ACK:
583 m = make_message<MOSDPGLeaseAck>();
7c673cae
FG
584 break;
585
586 case MSG_OSD_SCRUB:
9f95a23c 587 m = make_message<MOSDScrub>();
11fdf7f2
TL
588 break;
589 case MSG_OSD_SCRUB2:
9f95a23c 590 m = make_message<MOSDScrub2>();
7c673cae
FG
591 break;
592 case MSG_OSD_SCRUB_RESERVE:
9f95a23c 593 m = make_message<MOSDScrubReserve>();
7c673cae
FG
594 break;
595 case MSG_REMOVE_SNAPS:
9f95a23c 596 m = make_message<MRemoveSnaps>();
7c673cae
FG
597 break;
598 case MSG_OSD_REP_SCRUB:
9f95a23c 599 m = make_message<MOSDRepScrub>();
7c673cae
FG
600 break;
601 case MSG_OSD_REP_SCRUBMAP:
9f95a23c 602 m = make_message<MOSDRepScrubMap>();
7c673cae
FG
603 break;
604 case MSG_OSD_PG_SCAN:
9f95a23c 605 m = make_message<MOSDPGScan>();
7c673cae
FG
606 break;
607 case MSG_OSD_PG_BACKFILL:
9f95a23c 608 m = make_message<MOSDPGBackfill>();
7c673cae
FG
609 break;
610 case MSG_OSD_PG_BACKFILL_REMOVE:
9f95a23c 611 m = make_message<MOSDPGBackfillRemove>();
7c673cae
FG
612 break;
613 case MSG_OSD_PG_PUSH:
9f95a23c 614 m = make_message<MOSDPGPush>();
7c673cae
FG
615 break;
616 case MSG_OSD_PG_PULL:
9f95a23c 617 m = make_message<MOSDPGPull>();
7c673cae
FG
618 break;
619 case MSG_OSD_PG_PUSH_REPLY:
9f95a23c 620 m = make_message<MOSDPGPushReply>();
7c673cae 621 break;
c07f9fc5 622 case MSG_OSD_PG_RECOVERY_DELETE:
9f95a23c 623 m = make_message<MOSDPGRecoveryDelete>();
c07f9fc5
FG
624 break;
625 case MSG_OSD_PG_RECOVERY_DELETE_REPLY:
9f95a23c 626 m = make_message<MOSDPGRecoveryDeleteReply>();
11fdf7f2
TL
627 break;
628 case MSG_OSD_PG_READY_TO_MERGE:
9f95a23c 629 m = make_message<MOSDPGReadyToMerge>();
c07f9fc5 630 break;
7c673cae 631 case MSG_OSD_EC_WRITE:
9f95a23c 632 m = make_message<MOSDECSubOpWrite>();
7c673cae
FG
633 break;
634 case MSG_OSD_EC_WRITE_REPLY:
9f95a23c 635 m = make_message<MOSDECSubOpWriteReply>();
7c673cae
FG
636 break;
637 case MSG_OSD_EC_READ:
9f95a23c 638 m = make_message<MOSDECSubOpRead>();
7c673cae
FG
639 break;
640 case MSG_OSD_EC_READ_REPLY:
9f95a23c 641 m = make_message<MOSDECSubOpReadReply>();
7c673cae
FG
642 break;
643 // auth
644 case CEPH_MSG_AUTH:
9f95a23c 645 m = make_message<MAuth>();
7c673cae
FG
646 break;
647 case CEPH_MSG_AUTH_REPLY:
9f95a23c 648 m = make_message<MAuthReply>();
7c673cae
FG
649 break;
650
651 case MSG_MON_GLOBAL_ID:
9f95a23c 652 m = make_message<MMonGlobalID>();
7c673cae
FG
653 break;
654
655 // clients
656 case CEPH_MSG_MON_SUBSCRIBE:
9f95a23c 657 m = make_message<MMonSubscribe>();
7c673cae
FG
658 break;
659 case CEPH_MSG_MON_SUBSCRIBE_ACK:
9f95a23c 660 m = make_message<MMonSubscribeAck>();
7c673cae
FG
661 break;
662 case CEPH_MSG_CLIENT_SESSION:
9f95a23c 663 m = make_message<MClientSession>();
7c673cae
FG
664 break;
665 case CEPH_MSG_CLIENT_RECONNECT:
9f95a23c 666 m = make_message<MClientReconnect>();
7c673cae
FG
667 break;
668 case CEPH_MSG_CLIENT_REQUEST:
9f95a23c 669 m = make_message<MClientRequest>();
7c673cae
FG
670 break;
671 case CEPH_MSG_CLIENT_REQUEST_FORWARD:
9f95a23c 672 m = make_message<MClientRequestForward>();
7c673cae
FG
673 break;
674 case CEPH_MSG_CLIENT_REPLY:
9f95a23c 675 m = make_message<MClientReply>();
11fdf7f2
TL
676 break;
677 case CEPH_MSG_CLIENT_RECLAIM:
9f95a23c 678 m = make_message<MClientReclaim>();
11fdf7f2
TL
679 break;
680 case CEPH_MSG_CLIENT_RECLAIM_REPLY:
9f95a23c 681 m = make_message<MClientReclaimReply>();
7c673cae
FG
682 break;
683 case CEPH_MSG_CLIENT_CAPS:
9f95a23c 684 m = make_message<MClientCaps>();
7c673cae
FG
685 break;
686 case CEPH_MSG_CLIENT_CAPRELEASE:
9f95a23c 687 m = make_message<MClientCapRelease>();
7c673cae
FG
688 break;
689 case CEPH_MSG_CLIENT_LEASE:
9f95a23c 690 m = make_message<MClientLease>();
7c673cae
FG
691 break;
692 case CEPH_MSG_CLIENT_SNAP:
9f95a23c 693 m = make_message<MClientSnap>();
7c673cae
FG
694 break;
695 case CEPH_MSG_CLIENT_QUOTA:
9f95a23c 696 m = make_message<MClientQuota>();
7c673cae 697 break;
f67539c2
TL
698 case CEPH_MSG_CLIENT_METRICS:
699 m = make_message<MClientMetrics>();
700 break;
7c673cae
FG
701
702 // mds
f67539c2
TL
703 case MSG_MDS_PEER_REQUEST:
704 m = make_message<MMDSPeerRequest>();
7c673cae
FG
705 break;
706
707 case CEPH_MSG_MDS_MAP:
9f95a23c 708 m = make_message<MMDSMap>();
7c673cae
FG
709 break;
710 case CEPH_MSG_FS_MAP:
9f95a23c 711 m = make_message<MFSMap>();
7c673cae
FG
712 break;
713 case CEPH_MSG_FS_MAP_USER:
9f95a23c 714 m = make_message<MFSMapUser>();
7c673cae
FG
715 break;
716 case MSG_MDS_BEACON:
9f95a23c 717 m = make_message<MMDSBeacon>();
7c673cae
FG
718 break;
719 case MSG_MDS_OFFLOAD_TARGETS:
9f95a23c 720 m = make_message<MMDSLoadTargets>();
7c673cae
FG
721 break;
722 case MSG_MDS_RESOLVE:
9f95a23c 723 m = make_message<MMDSResolve>();
7c673cae
FG
724 break;
725 case MSG_MDS_RESOLVEACK:
9f95a23c 726 m = make_message<MMDSResolveAck>();
7c673cae
FG
727 break;
728 case MSG_MDS_CACHEREJOIN:
9f95a23c 729 m = make_message<MMDSCacheRejoin>();
7c673cae
FG
730 break;
731
732 case MSG_MDS_DIRUPDATE:
9f95a23c 733 m = make_message<MDirUpdate>();
7c673cae
FG
734 break;
735
736 case MSG_MDS_DISCOVER:
9f95a23c 737 m = make_message<MDiscover>();
7c673cae
FG
738 break;
739 case MSG_MDS_DISCOVERREPLY:
9f95a23c 740 m = make_message<MDiscoverReply>();
7c673cae
FG
741 break;
742
743 case MSG_MDS_FINDINO:
9f95a23c 744 m = make_message<MMDSFindIno>();
7c673cae
FG
745 break;
746 case MSG_MDS_FINDINOREPLY:
9f95a23c 747 m = make_message<MMDSFindInoReply>();
7c673cae
FG
748 break;
749
750 case MSG_MDS_OPENINO:
9f95a23c 751 m = make_message<MMDSOpenIno>();
7c673cae
FG
752 break;
753 case MSG_MDS_OPENINOREPLY:
9f95a23c 754 m = make_message<MMDSOpenInoReply>();
11fdf7f2
TL
755 break;
756
757 case MSG_MDS_SNAPUPDATE:
9f95a23c 758 m = make_message<MMDSSnapUpdate>();
7c673cae
FG
759 break;
760
761 case MSG_MDS_FRAGMENTNOTIFY:
9f95a23c 762 m = make_message<MMDSFragmentNotify>();
7c673cae
FG
763 break;
764
a8e16298 765 case MSG_MDS_FRAGMENTNOTIFYACK:
9f95a23c 766 m = make_message<MMDSFragmentNotifyAck>();
a8e16298
TL
767 break;
768
f67539c2
TL
769 case MSG_MDS_SCRUB:
770 m = make_message<MMDSScrub>();
771 break;
772
773 case MSG_MDS_SCRUB_STATS:
774 m = make_message<MMDSScrubStats>();
775 break;
776
7c673cae 777 case MSG_MDS_EXPORTDIRDISCOVER:
9f95a23c 778 m = make_message<MExportDirDiscover>();
7c673cae
FG
779 break;
780 case MSG_MDS_EXPORTDIRDISCOVERACK:
9f95a23c 781 m = make_message<MExportDirDiscoverAck>();
7c673cae
FG
782 break;
783 case MSG_MDS_EXPORTDIRCANCEL:
9f95a23c 784 m = make_message<MExportDirCancel>();
7c673cae
FG
785 break;
786
787 case MSG_MDS_EXPORTDIR:
9f95a23c 788 m = make_message<MExportDir>();
7c673cae
FG
789 break;
790 case MSG_MDS_EXPORTDIRACK:
9f95a23c 791 m = make_message<MExportDirAck>();
7c673cae
FG
792 break;
793 case MSG_MDS_EXPORTDIRFINISH:
9f95a23c 794 m = make_message<MExportDirFinish>();
7c673cae
FG
795 break;
796
797 case MSG_MDS_EXPORTDIRNOTIFY:
9f95a23c 798 m = make_message<MExportDirNotify>();
7c673cae
FG
799 break;
800
801 case MSG_MDS_EXPORTDIRNOTIFYACK:
9f95a23c 802 m = make_message<MExportDirNotifyAck>();
7c673cae
FG
803 break;
804
805 case MSG_MDS_EXPORTDIRPREP:
9f95a23c 806 m = make_message<MExportDirPrep>();
7c673cae
FG
807 break;
808
809 case MSG_MDS_EXPORTDIRPREPACK:
9f95a23c 810 m = make_message<MExportDirPrepAck>();
7c673cae
FG
811 break;
812
813 case MSG_MDS_EXPORTCAPS:
9f95a23c 814 m = make_message<MExportCaps>();
7c673cae
FG
815 break;
816 case MSG_MDS_EXPORTCAPSACK:
9f95a23c 817 m = make_message<MExportCapsAck>();
7c673cae
FG
818 break;
819 case MSG_MDS_GATHERCAPS:
9f95a23c 820 m = make_message<MGatherCaps>();
7c673cae
FG
821 break;
822
823
824 case MSG_MDS_DENTRYUNLINK:
9f95a23c 825 m = make_message<MDentryUnlink>();
7c673cae
FG
826 break;
827 case MSG_MDS_DENTRYLINK:
9f95a23c 828 m = make_message<MDentryLink>();
7c673cae
FG
829 break;
830
831 case MSG_MDS_HEARTBEAT:
9f95a23c 832 m = make_message<MHeartbeat>();
7c673cae
FG
833 break;
834
835 case MSG_MDS_CACHEEXPIRE:
9f95a23c 836 m = make_message<MCacheExpire>();
7c673cae
FG
837 break;
838
839 case MSG_MDS_TABLE_REQUEST:
9f95a23c 840 m = make_message<MMDSTableRequest>();
7c673cae
FG
841 break;
842
843 /* case MSG_MDS_INODEUPDATE:
9f95a23c 844 m = make_message<MInodeUpdate>();
7c673cae
FG
845 break;
846 */
847
848 case MSG_MDS_INODEFILECAPS:
9f95a23c 849 m = make_message<MInodeFileCaps>();
7c673cae
FG
850 break;
851
852 case MSG_MDS_LOCK:
9f95a23c 853 m = make_message<MLock>();
7c673cae
FG
854 break;
855
f67539c2
TL
856 case MSG_MDS_METRICS:
857 m = make_message<MMDSMetrics>();
858 break;
859
860 case MSG_MDS_PING:
861 m = make_message<MMDSPing>();
862 break;
863
7c673cae 864 case MSG_MGR_BEACON:
9f95a23c 865 m = make_message<MMgrBeacon>();
7c673cae
FG
866 break;
867
31f18b77 868 case MSG_MON_MGR_REPORT:
9f95a23c 869 m = make_message<MMonMgrReport>();
31f18b77
FG
870 break;
871
224ce89b 872 case MSG_SERVICE_MAP:
9f95a23c 873 m = make_message<MServiceMap>();
224ce89b
WB
874 break;
875
7c673cae 876 case MSG_MGR_MAP:
9f95a23c 877 m = make_message<MMgrMap>();
7c673cae
FG
878 break;
879
880 case MSG_MGR_DIGEST:
9f95a23c
TL
881 m = make_message<MMgrDigest>();
882 break;
883
884 case MSG_MGR_COMMAND:
885 m = make_message<MMgrCommand>();
886 break;
887
888 case MSG_MGR_COMMAND_REPLY:
889 m = make_message<MMgrCommandReply>();
7c673cae
FG
890 break;
891
892 case MSG_MGR_OPEN:
9f95a23c 893 m = make_message<MMgrOpen>();
11fdf7f2
TL
894 break;
895
896 case MSG_MGR_CLOSE:
9f95a23c 897 m = make_message<MMgrClose>();
7c673cae
FG
898 break;
899
900 case MSG_MGR_REPORT:
9f95a23c 901 m = make_message<MMgrReport>();
7c673cae
FG
902 break;
903
904 case MSG_MGR_CONFIGURE:
9f95a23c 905 m = make_message<MMgrConfigure>();
7c673cae
FG
906 break;
907
908 case MSG_TIMECHECK:
9f95a23c 909 m = make_message<MTimeCheck>();
11fdf7f2
TL
910 break;
911 case MSG_TIMECHECK2:
9f95a23c 912 m = make_message<MTimeCheck2>();
7c673cae
FG
913 break;
914
915 case MSG_MON_HEALTH:
9f95a23c 916 m = make_message<MMonHealth>();
7c673cae 917 break;
224ce89b
WB
918
919 case MSG_MON_HEALTH_CHECKS:
9f95a23c 920 m = make_message<MMonHealthChecks>();
224ce89b
WB
921 break;
922
7c673cae
FG
923 // -- simple messages without payload --
924
925 case CEPH_MSG_SHUTDOWN:
9f95a23c 926 m = make_message<MGenericMessage>(type);
7c673cae
FG
927 break;
928
929 default:
930 if (cct) {
931 ldout(cct, 0) << "can't decode unknown message type " << type << " MSG_AUTH=" << CEPH_MSG_AUTH << dendl;
932 if (cct->_conf->ms_die_on_bad_msg)
933 ceph_abort();
934 }
935 return 0;
936 }
937
938 m->set_cct(cct);
939
940 // m->header.version, if non-zero, should be populated with the
941 // newest version of the encoding the code supports. If set, check
942 // it against compat_version.
943 if (m->get_header().version &&
944 m->get_header().version < header.compat_version) {
945 if (cct) {
946 ldout(cct, 0) << "will not decode message of type " << type
947 << " version " << header.version
948 << " because compat_version " << header.compat_version
949 << " > supported version " << m->get_header().version << dendl;
950 if (cct->_conf->ms_die_on_bad_msg)
951 ceph_abort();
952 }
7c673cae
FG
953 return 0;
954 }
955
9f95a23c 956 m->set_connection(std::move(conn));
7c673cae
FG
957 m->set_header(header);
958 m->set_footer(footer);
959 m->set_payload(front);
960 m->set_middle(middle);
961 m->set_data(data);
962
963 try {
964 m->decode_payload();
965 }
f67539c2 966 catch (const ceph::buffer::error &e) {
7c673cae
FG
967 if (cct) {
968 lderr(cct) << "failed to decode message of type " << type
969 << " v" << header.version
970 << ": " << e.what() << dendl;
11fdf7f2
TL
971 ldout(cct, ceph::dout::need_dynamic(
972 cct->_conf->ms_dump_corrupt_message_level)) << "dump: \n";
7c673cae
FG
973 m->get_payload().hexdump(*_dout);
974 *_dout << dendl;
975 if (cct->_conf->ms_die_on_bad_msg)
976 ceph_abort();
977 }
7c673cae
FG
978 return 0;
979 }
980
981 // done!
11fdf7f2 982 return m.detach();
7c673cae
FG
983}
984
f67539c2 985void Message::encode_trace(ceph::bufferlist &bl, uint64_t features) const
7c673cae 986{
11fdf7f2 987 using ceph::encode;
7c673cae
FG
988 auto p = trace.get_info();
989 static const blkin_trace_info empty = { 0, 0, 0 };
990 if (!p) {
991 p = &empty;
992 }
11fdf7f2 993 encode(*p, bl);
7c673cae
FG
994}
995
f67539c2 996void Message::decode_trace(ceph::bufferlist::const_iterator &p, bool create)
7c673cae
FG
997{
998 blkin_trace_info info = {};
11fdf7f2 999 decode(info, p);
7c673cae
FG
1000
1001#ifdef WITH_BLKIN
1002 if (!connection)
1003 return;
1004
1005 const auto msgr = connection->get_messenger();
1006 const auto endpoint = msgr->get_trace_endpoint();
1007 if (info.trace_id) {
f67539c2 1008 trace.init(get_type_name().data(), endpoint, &info, true);
7c673cae
FG
1009 trace.event("decoded trace");
1010 } else if (create || (msgr->get_myname().is_osd() &&
1011 msgr->cct->_conf->osd_blkin_trace_all)) {
1012 // create a trace even if we didn't get one on the wire
f67539c2 1013 trace.init(get_type_name().data(), endpoint);
7c673cae
FG
1014 trace.event("created trace");
1015 }
1016 trace.keyval("tid", get_tid());
1017 trace.keyval("entity type", get_source().type_str());
1018 trace.keyval("entity num", get_source().num());
1019#endif
1020}
1021
1022
1023// This routine is not used for ordinary messages, but only when encapsulating a message
1024// for forwarding and routing. It's also used in a backward compatibility test, which only
1025// effectively tests backward compability for those functions. To avoid backward compatibility
1026// problems, we currently always encode and decode using the old footer format that doesn't
1027// allow for message authentication. Eventually we should fix that. PLR
1028
f67539c2 1029void encode_message(Message *msg, uint64_t features, ceph::bufferlist& payload)
7c673cae 1030{
7c673cae 1031 ceph_msg_footer_old old_footer;
7c673cae 1032 msg->encode(features, MSG_CRC_ALL);
11fdf7f2 1033 encode(msg->get_header(), payload);
7c673cae
FG
1034
1035 // Here's where we switch to the old footer format. PLR
9f95a23c 1036 ceph_msg_footer footer = msg->get_footer();
7c673cae
FG
1037 old_footer.front_crc = footer.front_crc;
1038 old_footer.middle_crc = footer.middle_crc;
1039 old_footer.data_crc = footer.data_crc;
1040 old_footer.flags = footer.flags;
11fdf7f2 1041 encode(old_footer, payload);
7c673cae 1042
f67539c2 1043 using ceph::encode;
11fdf7f2
TL
1044 encode(msg->get_payload(), payload);
1045 encode(msg->get_middle(), payload);
1046 encode(msg->get_data(), payload);
7c673cae
FG
1047}
1048
1049// See above for somewhat bogus use of the old message footer. We switch to the current footer
1050// after decoding the old one so the other form of decode_message() doesn't have to change.
1051// We've slipped in a 0 signature at this point, so any signature checking after this will
1052// fail. PLR
1053
f67539c2 1054Message *decode_message(CephContext *cct, int crcflags, ceph::bufferlist::const_iterator& p)
7c673cae
FG
1055{
1056 ceph_msg_header h;
1057 ceph_msg_footer_old fo;
1058 ceph_msg_footer f;
f67539c2 1059 ceph::bufferlist fr, mi, da;
11fdf7f2
TL
1060 decode(h, p);
1061 decode(fo, p);
7c673cae
FG
1062 f.front_crc = fo.front_crc;
1063 f.middle_crc = fo.middle_crc;
1064 f.data_crc = fo.data_crc;
1065 f.flags = fo.flags;
1066 f.sig = 0;
f67539c2 1067 using ceph::decode;
11fdf7f2
TL
1068 decode(fr, p);
1069 decode(mi, p);
1070 decode(da, p);
7c673cae
FG
1071 return decode_message(cct, crcflags, h, f, fr, mi, da, nullptr);
1072}