]>
Commit | Line | Data |
---|---|---|
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_MDISCOVER_H | |
17 | #define CEPH_MDISCOVER_H | |
18 | ||
19 | #include "include/filepath.h" | |
20 | #include "messages/MMDSOp.h" | |
21 | ||
22 | #include <string> | |
23 | ||
24 | ||
25 | class MDiscover final : public MMDSOp { | |
26 | private: | |
27 | static constexpr int HEAD_VERSION = 1; | |
28 | static constexpr int COMPAT_VERSION = 1; | |
29 | ||
30 | inodeno_t base_ino; // 1 -> root | |
31 | frag_t base_dir_frag; | |
32 | ||
33 | snapid_t snapid; | |
34 | filepath want; // ... [/]need/this/stuff | |
35 | ||
36 | bool want_base_dir = true; | |
37 | bool path_locked = false; | |
38 | ||
39 | public: | |
40 | inodeno_t get_base_ino() const { return base_ino; } | |
41 | frag_t get_base_dir_frag() const { return base_dir_frag; } | |
42 | snapid_t get_snapid() const { return snapid; } | |
43 | ||
44 | const filepath& get_want() const { return want; } | |
45 | const std::string& get_dentry(int n) const { return want[n]; } | |
46 | ||
47 | bool wants_base_dir() const { return want_base_dir; } | |
48 | bool is_path_locked() const { return path_locked; } | |
49 | ||
50 | void set_base_dir_frag(frag_t f) { base_dir_frag = f; } | |
51 | ||
52 | protected: | |
53 | MDiscover() : MMDSOp(MSG_MDS_DISCOVER, HEAD_VERSION, COMPAT_VERSION) { } | |
54 | MDiscover(inodeno_t base_ino_, | |
55 | frag_t base_frag_, | |
56 | snapid_t s, | |
57 | filepath& want_path_, | |
58 | bool want_base_dir_ = true, | |
59 | bool path_locked_ = false) : | |
60 | MMDSOp{MSG_MDS_DISCOVER}, | |
61 | base_ino(base_ino_), | |
62 | base_dir_frag(base_frag_), | |
63 | snapid(s), | |
64 | want(want_path_), | |
65 | want_base_dir(want_base_dir_), | |
66 | path_locked(path_locked_) { } | |
67 | ~MDiscover() final {} | |
68 | ||
69 | public: | |
70 | std::string_view get_type_name() const override { return "Dis"; } | |
71 | void print(std::ostream &out) const override { | |
72 | out << "discover(" << header.tid << " " << base_ino << "." << base_dir_frag | |
73 | << " " << want << ")"; | |
74 | } | |
75 | ||
76 | void decode_payload() override { | |
77 | using ceph::decode; | |
78 | auto p = payload.cbegin(); | |
79 | decode(base_ino, p); | |
80 | decode(base_dir_frag, p); | |
81 | decode(snapid, p); | |
82 | decode(want, p); | |
83 | decode(want_base_dir, p); | |
84 | decode(path_locked, p); | |
85 | } | |
86 | void encode_payload(uint64_t features) override { | |
87 | using ceph::encode; | |
88 | encode(base_ino, payload); | |
89 | encode(base_dir_frag, payload); | |
90 | encode(snapid, payload); | |
91 | encode(want, payload); | |
92 | encode(want_base_dir, payload); | |
93 | encode(path_locked, payload); | |
94 | } | |
95 | private: | |
96 | template<class T, typename... Args> | |
97 | friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args); | |
98 | template<class T, typename... Args> | |
99 | friend MURef<T> crimson::make_message(Args&&... args); | |
100 | }; | |
101 | ||
102 | #endif |