]> git.proxmox.com Git - ceph.git/blame - ceph/src/messages/MClientReconnect.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / messages / MClientReconnect.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#ifndef CEPH_MCLIENTRECONNECT_H
16#define CEPH_MCLIENTRECONNECT_H
17
18#include "msg/Message.h"
19#include "mds/mdstypes.h"
20#include "include/ceph_features.h"
21
22
11fdf7f2
TL
23class MClientReconnect : public MessageInstance<MClientReconnect> {
24public:
25 friend factory;
26private:
27 static constexpr int HEAD_VERSION = 5;
28 static constexpr int COMPAT_VERSION = 4;
7c673cae
FG
29
30public:
11fdf7f2
TL
31 map<inodeno_t, cap_reconnect_t> caps; // only head inodes
32 vector<snaprealm_reconnect_t> realms;
33 bool more = false;
7c673cae 34
11fdf7f2
TL
35 MClientReconnect() :
36 MessageInstance(CEPH_MSG_CLIENT_RECONNECT, HEAD_VERSION, COMPAT_VERSION) {}
7c673cae
FG
37private:
38 ~MClientReconnect() override {}
39
11fdf7f2
TL
40 size_t cap_size = 0;
41 size_t realm_size = 0;
42 size_t approx_size = sizeof(__u32) + sizeof(__u32) + 1;
43
44 void calc_item_size() {
45 using ceph::encode;
46 {
47 bufferlist bl;
48 inodeno_t ino;
49 cap_reconnect_t cr;
50 encode(ino, bl);
51 encode(cr, bl);
52 cap_size = bl.length();
53 }
54 {
55 bufferlist bl;
56 snaprealm_reconnect_t sr;
57 encode(sr, bl);
58 realm_size = bl.length();
59 }
60 }
61
7c673cae 62public:
11fdf7f2 63 std::string_view get_type_name() const override { return "client_reconnect"; }
7c673cae
FG
64 void print(ostream& out) const override {
65 out << "client_reconnect("
11fdf7f2
TL
66 << caps.size() << " caps " << realms.size() << " realms )";
67 }
68
69 // Force to use old encoding.
70 // Use connection's features to choose encoding if version is set to 0.
71 void set_encoding_version(int v) {
72 header.version = v;
73 if (v <= 3)
74 header.compat_version = 0;
75 }
76 size_t get_approx_size() {
77 return approx_size;
7c673cae 78 }
11fdf7f2
TL
79 void mark_more() { more = true; }
80 bool has_more() const { return more; }
7c673cae
FG
81
82 void add_cap(inodeno_t ino, uint64_t cap_id, inodeno_t pathbase, const string& path,
83 int wanted, int issued, inodeno_t sr, snapid_t sf, bufferlist& lb)
84 {
85 caps[ino] = cap_reconnect_t(cap_id, pathbase, path, wanted, issued, sr, sf, lb);
11fdf7f2
TL
86 if (!cap_size)
87 calc_item_size();
88 approx_size += cap_size + path.length() + lb.length();
7c673cae
FG
89 }
90 void add_snaprealm(inodeno_t ino, snapid_t seq, inodeno_t parent) {
11fdf7f2
TL
91 snaprealm_reconnect_t r;
92 r.realm.ino = ino;
93 r.realm.seq = seq;
94 r.realm.parent = parent;
7c673cae 95 realms.push_back(r);
11fdf7f2
TL
96 if (!realm_size)
97 calc_item_size();
98 approx_size += realm_size;
7c673cae
FG
99 }
100
101 void encode_payload(uint64_t features) override {
11fdf7f2
TL
102 if (header.version == 0) {
103 if (features & CEPH_FEATURE_MDSENC)
104 header.version = 3;
105 else if (features & CEPH_FEATURE_FLOCK)
106 header.version = 2;
107 else
108 header.version = 1;
109 }
110
111 using ceph::encode;
7c673cae 112 data.clear();
11fdf7f2
TL
113
114 if (header.version >= 4) {
115 encode(caps, data);
116 encode(realms, data);
117 encode(more, data);
7c673cae
FG
118 } else {
119 // compat crap
11fdf7f2
TL
120 if (header.version == 3) {
121 encode(caps, data);
122 } else if (header.version == 2) {
123 __u32 n = caps.size();
124 encode(n, data);
125 for (auto& p : caps) {
126 encode(p.first, data);
127 p.second.encode_old(data);
128 }
129 } else {
130 map<inodeno_t, old_cap_reconnect_t> ocaps;
131 for (auto& p : caps) {
132 ocaps[p.first] = p.second;
133 encode(ocaps, data);
134 }
135 for (auto& r : realms)
136 r.encode_old(data);
137 }
7c673cae 138 }
7c673cae
FG
139 }
140 void decode_payload() override {
11fdf7f2
TL
141 auto p = data.cbegin();
142 if (header.version >= 4) {
143 decode(caps, p);
144 decode(realms, p);
145 if (header.version >= 5)
146 decode(more, p);
7c673cae
FG
147 } else {
148 // compat crap
11fdf7f2
TL
149 if (header.version == 3) {
150 decode(caps, p);
151 } else if (header.version == 2) {
152 __u32 n;
153 decode(n, p);
154 inodeno_t ino;
155 while (n--) {
156 decode(ino, p);
157 caps[ino].decode_old(p);
158 }
159 } else {
160 map<inodeno_t, old_cap_reconnect_t> ocaps;
161 decode(ocaps, p);
162 for (auto &q : ocaps)
163 caps[q.first] = q.second;
164 }
165 while (!p.end()) {
166 realms.push_back(snaprealm_reconnect_t());
167 realms.back().decode_old(p);
168 }
7c673cae
FG
169 }
170 }
7c673cae
FG
171};
172
173
174#endif