]> git.proxmox.com Git - ceph.git/blame - ceph/src/messages/MOSDMap.h
import 15.2.0 Octopus source
[ceph.git] / ceph / src / messages / MOSDMap.h
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 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
7 *
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
12 *
13 */
14
15
16#ifndef CEPH_MOSDMAP_H
17#define CEPH_MOSDMAP_H
18
19#include "msg/Message.h"
20#include "osd/OSDMap.h"
21#include "include/ceph_features.h"
22
9f95a23c 23class MOSDMap : public Message {
11fdf7f2
TL
24private:
25 static constexpr int HEAD_VERSION = 4;
26 static constexpr int COMPAT_VERSION = 3;
7c673cae 27
9f95a23c 28public:
7c673cae 29 uuid_d fsid;
28e407b8 30 uint64_t encode_features = 0;
9f95a23c
TL
31 std::map<epoch_t, ceph::buffer::list> maps;
32 std::map<epoch_t, ceph::buffer::list> incremental_maps;
d2e6a577 33 epoch_t oldest_map =0, newest_map = 0;
7c673cae
FG
34
35 epoch_t get_first() const {
36 epoch_t e = 0;
9f95a23c
TL
37 auto i = maps.cbegin();
38 if (i != maps.cend()) e = i->first;
7c673cae
FG
39 i = incremental_maps.begin();
40 if (i != incremental_maps.end() &&
41 (e == 0 || i->first < e)) e = i->first;
42 return e;
43 }
44 epoch_t get_last() const {
45 epoch_t e = 0;
9f95a23c
TL
46 auto i = maps.crbegin();
47 if (i != maps.crend()) e = i->first;
7c673cae
FG
48 i = incremental_maps.rbegin();
49 if (i != incremental_maps.rend() &&
50 (e == 0 || i->first > e)) e = i->first;
51 return e;
52 }
53 epoch_t get_oldest() {
54 return oldest_map;
55 }
56 epoch_t get_newest() {
57 return newest_map;
58 }
59
60
9f95a23c 61 MOSDMap() : Message{CEPH_MSG_OSD_MAP, HEAD_VERSION, COMPAT_VERSION} { }
28e407b8 62 MOSDMap(const uuid_d &f, const uint64_t features)
9f95a23c 63 : Message{CEPH_MSG_OSD_MAP, HEAD_VERSION, COMPAT_VERSION},
28e407b8 64 fsid(f), encode_features(features),
7c673cae
FG
65 oldest_map(0), newest_map(0) { }
66private:
67 ~MOSDMap() override {}
7c673cae
FG
68public:
69 // marshalling
70 void decode_payload() override {
9f95a23c 71 using ceph::decode;
11fdf7f2
TL
72 auto p = payload.cbegin();
73 decode(fsid, p);
74 decode(incremental_maps, p);
75 decode(maps, p);
7c673cae 76 if (header.version >= 2) {
11fdf7f2
TL
77 decode(oldest_map, p);
78 decode(newest_map, p);
7c673cae
FG
79 } else {
80 oldest_map = 0;
81 newest_map = 0;
82 }
11fdf7f2 83 if (header.version >= 4) {
9f95a23c
TL
84 // removed in octopus
85 mempool::osdmap::map<int64_t,snap_interval_set_t> gap_removed_snaps;
11fdf7f2
TL
86 decode(gap_removed_snaps, p);
87 }
7c673cae
FG
88 }
89 void encode_payload(uint64_t features) override {
11fdf7f2 90 using ceph::encode;
7c673cae 91 header.version = HEAD_VERSION;
11fdf7f2
TL
92 header.compat_version = COMPAT_VERSION;
93 encode(fsid, payload);
28e407b8
AA
94 if (OSDMap::get_significant_features(encode_features) !=
95 OSDMap::get_significant_features(features)) {
7c673cae 96 if ((features & CEPH_FEATURE_PGID64) == 0 ||
11fdf7f2 97 (features & CEPH_FEATURE_PGPOOL3) == 0) {
7c673cae 98 header.version = 1; // old old_client version
11fdf7f2
TL
99 header.compat_version = 1;
100 } else if ((features & CEPH_FEATURE_OSDENC) == 0) {
7c673cae 101 header.version = 2; // old pg_pool_t
11fdf7f2
TL
102 header.compat_version = 2;
103 }
7c673cae
FG
104
105 // reencode maps using old format
106 //
107 // FIXME: this can probably be done more efficiently higher up
108 // the stack, or maybe replaced with something that only
109 // includes the pools the client cares about.
9f95a23c 110 for (auto p = incremental_maps.begin(); p != incremental_maps.end(); ++p) {
7c673cae 111 OSDMap::Incremental inc;
11fdf7f2 112 auto q = p->second.cbegin();
7c673cae 113 inc.decode(q);
28e407b8
AA
114 // always encode with subset of osdmaps canonical features
115 uint64_t f = inc.encode_features & features;
7c673cae
FG
116 p->second.clear();
117 if (inc.fullmap.length()) {
9f95a23c 118 // embedded full std::map?
7c673cae
FG
119 OSDMap m;
120 m.decode(inc.fullmap);
121 inc.fullmap.clear();
28e407b8 122 m.encode(inc.fullmap, f | CEPH_FEATURE_RESERVED);
7c673cae 123 }
3efd9988 124 if (inc.crush.length()) {
9f95a23c 125 // embedded crush std::map
3efd9988 126 CrushWrapper c;
11fdf7f2 127 auto p = inc.crush.cbegin();
3efd9988
FG
128 c.decode(p);
129 inc.crush.clear();
28e407b8 130 c.encode(inc.crush, f);
3efd9988 131 }
28e407b8 132 inc.encode(p->second, f | CEPH_FEATURE_RESERVED);
7c673cae 133 }
9f95a23c 134 for (auto p = maps.begin(); p != maps.end(); ++p) {
7c673cae
FG
135 OSDMap m;
136 m.decode(p->second);
28e407b8
AA
137 // always encode with subset of osdmaps canonical features
138 uint64_t f = m.get_encoding_features() & features;
7c673cae 139 p->second.clear();
28e407b8 140 m.encode(p->second, f | CEPH_FEATURE_RESERVED);
7c673cae
FG
141 }
142 }
11fdf7f2
TL
143 encode(incremental_maps, payload);
144 encode(maps, payload);
7c673cae 145 if (header.version >= 2) {
11fdf7f2
TL
146 encode(oldest_map, payload);
147 encode(newest_map, payload);
148 }
149 if (header.version >= 4) {
9f95a23c 150 encode((uint32_t)0, payload);
7c673cae
FG
151 }
152 }
153
11fdf7f2 154 std::string_view get_type_name() const override { return "osdmap"; }
9f95a23c 155 void print(std::ostream& out) const override {
7c673cae
FG
156 out << "osd_map(" << get_first() << ".." << get_last();
157 if (oldest_map || newest_map)
158 out << " src has " << oldest_map << ".." << newest_map;
159 out << ")";
160 }
9f95a23c
TL
161private:
162 template<class T, typename... Args>
163 friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
7c673cae
FG
164};
165
166#endif