]> git.proxmox.com Git - ceph.git/blob - ceph/src/librbd/Utils.cc
update sources to v12.2.3
[ceph.git] / ceph / src / librbd / Utils.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #include <boost/algorithm/string.hpp>
5 #include <boost/lexical_cast.hpp>
6
7 #include "librbd/Utils.h"
8 #include "include/rbd_types.h"
9 #include "include/stringify.h"
10 #include "include/rbd/features.h"
11 #include "common/dout.h"
12 #include "librbd/ImageCtx.h"
13
14 #define dout_subsys ceph_subsys_rbd
15 #undef dout_prefix
16 #define dout_prefix *_dout << "librbd: "
17
18 namespace librbd {
19 namespace util {
20
21 const std::string group_header_name(const std::string &group_id)
22 {
23 return RBD_GROUP_HEADER_PREFIX + group_id;
24 }
25
26 const std::string id_obj_name(const std::string &name)
27 {
28 return RBD_ID_PREFIX + name;
29 }
30
31 const std::string header_name(const std::string &image_id)
32 {
33 return RBD_HEADER_PREFIX + image_id;
34 }
35
36 const std::string old_header_name(const std::string &image_name)
37 {
38 return image_name + RBD_SUFFIX;
39 }
40
41 std::string unique_lock_name(const std::string &name, void *address) {
42 return name + " (" + stringify(address) + ")";
43 }
44
45 librados::AioCompletion *create_rados_callback(Context *on_finish) {
46 return create_rados_callback<Context, &Context::complete>(on_finish);
47 }
48
49 std::string generate_image_id(librados::IoCtx &ioctx) {
50 librados::Rados rados(ioctx);
51
52 uint64_t bid = rados.get_instance_id();
53 uint32_t extra = rand() % 0xFFFFFFFF;
54
55 ostringstream bid_ss;
56 bid_ss << std::hex << bid << std::hex << extra;
57 std::string id = bid_ss.str();
58
59 // ensure the image id won't overflow the fixed block name size
60 if (id.length() > RBD_MAX_IMAGE_ID_LENGTH) {
61 id = id.substr(id.length() - RBD_MAX_IMAGE_ID_LENGTH);
62 }
63
64 return id;
65 }
66
67 uint64_t get_rbd_default_features(CephContext* cct)
68 {
69 auto str_val = cct->_conf->get_val<std::string>("rbd_default_features");
70 return boost::lexical_cast<uint64_t>(str_val);
71 }
72
73 bool calc_sparse_extent(const bufferptr &bp,
74 size_t sparse_size,
75 uint64_t length,
76 size_t *write_offset,
77 size_t *write_length,
78 size_t *offset) {
79 size_t extent_size;
80 if (*offset + sparse_size > length) {
81 extent_size = length - *offset;
82 } else {
83 extent_size = sparse_size;
84 }
85
86 bufferptr extent(bp, *offset, extent_size);
87 *offset += extent_size;
88
89 bool extent_is_zero = extent.is_zero();
90 if (!extent_is_zero) {
91 *write_length += extent_size;
92 }
93 if (extent_is_zero && *write_length == 0) {
94 *write_offset += extent_size;
95 }
96
97 if ((extent_is_zero || *offset == length) && *write_length != 0) {
98 return true;
99 }
100 return false;
101 }
102
103 bool is_metadata_config_override(const std::string& metadata_key,
104 std::string* config_key) {
105 size_t prefix_len = librbd::ImageCtx::METADATA_CONF_PREFIX.size();
106 if (metadata_key.size() > prefix_len &&
107 metadata_key.compare(0, prefix_len,
108 librbd::ImageCtx::METADATA_CONF_PREFIX) == 0) {
109 *config_key = metadata_key.substr(prefix_len,
110 metadata_key.size() - prefix_len);
111 return true;
112 }
113 return false;
114 }
115
116 } // namespace util
117 } // namespace librbd