]> git.proxmox.com Git - ceph.git/blob - ceph/src/messages/MOSDRepOp.h
bump version to 18.2.4-pve3
[ceph.git] / ceph / src / messages / MOSDRepOp.h
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_MOSDREPOP_H
17 #define CEPH_MOSDREPOP_H
18
19 #include "MOSDFastDispatchOp.h"
20
21 /*
22 * OSD sub op - for internal ops on pobjects between primary and replicas(/stripes/whatever)
23 */
24
25 class MOSDRepOp final : public MOSDFastDispatchOp {
26 private:
27 static constexpr int HEAD_VERSION = 3;
28 static constexpr int COMPAT_VERSION = 1;
29
30 public:
31 epoch_t map_epoch, min_epoch;
32
33 // metadata from original request
34 osd_reqid_t reqid;
35
36 spg_t pgid;
37
38 ceph::buffer::list::const_iterator p;
39 // Decoding flags. Decoding is only needed for messages caught by pipe reader.
40 bool final_decode_needed;
41
42 // subop
43 pg_shard_t from;
44 hobject_t poid;
45
46 __u8 acks_wanted;
47
48 // transaction to exec
49 ceph::buffer::list logbl;
50 pg_stat_t pg_stats;
51
52 // subop metadata
53 eversion_t version;
54
55 // piggybacked osd/og state
56 eversion_t pg_trim_to; // primary->replica: trim to here
57 eversion_t min_last_complete_ondisk; // lower bound on committed version
58
59 hobject_t new_temp_oid; ///< new temp object that we must now start tracking
60 hobject_t discard_temp_oid; ///< previously used temp object that we can now stop tracking
61
62 /// non-empty if this transaction involves a hit_set history update
63 std::optional<pg_hit_set_history_t> updated_hit_set_history;
64
65 epoch_t get_map_epoch() const override {
66 return map_epoch;
67 }
68 epoch_t get_min_epoch() const override {
69 return min_epoch;
70 }
71 spg_t get_spg() const override {
72 return pgid;
73 }
74
75 int get_cost() const override {
76 return data.length();
77 }
78
79 void decode_payload() override {
80 using ceph::decode;
81 p = payload.cbegin();
82 // split to partial and final
83 decode(map_epoch, p);
84 if (header.version >= 2) {
85 decode(min_epoch, p);
86 decode_trace(p);
87 } else {
88 min_epoch = map_epoch;
89 }
90 decode(reqid, p);
91 decode(pgid, p);
92 }
93
94 void finish_decode() {
95 using ceph::decode;
96 if (!final_decode_needed)
97 return; // Message is already final decoded
98 decode(poid, p);
99
100 decode(acks_wanted, p);
101 decode(version, p);
102 decode(logbl, p);
103 decode(pg_stats, p);
104 decode(pg_trim_to, p);
105
106
107 decode(new_temp_oid, p);
108 decode(discard_temp_oid, p);
109
110 decode(from, p);
111 decode(updated_hit_set_history, p);
112
113 if (header.version >= 3) {
114 decode(min_last_complete_ondisk, p);
115 } else {
116 /* This field used to mean pg_roll_foward_to, but ReplicatedBackend
117 * simply assumes that we're rolling foward to version. */
118 eversion_t pg_roll_forward_to;
119 decode(pg_roll_forward_to, p);
120 }
121 final_decode_needed = false;
122 }
123
124 void encode_payload(uint64_t features) override {
125 using ceph::encode;
126 encode(map_epoch, payload);
127 assert(HAVE_FEATURE(features, SERVER_OCTOPUS));
128 header.version = HEAD_VERSION;
129 encode(min_epoch, payload);
130 encode_trace(payload, features);
131 encode(reqid, payload);
132 encode(pgid, payload);
133 encode(poid, payload);
134
135 encode(acks_wanted, payload);
136 encode(version, payload);
137 encode(logbl, payload);
138 encode(pg_stats, payload);
139 encode(pg_trim_to, payload);
140 encode(new_temp_oid, payload);
141 encode(discard_temp_oid, payload);
142 encode(from, payload);
143 encode(updated_hit_set_history, payload);
144 encode(min_last_complete_ondisk, payload);
145 }
146
147 MOSDRepOp()
148 : MOSDFastDispatchOp{MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION},
149 map_epoch(0),
150 final_decode_needed(true), acks_wanted (0) {}
151 MOSDRepOp(osd_reqid_t r, pg_shard_t from,
152 spg_t p, const hobject_t& po, int aw,
153 epoch_t mape, epoch_t min_epoch, ceph_tid_t rtid, eversion_t v)
154 : MOSDFastDispatchOp{MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION},
155 map_epoch(mape),
156 min_epoch(min_epoch),
157 reqid(r),
158 pgid(p),
159 final_decode_needed(false),
160 from(from),
161 poid(po),
162 acks_wanted(aw),
163 version(v) {
164 set_tid(rtid);
165 }
166
167 void set_rollback_to(const eversion_t &rollback_to) {
168 header.version = 2;
169 min_last_complete_ondisk = rollback_to;
170 }
171 private:
172 ~MOSDRepOp() final {}
173
174 public:
175 std::string_view get_type_name() const override { return "osd_repop"; }
176 void print(std::ostream& out) const override {
177 out << "osd_repop(" << reqid
178 << " " << pgid << " e" << map_epoch << "/" << min_epoch;
179 if (!final_decode_needed) {
180 out << " " << poid << " v " << version;
181 if (updated_hit_set_history)
182 out << ", has_updated_hit_set_history";
183 if (header.version < 3) {
184 out << ", rollback_to(legacy)=" << min_last_complete_ondisk;
185 } else {
186 out << ", mlcod=" << min_last_complete_ondisk;
187 }
188 }
189 out << ")";
190 }
191 private:
192 template<class T, typename... Args>
193 friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
194 };
195
196 #endif