]> git.proxmox.com Git - ceph.git/blame - ceph/src/librbd/ObjectMap.h
update sources to v12.2.3
[ceph.git] / ceph / src / librbd / ObjectMap.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#ifndef CEPH_LIBRBD_OBJECT_MAP_H
5#define CEPH_LIBRBD_OBJECT_MAP_H
6
7#include "include/int_types.h"
8#include "include/fs_types.h"
9#include "include/rbd/object_map_types.h"
10#include "common/bit_vector.hpp"
11#include "librbd/Utils.h"
12#include <boost/optional.hpp>
13
14class Context;
15class RWLock;
31f18b77
FG
16namespace librados { class IoCtx; }
17namespace ZTracer { struct Trace; }
7c673cae
FG
18
19namespace librbd {
20
21template <typename Op> class BlockGuard;
22struct BlockGuardCell;
23class ImageCtx;
24
25template <typename ImageCtxT = ImageCtx>
26class ObjectMap {
27public:
28 static ObjectMap *create(ImageCtxT &image_ctx, uint64_t snap_id) {
29 return new ObjectMap(image_ctx, snap_id);
30 }
31
32 ObjectMap(ImageCtxT &image_ctx, uint64_t snap_id);
33 ~ObjectMap();
34
35 static int aio_remove(librados::IoCtx &io_ctx, const std::string &image_id, librados::AioCompletion *c);
36 static std::string object_map_name(const std::string &image_id,
37 uint64_t snap_id);
38
39 static bool is_compatible(const file_layout_t& layout, uint64_t size);
40
41 ceph::BitVector<2u>::Reference operator[](uint64_t object_no);
42 uint8_t operator[](uint64_t object_no) const;
43 inline uint64_t size() const {
44 return m_object_map.size();
45 }
46
47 void open(Context *on_finish);
48 void close(Context *on_finish);
b32b8144 49 bool set_object_map(ceph::BitVector<2> &target_object_map);
7c673cae
FG
50 bool object_may_exist(uint64_t object_no) const;
51
52 void aio_save(Context *on_finish);
53 void aio_resize(uint64_t new_size, uint8_t default_object_state,
54 Context *on_finish);
55
56 template <typename T, void(T::*MF)(int) = &T::complete>
57 bool aio_update(uint64_t snap_id, uint64_t start_object_no, uint8_t new_state,
58 const boost::optional<uint8_t> &current_state,
31f18b77 59 const ZTracer::Trace &parent_trace, T *callback_object) {
7c673cae 60 return aio_update<T, MF>(snap_id, start_object_no, start_object_no + 1,
31f18b77
FG
61 new_state, current_state, parent_trace,
62 callback_object);
7c673cae
FG
63 }
64
65 template <typename T, void(T::*MF)(int) = &T::complete>
66 bool aio_update(uint64_t snap_id, uint64_t start_object_no,
67 uint64_t end_object_no, uint8_t new_state,
68 const boost::optional<uint8_t> &current_state,
31f18b77 69 const ZTracer::Trace &parent_trace, T *callback_object) {
7c673cae
FG
70 assert(start_object_no < end_object_no);
71 if (snap_id == CEPH_NOSNAP) {
3efd9988
FG
72 auto it = m_object_map.begin() + start_object_no;
73 auto end_it = m_object_map.begin() + end_object_no;
74 for (; it != end_it; ++it) {
75 if (update_required(it, new_state)) {
7c673cae
FG
76 break;
77 }
78 }
79
3efd9988 80 if (it == end_it) {
7c673cae
FG
81 return false;
82 }
83
84 UpdateOperation update_operation(start_object_no, end_object_no,
31f18b77 85 new_state, current_state, parent_trace,
7c673cae
FG
86 util::create_context_callback<T, MF>(
87 callback_object));
88 detained_aio_update(std::move(update_operation));
89 } else {
90 aio_update(snap_id, start_object_no, end_object_no, new_state,
31f18b77 91 current_state, parent_trace,
7c673cae
FG
92 util::create_context_callback<T, MF>(callback_object));
93 }
94 return true;
95 }
96
97 void rollback(uint64_t snap_id, Context *on_finish);
98 void snapshot_add(uint64_t snap_id, Context *on_finish);
99 void snapshot_remove(uint64_t snap_id, Context *on_finish);
100
101private:
102 struct UpdateOperation {
103 uint64_t start_object_no;
104 uint64_t end_object_no;
105 uint8_t new_state;
106 boost::optional<uint8_t> current_state;
31f18b77 107 ZTracer::Trace parent_trace;
7c673cae
FG
108 Context *on_finish;
109
110 UpdateOperation(uint64_t start_object_no, uint64_t end_object_no,
111 uint8_t new_state,
112 const boost::optional<uint8_t> &current_state,
31f18b77 113 const ZTracer::Trace &parent_trace, Context *on_finish)
7c673cae
FG
114 : start_object_no(start_object_no), end_object_no(end_object_no),
115 new_state(new_state), current_state(current_state),
31f18b77 116 parent_trace(parent_trace), on_finish(on_finish) {
7c673cae
FG
117 }
118 };
119
120 typedef BlockGuard<UpdateOperation> UpdateGuard;
121
122 ImageCtxT &m_image_ctx;
123 ceph::BitVector<2> m_object_map;
124 uint64_t m_snap_id;
125
126 UpdateGuard *m_update_guard = nullptr;
127
128 void detained_aio_update(UpdateOperation &&update_operation);
129 void handle_detained_aio_update(BlockGuardCell *cell, int r,
130 Context *on_finish);
131
132 void aio_update(uint64_t snap_id, uint64_t start_object_no,
133 uint64_t end_object_no, uint8_t new_state,
134 const boost::optional<uint8_t> &current_state,
31f18b77 135 const ZTracer::Trace &parent_trace, Context *on_finish);
3efd9988
FG
136 bool update_required(const ceph::BitVector<2>::Iterator &it,
137 uint8_t new_state);
7c673cae
FG
138
139};
140
141} // namespace librbd
142
143extern template class librbd::ObjectMap<librbd::ImageCtx>;
144
145#endif // CEPH_LIBRBD_OBJECT_MAP_H