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