]> git.proxmox.com Git - ceph.git/blame - ceph/src/messages/MOSDRepOp.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / messages / MOSDRepOp.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_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
f67539c2 25class MOSDRepOp final : public MOSDFastDispatchOp {
11fdf7f2 26private:
9f95a23c 27 static constexpr int HEAD_VERSION = 3;
11fdf7f2 28 static constexpr int COMPAT_VERSION = 1;
7c673cae
FG
29
30public:
31 epoch_t map_epoch, min_epoch;
32
33 // metadata from original request
34 osd_reqid_t reqid;
35
36 spg_t pgid;
37
9f95a23c 38 ceph::buffer::list::const_iterator p;
11fdf7f2 39 // Decoding flags. Decoding is only needed for messages caught by pipe reader.
7c673cae
FG
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
9f95a23c 49 ceph::buffer::list logbl;
7c673cae
FG
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
9f95a23c 57 eversion_t min_last_complete_ondisk; // lower bound on committed version
7c673cae
FG
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
9f95a23c 63 std::optional<pg_hit_set_history_t> updated_hit_set_history;
7c673cae
FG
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 {
9f95a23c 80 using ceph::decode;
11fdf7f2
TL
81 p = payload.cbegin();
82 // split to partial and final
83 decode(map_epoch, p);
7c673cae 84 if (header.version >= 2) {
11fdf7f2 85 decode(min_epoch, p);
7c673cae
FG
86 decode_trace(p);
87 } else {
88 min_epoch = map_epoch;
89 }
11fdf7f2
TL
90 decode(reqid, p);
91 decode(pgid, p);
7c673cae
FG
92 }
93
94 void finish_decode() {
9f95a23c 95 using ceph::decode;
7c673cae
FG
96 if (!final_decode_needed)
97 return; // Message is already final decoded
11fdf7f2 98 decode(poid, p);
7c673cae 99
11fdf7f2
TL
100 decode(acks_wanted, p);
101 decode(version, p);
102 decode(logbl, p);
103 decode(pg_stats, p);
104 decode(pg_trim_to, p);
7c673cae
FG
105
106
11fdf7f2
TL
107 decode(new_temp_oid, p);
108 decode(discard_temp_oid, p);
7c673cae 109
11fdf7f2
TL
110 decode(from, p);
111 decode(updated_hit_set_history, p);
9f95a23c
TL
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 }
7c673cae
FG
121 final_decode_needed = false;
122 }
123
124 void encode_payload(uint64_t features) override {
11fdf7f2
TL
125 using ceph::encode;
126 encode(map_epoch, payload);
7c673cae 127 if (HAVE_FEATURE(features, SERVER_LUMINOUS)) {
c07f9fc5 128 header.version = HEAD_VERSION;
11fdf7f2 129 encode(min_epoch, payload);
7c673cae
FG
130 encode_trace(payload, features);
131 } else {
132 header.version = 1;
133 }
11fdf7f2
TL
134 encode(reqid, payload);
135 encode(pgid, payload);
136 encode(poid, payload);
137
138 encode(acks_wanted, payload);
139 encode(version, payload);
140 encode(logbl, payload);
141 encode(pg_stats, payload);
142 encode(pg_trim_to, payload);
143 encode(new_temp_oid, payload);
144 encode(discard_temp_oid, payload);
145 encode(from, payload);
146 encode(updated_hit_set_history, payload);
9f95a23c 147 encode(min_last_complete_ondisk, payload);
7c673cae
FG
148 }
149
150 MOSDRepOp()
9f95a23c 151 : MOSDFastDispatchOp{MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION},
7c673cae
FG
152 map_epoch(0),
153 final_decode_needed(true), acks_wanted (0) {}
154 MOSDRepOp(osd_reqid_t r, pg_shard_t from,
155 spg_t p, const hobject_t& po, int aw,
156 epoch_t mape, epoch_t min_epoch, ceph_tid_t rtid, eversion_t v)
9f95a23c 157 : MOSDFastDispatchOp{MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION},
7c673cae
FG
158 map_epoch(mape),
159 min_epoch(min_epoch),
160 reqid(r),
161 pgid(p),
162 final_decode_needed(false),
163 from(from),
164 poid(po),
165 acks_wanted(aw),
166 version(v) {
167 set_tid(rtid);
168 }
9f95a23c
TL
169
170 void set_rollback_to(const eversion_t &rollback_to) {
171 header.version = 2;
172 min_last_complete_ondisk = rollback_to;
173 }
7c673cae 174private:
f67539c2 175 ~MOSDRepOp() final {}
7c673cae
FG
176
177public:
11fdf7f2 178 std::string_view get_type_name() const override { return "osd_repop"; }
9f95a23c 179 void print(std::ostream& out) const override {
7c673cae
FG
180 out << "osd_repop(" << reqid
181 << " " << pgid << " e" << map_epoch << "/" << min_epoch;
182 if (!final_decode_needed) {
183 out << " " << poid << " v " << version;
184 if (updated_hit_set_history)
185 out << ", has_updated_hit_set_history";
9f95a23c
TL
186 if (header.version < 3) {
187 out << ", rollback_to(legacy)=" << min_last_complete_ondisk;
188 } else {
189 out << ", mlcod=" << min_last_complete_ondisk;
190 }
7c673cae
FG
191 }
192 out << ")";
193 }
9f95a23c
TL
194private:
195 template<class T, typename... Args>
196 friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
7c673cae
FG
197};
198
7c673cae 199#endif