]> git.proxmox.com Git - ceph.git/blob - ceph/src/messages/MOSDRepOp.h
update sources to ceph Nautilus 14.2.1
[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 : public MessageInstance<MOSDRepOp, MOSDFastDispatchOp> {
26 public:
27 friend factory;
28 private:
29 static constexpr int HEAD_VERSION = 2;
30 static constexpr int COMPAT_VERSION = 1;
31
32 public:
33 epoch_t map_epoch, min_epoch;
34
35 // metadata from original request
36 osd_reqid_t reqid;
37
38 spg_t pgid;
39
40 bufferlist::const_iterator p;
41 // Decoding flags. Decoding is only needed for messages caught by pipe reader.
42 bool final_decode_needed;
43
44 // subop
45 pg_shard_t from;
46 hobject_t poid;
47
48 __u8 acks_wanted;
49
50 // transaction to exec
51 bufferlist logbl;
52 pg_stat_t pg_stats;
53
54 // subop metadata
55 eversion_t version;
56
57 // piggybacked osd/og state
58 eversion_t pg_trim_to; // primary->replica: trim to here
59 eversion_t pg_roll_forward_to; // primary->replica: trim rollback
60 // info to here
61
62 hobject_t new_temp_oid; ///< new temp object that we must now start tracking
63 hobject_t discard_temp_oid; ///< previously used temp object that we can now stop tracking
64
65 /// non-empty if this transaction involves a hit_set history update
66 boost::optional<pg_hit_set_history_t> updated_hit_set_history;
67
68 epoch_t get_map_epoch() const override {
69 return map_epoch;
70 }
71 epoch_t get_min_epoch() const override {
72 return min_epoch;
73 }
74 spg_t get_spg() const override {
75 return pgid;
76 }
77
78 int get_cost() const override {
79 return data.length();
80 }
81
82 void decode_payload() override {
83 p = payload.cbegin();
84 // split to partial and final
85 decode(map_epoch, p);
86 if (header.version >= 2) {
87 decode(min_epoch, p);
88 decode_trace(p);
89 } else {
90 min_epoch = map_epoch;
91 }
92 decode(reqid, p);
93 decode(pgid, p);
94 }
95
96 void finish_decode() {
97 if (!final_decode_needed)
98 return; // Message is already final decoded
99 decode(poid, p);
100
101 decode(acks_wanted, p);
102 decode(version, p);
103 decode(logbl, p);
104 decode(pg_stats, p);
105 decode(pg_trim_to, p);
106
107
108 decode(new_temp_oid, p);
109 decode(discard_temp_oid, p);
110
111 decode(from, p);
112 decode(updated_hit_set_history, p);
113 decode(pg_roll_forward_to, p);
114 final_decode_needed = false;
115 }
116
117 void encode_payload(uint64_t features) override {
118 using ceph::encode;
119 encode(map_epoch, payload);
120 if (HAVE_FEATURE(features, SERVER_LUMINOUS)) {
121 header.version = HEAD_VERSION;
122 encode(min_epoch, payload);
123 encode_trace(payload, features);
124 } else {
125 header.version = 1;
126 }
127 encode(reqid, payload);
128 encode(pgid, payload);
129 encode(poid, payload);
130
131 encode(acks_wanted, payload);
132 encode(version, payload);
133 encode(logbl, payload);
134 encode(pg_stats, payload);
135 encode(pg_trim_to, payload);
136 encode(new_temp_oid, payload);
137 encode(discard_temp_oid, payload);
138 encode(from, payload);
139 encode(updated_hit_set_history, payload);
140 encode(pg_roll_forward_to, payload);
141 }
142
143 MOSDRepOp()
144 : MessageInstance(MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION),
145 map_epoch(0),
146 final_decode_needed(true), acks_wanted (0) {}
147 MOSDRepOp(osd_reqid_t r, pg_shard_t from,
148 spg_t p, const hobject_t& po, int aw,
149 epoch_t mape, epoch_t min_epoch, ceph_tid_t rtid, eversion_t v)
150 : MessageInstance(MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION),
151 map_epoch(mape),
152 min_epoch(min_epoch),
153 reqid(r),
154 pgid(p),
155 final_decode_needed(false),
156 from(from),
157 poid(po),
158 acks_wanted(aw),
159 version(v) {
160 set_tid(rtid);
161 }
162 private:
163 ~MOSDRepOp() override {}
164
165 public:
166 std::string_view get_type_name() const override { return "osd_repop"; }
167 void print(ostream& out) const override {
168 out << "osd_repop(" << reqid
169 << " " << pgid << " e" << map_epoch << "/" << min_epoch;
170 if (!final_decode_needed) {
171 out << " " << poid << " v " << version;
172 if (updated_hit_set_history)
173 out << ", has_updated_hit_set_history";
174 }
175 out << ")";
176 }
177 };
178
179
180 #endif