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 MOSDFastDispatchOp {
26 private:
27 static constexpr int HEAD_VERSION = 2;
28 static constexpr int COMPAT_VERSION = 1;
29
30 public:
(1) Event member_decl: |
Class member declaration for "min_epoch". |
Also see events: |
[uninit_member] |
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 pg_roll_forward_to; // primary->replica: trim rollback
58 // info to here
59
60 hobject_t new_temp_oid; ///< new temp object that we must now start tracking
61 hobject_t discard_temp_oid; ///< previously used temp object that we can now stop tracking
62
63 /// non-empty if this transaction involves a hit_set history update
64 std::optional<pg_hit_set_history_t> updated_hit_set_history;
65
66 epoch_t get_map_epoch() const override {
67 return map_epoch;
68 }
69 epoch_t get_min_epoch() const override {
70 return min_epoch;
71 }
72 spg_t get_spg() const override {
73 return pgid;
74 }
75
76 int get_cost() const override {
77 return data.length();
78 }
79
80 void decode_payload() override {
81 using ceph::decode;
82 p = payload.cbegin();
83 // split to partial and final
84 decode(map_epoch, p);
85 if (header.version >= 2) {
86 decode(min_epoch, p);
87 decode_trace(p);
88 } else {
89 min_epoch = map_epoch;
90 }
91 decode(reqid, p);
92 decode(pgid, p);
93 }
94
95 void finish_decode() {
96 using ceph::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 : MOSDFastDispatchOp{MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION},
145 map_epoch(0),
(2) Event uninit_member: |
Non-static class member "min_epoch" is not initialized in this constructor nor in any functions that it calls. |
Also see events: |
[member_decl] |
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 : MOSDFastDispatchOp{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(std::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 private:
178 template<class T, typename... Args>
179 friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
180 };
181
182 #endif
183