]>
Commit | Line | Data |
---|---|---|
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 | 23 | class MOSDMap : public Message { |
11fdf7f2 TL |
24 | private: |
25 | static constexpr int HEAD_VERSION = 4; | |
26 | static constexpr int COMPAT_VERSION = 3; | |
7c673cae | 27 | |
9f95a23c | 28 | public: |
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) { } |
66 | private: | |
67 | ~MOSDMap() override {} | |
7c673cae FG |
68 | public: |
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 |
161 | private: |
162 | template<class T, typename... Args> | |
163 | friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args); | |
7c673cae FG |
164 | }; |
165 | ||
166 | #endif |