1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_RBD_UTILS_H
5 #define CEPH_RBD_UTILS_H
7 #include "include/int_types.h"
8 #include "include/rados/librados.hpp"
9 #include "include/rbd/librbd.hpp"
10 #include "tools/rbd/ArgumentTypes.h"
13 #include <boost/program_options.hpp>
20 template <typename T
, void(T::*MF
)(int)>
21 void aio_completion_callback(librbd::completion_t completion
,
23 librbd::RBD::AioCompletion
*aio_completion
=
24 reinterpret_cast<librbd::RBD::AioCompletion
*>(completion
);
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();
36 static const std::string
RBD_DIFF_BANNER ("rbd diff v1\n");
37 static const size_t RBD_DEFAULT_SPARSE_SIZE
= 4096;
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");
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'
50 #define RBD_SNAP_PROTECTION_STATUS 'p'
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'
59 enum SnapshotPresence
{
60 SNAPSHOT_PRESENCE_NONE
,
61 SNAPSHOT_PRESENCE_PERMITTED
,
62 SNAPSHOT_PRESENCE_REQUIRED
71 struct ProgressContext
: public librbd::ProgressContext
{
72 const char *operation
;
76 ProgressContext(const char *o
, bool no_progress
)
77 : operation(o
), progress(!no_progress
), last_pc(0) {
80 int update_progress(uint64_t offset
, uint64_t total
) override
;
85 int get_percentage(uint64_t part
, uint64_t whole
);
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
>);
93 void aio_context_callback(librbd::completion_t completion
, void *arg
);
95 int read_string(int fd
, unsigned max
, std::string
*out
);
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
);
101 std::string
get_positional_argument(
102 const boost::program_options::variables_map
&vm
, size_t index
);
104 void normalize_pool_name(std::string
* pool_name
);
105 std::string
get_default_pool_name();
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
);
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
);
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
);
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
);
133 int validate_snapshot_name(argument_types::ArgumentModifier mod
,
134 const std::string
&snap_name
,
135 SnapshotPresence snapshot_presence
,
136 SpecValidation spec_validation
);
138 int get_image_options(const boost::program_options::variables_map
&vm
,
139 bool get_format
, librbd::ImageOptions
* opts
);
141 int get_journal_options(const boost::program_options::variables_map
&vm
,
142 librbd::ImageOptions
*opts
);
144 int get_flatten_option(const boost::program_options::variables_map
&vm
,
145 librbd::ImageOptions
*opts
);
147 int get_image_size(const boost::program_options::variables_map
&vm
,
150 int get_path(const boost::program_options::variables_map
&vm
,
151 size_t *arg_index
, std::string
*path
);
153 int get_formatter(const boost::program_options::variables_map
&vm
,
154 argument_types::Format::Formatter
*formatter
);
156 int get_snap_create_flags(const boost::program_options::variables_map
&vm
,
161 int init_rados(librados::Rados
*rados
);
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
);
169 void disable_cache();
171 int open_image(librados::IoCtx
&io_ctx
, const std::string
&image_name
,
172 bool read_only
, librbd::Image
*image
);
174 int open_image_by_id(librados::IoCtx
&io_ctx
, const std::string
&image_id
,
175 bool read_only
, librbd::Image
*image
);
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
);
185 int snap_set(librbd::Image
&image
, const std::string
&snap_name
);
187 void calc_sparse_extent(const bufferptr
&bp
,
189 size_t buffer_offset
,
191 size_t *write_length
,
194 bool is_not_user_snap_namespace(librbd::Image
* image
,
195 const librbd::snap_info_t
&snap_info
);
197 std::string
image_id(librbd::Image
& image
);
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
);
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
);
214 std::string
timestr(time_t t
);
216 // duplicate here to not include librbd_internal lib
217 uint64_t get_rbd_default_features(CephContext
* cct
);
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
);
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
);
236 #endif // CEPH_RBD_UTILS_H