]> git.proxmox.com Git - ceph.git/blob - ceph/src/tools/rbd/Utils.h
3ed5bfddbcb6a4e58e14233f68445ee8945f54c6
[ceph.git] / ceph / src / tools / rbd / Utils.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #ifndef CEPH_RBD_UTILS_H
5 #define CEPH_RBD_UTILS_H
6
7 #include "include/int_types.h"
8 #include "include/rados/librados.hpp"
9 #include "include/rbd/librbd.hpp"
10 #include "tools/rbd/ArgumentTypes.h"
11 #include <map>
12 #include <string>
13 #include <boost/program_options.hpp>
14
15 namespace rbd {
16 namespace utils {
17
18 namespace detail {
19
20 template <typename T, void(T::*MF)(int)>
21 void aio_completion_callback(librbd::completion_t completion,
22 void *arg) {
23 librbd::RBD::AioCompletion *aio_completion =
24 reinterpret_cast<librbd::RBD::AioCompletion*>(completion);
25
26 // complete the AIO callback in separate thread context
27 T *t = reinterpret_cast<T *>(arg);
28 int r = aio_completion->get_return_value();
29 aio_completion->release();
30
31 (t->*MF)(r);
32 }
33
34 } // namespace detail
35
36 static const std::string RBD_DIFF_BANNER ("rbd diff v1\n");
37 static const size_t RBD_DEFAULT_SPARSE_SIZE = 4096;
38
39 static const std::string RBD_IMAGE_BANNER_V2 ("rbd image v2\n");
40 static const std::string RBD_IMAGE_DIFFS_BANNER_V2 ("rbd image diffs v2\n");
41 static const std::string RBD_DIFF_BANNER_V2 ("rbd diff v2\n");
42
43 #define RBD_DIFF_FROM_SNAP 'f'
44 #define RBD_DIFF_TO_SNAP 't'
45 #define RBD_DIFF_IMAGE_SIZE 's'
46 #define RBD_DIFF_WRITE 'w'
47 #define RBD_DIFF_ZERO 'z'
48 #define RBD_DIFF_END 'e'
49
50 #define RBD_SNAP_PROTECTION_STATUS 'p'
51
52 #define RBD_EXPORT_IMAGE_ORDER 'O'
53 #define RBD_EXPORT_IMAGE_FEATURES 'T'
54 #define RBD_EXPORT_IMAGE_STRIPE_UNIT 'U'
55 #define RBD_EXPORT_IMAGE_STRIPE_COUNT 'C'
56 #define RBD_EXPORT_IMAGE_META 'M'
57 #define RBD_EXPORT_IMAGE_END 'E'
58
59 enum SnapshotPresence {
60 SNAPSHOT_PRESENCE_NONE,
61 SNAPSHOT_PRESENCE_PERMITTED,
62 SNAPSHOT_PRESENCE_REQUIRED
63 };
64
65 enum SpecValidation {
66 SPEC_VALIDATION_FULL,
67 SPEC_VALIDATION_SNAP,
68 SPEC_VALIDATION_NONE
69 };
70
71 struct ProgressContext : public librbd::ProgressContext {
72 const char *operation;
73 bool progress;
74 int last_pc;
75
76 ProgressContext(const char *o, bool no_progress)
77 : operation(o), progress(!no_progress), last_pc(0) {
78 }
79
80 int update_progress(uint64_t offset, uint64_t total) override;
81 void finish();
82 void fail();
83 };
84
85 int get_percentage(uint64_t part, uint64_t whole);
86
87 template <typename T, void(T::*MF)(int)>
88 librbd::RBD::AioCompletion *create_aio_completion(T *t) {
89 return new librbd::RBD::AioCompletion(
90 t, &detail::aio_completion_callback<T, MF>);
91 }
92
93 void aio_context_callback(librbd::completion_t completion, void *arg);
94
95 int read_string(int fd, unsigned max, std::string *out);
96
97 int extract_spec(const std::string &spec, std::string *pool_name,
98 std::string *namespace_name, std::string *name,
99 std::string *snap_name, SpecValidation spec_validation);
100
101 std::string get_positional_argument(
102 const boost::program_options::variables_map &vm, size_t index);
103
104 void normalize_pool_name(std::string* pool_name);
105 std::string get_default_pool_name();
106
107 int get_pool_and_namespace_names(
108 const boost::program_options::variables_map &vm, bool validate_pool_name,
109 std::string* pool_name, std::string* namespace_name, size_t *arg_index);
110
111 int get_pool_image_snapshot_names(
112 const boost::program_options::variables_map &vm,
113 argument_types::ArgumentModifier mod, size_t *spec_arg_index,
114 std::string *pool_name, std::string *namespace_name,
115 std::string *image_name, std::string *snap_name, bool image_name_required,
116 SnapshotPresence snapshot_presence, SpecValidation spec_validation);
117
118 int get_pool_generic_snapshot_names(
119 const boost::program_options::variables_map &vm,
120 argument_types::ArgumentModifier mod, size_t *spec_arg_index,
121 const std::string& pool_key, std::string *pool_name,
122 std::string *namespace_name, const std::string& generic_key,
123 const std::string& generic_key_desc, std::string *generic_name,
124 std::string *snap_name, bool generic_name_required,
125 SnapshotPresence snapshot_presence, SpecValidation spec_validation);
126
127 int get_pool_image_id(const boost::program_options::variables_map &vm,
128 size_t *spec_arg_index,
129 std::string *pool_name,
130 std::string *namespace_name,
131 std::string *image_id);
132
133 int validate_snapshot_name(argument_types::ArgumentModifier mod,
134 const std::string &snap_name,
135 SnapshotPresence snapshot_presence,
136 SpecValidation spec_validation);
137
138 int get_image_options(const boost::program_options::variables_map &vm,
139 bool get_format, librbd::ImageOptions* opts);
140
141 int get_journal_options(const boost::program_options::variables_map &vm,
142 librbd::ImageOptions *opts);
143
144 int get_flatten_option(const boost::program_options::variables_map &vm,
145 librbd::ImageOptions *opts);
146
147 int get_image_size(const boost::program_options::variables_map &vm,
148 uint64_t *size);
149
150 int get_path(const boost::program_options::variables_map &vm,
151 size_t *arg_index, std::string *path);
152
153 int get_formatter(const boost::program_options::variables_map &vm,
154 argument_types::Format::Formatter *formatter);
155
156 int get_snap_create_flags(const boost::program_options::variables_map &vm,
157 uint32_t *flags);
158
159 void init_context();
160
161 int init_rados(librados::Rados *rados);
162
163 int init(const std::string& pool_name, const std::string& namespace_name,
164 librados::Rados *rados, librados::IoCtx *io_ctx);
165 int init_io_ctx(librados::Rados &rados, std::string pool_name,
166 const std::string& namespace_name, librados::IoCtx *io_ctx);
167 int set_namespace(const std::string& namespace_name, librados::IoCtx *io_ctx);
168
169 void disable_cache();
170
171 int open_image(librados::IoCtx &io_ctx, const std::string &image_name,
172 bool read_only, librbd::Image *image);
173
174 int open_image_by_id(librados::IoCtx &io_ctx, const std::string &image_id,
175 bool read_only, librbd::Image *image);
176
177 int init_and_open_image(const std::string &pool_name,
178 const std::string &namespace_name,
179 const std::string &image_name,
180 const std::string &image_id,
181 const std::string &snap_name, bool read_only,
182 librados::Rados *rados, librados::IoCtx *io_ctx,
183 librbd::Image *image);
184
185 int snap_set(librbd::Image &image, const std::string &snap_name);
186
187 void calc_sparse_extent(const bufferptr &bp,
188 size_t sparse_size,
189 size_t buffer_offset,
190 uint64_t length,
191 size_t *write_length,
192 bool *zeroed);
193
194 bool is_not_user_snap_namespace(librbd::Image* image,
195 const librbd::snap_info_t &snap_info);
196
197 std::string image_id(librbd::Image& image);
198
199 std::string mirror_image_mode(
200 librbd::mirror_image_mode_t mirror_image_mode);
201 std::string mirror_image_state(
202 librbd::mirror_image_state_t mirror_image_state);
203 std::string mirror_image_status_state(
204 librbd::mirror_image_status_state_t state);
205 std::string mirror_image_site_status_state(
206 const librbd::mirror_image_site_status_t& status);
207 std::string mirror_image_global_status_state(
208 const librbd::mirror_image_global_status_t& status);
209
210 int get_local_mirror_image_status(
211 const librbd::mirror_image_global_status_t& status,
212 librbd::mirror_image_site_status_t* local_status);
213
214 std::string timestr(time_t t);
215
216 // duplicate here to not include librbd_internal lib
217 uint64_t get_rbd_default_features(CephContext* cct);
218
219 void get_mirror_peer_sites(
220 librados::IoCtx& io_ctx,
221 std::vector<librbd::mirror_peer_site_t>* mirror_peers);
222 void get_mirror_peer_mirror_uuids_to_names(
223 const std::vector<librbd::mirror_peer_site_t>& mirror_peers,
224 std::map<std::string, std::string>* fsid_to_name);
225 void populate_unknown_mirror_image_site_statuses(
226 const std::vector<librbd::mirror_peer_site_t>& mirror_peers,
227 librbd::mirror_image_global_status_t* global_status);
228
229 int mgr_command(librados::Rados& rados, const std::string& cmd,
230 const std::map<std::string, std::string> &args,
231 std::ostream *out_os, std::ostream *err_os);
232
233 } // namespace utils
234 } // namespace rbd
235
236 #endif // CEPH_RBD_UTILS_H