]>
Commit | Line | Data |
---|---|---|
7c673cae | 1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
9f95a23c | 2 | // vim: ts=8 sw=2 smarttab ft=cpp |
7c673cae FG |
3 | |
4 | #ifndef CEPH_RGW_METADATA_H | |
5 | #define CEPH_RGW_METADATA_H | |
6 | ||
7 | #include <string> | |
11fdf7f2 | 8 | #include <utility> |
7c673cae FG |
9 | #include <boost/optional.hpp> |
10 | ||
11 | #include "include/types.h" | |
12 | #include "rgw_common.h" | |
13 | #include "rgw_period_history.h" | |
9f95a23c | 14 | #include "rgw_mdlog_types.h" |
7c673cae FG |
15 | #include "cls/version/cls_version_types.h" |
16 | #include "cls/log/cls_log_types.h" | |
7c673cae FG |
17 | #include "common/RefCountedObj.h" |
18 | #include "common/ceph_time.h" | |
9f95a23c | 19 | #include "services/svc_meta_be.h" |
7c673cae FG |
20 | |
21 | ||
9f95a23c | 22 | namespace rgw { namespace sal { |
20effc67 | 23 | class Store; |
9f95a23c | 24 | } } |
7c673cae FG |
25 | class RGWCoroutine; |
26 | class JSONObj; | |
27 | struct RGWObjVersionTracker; | |
28 | ||
29 | struct obj_version; | |
30 | ||
31 | ||
7c673cae FG |
32 | class RGWMetadataObject { |
33 | protected: | |
34 | obj_version objv; | |
35 | ceph::real_time mtime; | |
20effc67 | 36 | std::map<std::string, bufferlist> *pattrs{nullptr}; |
7c673cae FG |
37 | |
38 | public: | |
39 | RGWMetadataObject() {} | |
40 | virtual ~RGWMetadataObject() {} | |
41 | obj_version& get_version(); | |
9f95a23c | 42 | real_time& get_mtime() { return mtime; } |
20effc67 | 43 | void set_pattrs(std::map<std::string, bufferlist> *_pattrs) { |
9f95a23c TL |
44 | pattrs = _pattrs; |
45 | } | |
20effc67 | 46 | std::map<std::string, bufferlist> *get_pattrs() { |
9f95a23c TL |
47 | return pattrs; |
48 | } | |
7c673cae | 49 | |
9f95a23c | 50 | virtual void dump(Formatter *f) const {} |
7c673cae FG |
51 | }; |
52 | ||
53 | class RGWMetadataManager; | |
54 | ||
55 | class RGWMetadataHandler { | |
56 | friend class RGWMetadataManager; | |
57 | ||
9f95a23c TL |
58 | protected: |
59 | CephContext *cct; | |
11fdf7f2 | 60 | |
9f95a23c TL |
61 | public: |
62 | RGWMetadataHandler() {} | |
7c673cae | 63 | virtual ~RGWMetadataHandler() {} |
20effc67 | 64 | virtual std::string get_type() = 0; |
7c673cae | 65 | |
9f95a23c TL |
66 | void base_init(CephContext *_cct) { |
67 | cct = _cct; | |
68 | } | |
69 | ||
70 | virtual RGWMetadataObject *get_meta_obj(JSONObj *jo, const obj_version& objv, const ceph::real_time& mtime) = 0; | |
71 | ||
20effc67 TL |
72 | virtual int get(std::string& entry, RGWMetadataObject **obj, optional_yield, const DoutPrefixProvider *dpp) = 0; |
73 | virtual int put(std::string& entry, | |
f67539c2 TL |
74 | RGWMetadataObject *obj, |
75 | RGWObjVersionTracker& objv_tracker, | |
b3b6e05e TL |
76 | optional_yield, |
77 | const DoutPrefixProvider *dpp, | |
78 | RGWMDLogSyncType type, | |
f67539c2 | 79 | bool from_remote_zone) = 0; |
20effc67 | 80 | virtual int remove(std::string& entry, RGWObjVersionTracker& objv_tracker, optional_yield, const DoutPrefixProvider *dpp) = 0; |
9f95a23c | 81 | |
20effc67 | 82 | virtual int mutate(const std::string& entry, |
9f95a23c TL |
83 | const ceph::real_time& mtime, |
84 | RGWObjVersionTracker *objv_tracker, | |
85 | optional_yield y, | |
b3b6e05e | 86 | const DoutPrefixProvider *dpp, |
9f95a23c TL |
87 | RGWMDLogStatus op_type, |
88 | std::function<int()> f) = 0; | |
7c673cae | 89 | |
20effc67 TL |
90 | virtual int list_keys_init(const DoutPrefixProvider *dpp, const std::string& marker, void **phandle) = 0; |
91 | virtual int list_keys_next(const DoutPrefixProvider *dpp, void *handle, int max, std::list<std::string>& keys, bool *truncated) = 0; | |
7c673cae FG |
92 | virtual void list_keys_complete(void *handle) = 0; |
93 | ||
20effc67 | 94 | virtual std::string get_marker(void *handle) = 0; |
181888fb | 95 | |
20effc67 | 96 | virtual int get_shard_id(const std::string& entry, int *shard_id) { |
9f95a23c TL |
97 | *shard_id = 0; |
98 | return 0; | |
7c673cae | 99 | } |
9f95a23c TL |
100 | virtual int attach(RGWMetadataManager *manager); |
101 | }; | |
102 | ||
103 | class RGWMetadataHandler_GenericMetaBE : public RGWMetadataHandler { | |
104 | friend class RGWSI_MetaBackend; | |
105 | friend class RGWMetadataManager; | |
106 | friend class Put; | |
107 | ||
108 | public: | |
109 | class Put; | |
7c673cae FG |
110 | |
111 | protected: | |
9f95a23c TL |
112 | RGWSI_MetaBackend_Handler *be_handler; |
113 | ||
20effc67 TL |
114 | virtual int do_get(RGWSI_MetaBackend_Handler::Op *op, std::string& entry, RGWMetadataObject **obj, optional_yield y, const DoutPrefixProvider *dpp) = 0; |
115 | virtual int do_put(RGWSI_MetaBackend_Handler::Op *op, std::string& entry, RGWMetadataObject *obj, | |
f67539c2 | 116 | RGWObjVersionTracker& objv_tracker, optional_yield y, |
b3b6e05e TL |
117 | const DoutPrefixProvider *dpp, RGWMDLogSyncType type, |
118 | bool from_remote_zone) = 0; | |
119 | virtual int do_put_operate(Put *put_op, const DoutPrefixProvider *dpp); | |
20effc67 | 120 | virtual int do_remove(RGWSI_MetaBackend_Handler::Op *op, std::string& entry, RGWObjVersionTracker& objv_tracker, optional_yield y, const DoutPrefixProvider *dpp) = 0; |
9f95a23c TL |
121 | |
122 | public: | |
123 | RGWMetadataHandler_GenericMetaBE() {} | |
124 | ||
125 | void base_init(CephContext *_cct, | |
126 | RGWSI_MetaBackend_Handler *_be_handler) { | |
127 | RGWMetadataHandler::base_init(_cct); | |
128 | be_handler = _be_handler; | |
129 | } | |
130 | ||
131 | RGWSI_MetaBackend_Handler *get_be_handler() { | |
132 | return be_handler; | |
133 | } | |
134 | ||
135 | class Put { | |
136 | protected: | |
137 | RGWMetadataHandler_GenericMetaBE *handler; | |
138 | RGWSI_MetaBackend_Handler::Op *op; | |
20effc67 | 139 | std::string& entry; |
9f95a23c TL |
140 | RGWMetadataObject *obj; |
141 | RGWObjVersionTracker& objv_tracker; | |
142 | RGWMDLogSyncType apply_type; | |
143 | optional_yield y; | |
f67539c2 | 144 | bool from_remote_zone{false}; |
9f95a23c | 145 | |
b3b6e05e TL |
146 | int get(RGWMetadataObject **obj, const DoutPrefixProvider *dpp) { |
147 | return handler->do_get(op, entry, obj, y, dpp); | |
9f95a23c TL |
148 | } |
149 | public: | |
150 | Put(RGWMetadataHandler_GenericMetaBE *_handler, RGWSI_MetaBackend_Handler::Op *_op, | |
20effc67 | 151 | std::string& _entry, RGWMetadataObject *_obj, |
9f95a23c | 152 | RGWObjVersionTracker& _objv_tracker, optional_yield _y, |
f67539c2 | 153 | RGWMDLogSyncType _type, bool from_remote_zone); |
9f95a23c TL |
154 | |
155 | virtual ~Put() {} | |
156 | ||
b3b6e05e | 157 | virtual int put_pre(const DoutPrefixProvider *dpp) { |
9f95a23c TL |
158 | return 0; |
159 | } | |
b3b6e05e | 160 | virtual int put(const DoutPrefixProvider *dpp) { |
9f95a23c TL |
161 | return 0; |
162 | } | |
b3b6e05e | 163 | virtual int put_post(const DoutPrefixProvider *dpp) { |
9f95a23c TL |
164 | return 0; |
165 | } | |
166 | virtual int finalize() { | |
167 | return 0; | |
168 | } | |
169 | }; | |
170 | ||
20effc67 TL |
171 | int get(std::string& entry, RGWMetadataObject **obj, optional_yield, const DoutPrefixProvider *dpp) override; |
172 | int put(std::string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker, optional_yield, const DoutPrefixProvider *dpp, RGWMDLogSyncType type, bool from_remote_zone) override; | |
173 | int remove(std::string& entry, RGWObjVersionTracker& objv_tracker, optional_yield, const DoutPrefixProvider *dpp) override; | |
9f95a23c | 174 | |
20effc67 | 175 | int mutate(const std::string& entry, |
9f95a23c TL |
176 | const ceph::real_time& mtime, |
177 | RGWObjVersionTracker *objv_tracker, | |
178 | optional_yield y, | |
b3b6e05e | 179 | const DoutPrefixProvider *dpp, |
9f95a23c TL |
180 | RGWMDLogStatus op_type, |
181 | std::function<int()> f) override; | |
182 | ||
20effc67 | 183 | int get_shard_id(const std::string& entry, int *shard_id) override; |
9f95a23c | 184 | |
b3b6e05e | 185 | int list_keys_init(const DoutPrefixProvider *dpp, const std::string& marker, void **phandle) override; |
20effc67 | 186 | int list_keys_next(const DoutPrefixProvider *dpp, void *handle, int max, std::list<std::string>& keys, bool *truncated) override; |
9f95a23c TL |
187 | void list_keys_complete(void *handle) override; |
188 | ||
189 | std::string get_marker(void *handle) override; | |
190 | ||
7c673cae FG |
191 | /** |
192 | * Compare an incoming versus on-disk tag/version+mtime combo against | |
193 | * the sync mode to see if the new one should replace the on-disk one. | |
194 | * | |
195 | * @return true if the update should proceed, false otherwise. | |
196 | */ | |
9f95a23c TL |
197 | static bool check_versions(bool exists, |
198 | const obj_version& ondisk, const real_time& ondisk_time, | |
11fdf7f2 | 199 | const obj_version& incoming, const real_time& incoming_time, |
9f95a23c | 200 | RGWMDLogSyncType sync_mode) { |
7c673cae FG |
201 | switch (sync_mode) { |
202 | case APPLY_UPDATES: | |
203 | if ((ondisk.tag != incoming.tag) || | |
204 | (ondisk.ver >= incoming.ver)) | |
205 | return false; | |
206 | break; | |
207 | case APPLY_NEWER: | |
208 | if (ondisk_time >= incoming_time) | |
209 | return false; | |
210 | break; | |
9f95a23c TL |
211 | case APPLY_EXCLUSIVE: |
212 | if (exists) | |
213 | return false; | |
214 | break; | |
7c673cae FG |
215 | case APPLY_ALWAYS: //deliberate fall-thru -- we always apply! |
216 | default: break; | |
217 | } | |
218 | return true; | |
219 | } | |
7c673cae FG |
220 | }; |
221 | ||
9f95a23c | 222 | class RGWMetadataTopHandler; |
7c673cae | 223 | |
9f95a23c TL |
224 | class RGWMetadataManager { |
225 | friend class RGWMetadataHandler; | |
7c673cae | 226 | |
7c673cae | 227 | CephContext *cct; |
9f95a23c | 228 | RGWSI_Meta *meta_svc; |
20effc67 | 229 | std::map<std::string, RGWMetadataHandler *> handlers; |
9f95a23c | 230 | std::unique_ptr<RGWMetadataTopHandler> md_top_handler; |
7c673cae | 231 | |
20effc67 | 232 | int find_handler(const std::string& metadata_key, RGWMetadataHandler **handler, std::string& entry); |
9f95a23c | 233 | int register_handler(RGWMetadataHandler *handler); |
11fdf7f2 | 234 | |
7c673cae | 235 | public: |
9f95a23c | 236 | RGWMetadataManager(RGWSI_Meta *_meta_svc); |
7c673cae FG |
237 | ~RGWMetadataManager(); |
238 | ||
20effc67 | 239 | RGWMetadataHandler *get_handler(const std::string& type); |
7c673cae | 240 | |
20effc67 TL |
241 | int get(std::string& metadata_key, Formatter *f, optional_yield y, const DoutPrefixProvider *dpp); |
242 | int put(std::string& metadata_key, bufferlist& bl, optional_yield y, | |
b3b6e05e | 243 | const DoutPrefixProvider *dpp, |
9f95a23c | 244 | RGWMDLogSyncType sync_mode, |
f67539c2 | 245 | bool from_remote_zone, |
7c673cae | 246 | obj_version *existing_version = NULL); |
20effc67 | 247 | int remove(std::string& metadata_key, optional_yield y, const DoutPrefixProvider *dpp); |
9f95a23c | 248 | |
20effc67 | 249 | int mutate(const std::string& metadata_key, |
9f95a23c TL |
250 | const ceph::real_time& mtime, |
251 | RGWObjVersionTracker *objv_tracker, | |
252 | optional_yield y, | |
b3b6e05e | 253 | const DoutPrefixProvider *dpp, |
9f95a23c TL |
254 | RGWMDLogStatus op_type, |
255 | std::function<int()> f); | |
7c673cae | 256 | |
20effc67 TL |
257 | int list_keys_init(const DoutPrefixProvider *dpp, const std::string& section, void **phandle); |
258 | int list_keys_init(const DoutPrefixProvider *dpp, const std::string& section, const std::string& marker, void **phandle); | |
259 | int list_keys_next(const DoutPrefixProvider *dpp, void *handle, int max, std::list<std::string>& keys, bool *truncated); | |
7c673cae FG |
260 | void list_keys_complete(void *handle); |
261 | ||
20effc67 | 262 | std::string get_marker(void *handle); |
181888fb | 263 | |
7c673cae FG |
264 | void dump_log_entry(cls_log_entry& entry, Formatter *f); |
265 | ||
20effc67 | 266 | void get_sections(std::list<std::string>& sections); |
11fdf7f2 | 267 | |
20effc67 | 268 | void parse_metadata_key(const std::string& metadata_key, std::string& type, std::string& entry); |
9f95a23c | 269 | |
20effc67 | 270 | int get_shard_id(const std::string& section, const std::string& key, int *shard_id); |
7c673cae FG |
271 | }; |
272 | ||
9f95a23c | 273 | class RGWMetadataHandlerPut_SObj : public RGWMetadataHandler_GenericMetaBE::Put |
11fdf7f2 | 274 | { |
9f95a23c TL |
275 | protected: |
276 | std::unique_ptr<RGWMetadataObject> oo; | |
277 | RGWMetadataObject *old_obj{nullptr}; | |
278 | bool exists{false}; | |
11fdf7f2 | 279 | |
9f95a23c TL |
280 | public: |
281 | RGWMetadataHandlerPut_SObj(RGWMetadataHandler_GenericMetaBE *handler, RGWSI_MetaBackend_Handler::Op *op, | |
20effc67 | 282 | std::string& entry, RGWMetadataObject *obj, RGWObjVersionTracker& objv_tracker, |
9f95a23c | 283 | optional_yield y, |
f67539c2 | 284 | RGWMDLogSyncType type, bool from_remote_zone); |
9f95a23c TL |
285 | ~RGWMetadataHandlerPut_SObj(); |
286 | ||
b3b6e05e TL |
287 | int put_pre(const DoutPrefixProvider *dpp) override; |
288 | int put(const DoutPrefixProvider *dpp) override; | |
289 | virtual int put_check(const DoutPrefixProvider *dpp) { | |
9f95a23c | 290 | return 0; |
11fdf7f2 | 291 | } |
b3b6e05e | 292 | virtual int put_checked(const DoutPrefixProvider *dpp); |
9f95a23c TL |
293 | virtual void encode_obj(bufferlist *bl) {} |
294 | }; | |
11fdf7f2 | 295 | |
11fdf7f2 | 296 | |
7c673cae | 297 | #endif |