1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
8 #include <boost/optional.hpp>
10 #include "include/types.h"
11 #include "rgw_common.h"
12 #include "rgw_period_history.h"
13 #include "rgw_mdlog_types.h"
14 #include "cls/version/cls_version_types.h"
15 #include "cls/log/cls_log_types.h"
16 #include "common/RefCountedObj.h"
17 #include "common/ceph_time.h"
18 #include "services/svc_meta_be.h"
19 #include "rgw_sal_fwd.h"
24 struct RGWObjVersionTracker
;
29 class RGWMetadataObject
{
32 ceph::real_time mtime
;
33 std::map
<std::string
, bufferlist
> *pattrs
{nullptr};
36 RGWMetadataObject() {}
37 RGWMetadataObject(const obj_version
& v
,
38 real_time m
) : objv(v
), mtime(m
) {}
39 virtual ~RGWMetadataObject() {}
40 obj_version
& get_version();
41 real_time
& get_mtime() { return mtime
; }
42 void set_pattrs(std::map
<std::string
, bufferlist
> *_pattrs
) {
45 std::map
<std::string
, bufferlist
> *get_pattrs() {
49 virtual void dump(Formatter
*f
) const {}
52 class RGWMetadataManager
;
54 class RGWMetadataHandler
{
55 friend class RGWMetadataManager
;
61 RGWMetadataHandler() {}
62 virtual ~RGWMetadataHandler();
63 virtual std::string
get_type() = 0;
65 void base_init(CephContext
*_cct
) {
69 virtual RGWMetadataObject
*get_meta_obj(JSONObj
*jo
, const obj_version
& objv
, const ceph::real_time
& mtime
) = 0;
71 virtual int get(std::string
& entry
, RGWMetadataObject
**obj
, optional_yield
, const DoutPrefixProvider
*dpp
) = 0;
72 virtual int put(std::string
& entry
,
73 RGWMetadataObject
*obj
,
74 RGWObjVersionTracker
& objv_tracker
,
76 const DoutPrefixProvider
*dpp
,
77 RGWMDLogSyncType type
,
78 bool from_remote_zone
) = 0;
79 virtual int remove(std::string
& entry
, RGWObjVersionTracker
& objv_tracker
, optional_yield
, const DoutPrefixProvider
*dpp
) = 0;
81 virtual int mutate(const std::string
& entry
,
82 const ceph::real_time
& mtime
,
83 RGWObjVersionTracker
*objv_tracker
,
85 const DoutPrefixProvider
*dpp
,
86 RGWMDLogStatus op_type
,
87 std::function
<int()> f
) = 0;
89 virtual int list_keys_init(const DoutPrefixProvider
*dpp
, const std::string
& marker
, void **phandle
) = 0;
90 virtual int list_keys_next(const DoutPrefixProvider
*dpp
, void *handle
, int max
, std::list
<std::string
>& keys
, bool *truncated
) = 0;
91 virtual void list_keys_complete(void *handle
) = 0;
93 virtual std::string
get_marker(void *handle
) = 0;
95 virtual int get_shard_id(const std::string
& entry
, int *shard_id
) {
99 virtual int attach(RGWMetadataManager
*manager
);
102 class RGWMetadataHandler_GenericMetaBE
: public RGWMetadataHandler
{
103 friend class RGWSI_MetaBackend
;
104 friend class RGWMetadataManager
;
111 RGWSI_MetaBackend_Handler
*be_handler
;
113 virtual int do_get(RGWSI_MetaBackend_Handler::Op
*op
, std::string
& entry
, RGWMetadataObject
**obj
, optional_yield y
, const DoutPrefixProvider
*dpp
) = 0;
114 virtual int do_put(RGWSI_MetaBackend_Handler::Op
*op
, std::string
& entry
, RGWMetadataObject
*obj
,
115 RGWObjVersionTracker
& objv_tracker
, optional_yield y
,
116 const DoutPrefixProvider
*dpp
, RGWMDLogSyncType type
,
117 bool from_remote_zone
) = 0;
118 virtual int do_put_operate(Put
*put_op
, const DoutPrefixProvider
*dpp
);
119 virtual int do_remove(RGWSI_MetaBackend_Handler::Op
*op
, std::string
& entry
, RGWObjVersionTracker
& objv_tracker
, optional_yield y
, const DoutPrefixProvider
*dpp
) = 0;
122 RGWMetadataHandler_GenericMetaBE() {}
124 void base_init(CephContext
*_cct
,
125 RGWSI_MetaBackend_Handler
*_be_handler
) {
126 RGWMetadataHandler::base_init(_cct
);
127 be_handler
= _be_handler
;
130 RGWSI_MetaBackend_Handler
*get_be_handler() {
136 RGWMetadataHandler_GenericMetaBE
*handler
;
137 RGWSI_MetaBackend_Handler::Op
*op
;
139 RGWMetadataObject
*obj
;
140 RGWObjVersionTracker
& objv_tracker
;
141 RGWMDLogSyncType apply_type
;
143 bool from_remote_zone
{false};
145 int get(RGWMetadataObject
**obj
, const DoutPrefixProvider
*dpp
) {
146 return handler
->do_get(op
, entry
, obj
, y
, dpp
);
149 Put(RGWMetadataHandler_GenericMetaBE
*_handler
, RGWSI_MetaBackend_Handler::Op
*_op
,
150 std::string
& _entry
, RGWMetadataObject
*_obj
,
151 RGWObjVersionTracker
& _objv_tracker
, optional_yield _y
,
152 RGWMDLogSyncType _type
, bool from_remote_zone
);
156 virtual int put_pre(const DoutPrefixProvider
*dpp
) {
159 virtual int put(const DoutPrefixProvider
*dpp
) {
162 virtual int put_post(const DoutPrefixProvider
*dpp
) {
165 virtual int finalize() {
170 int get(std::string
& entry
, RGWMetadataObject
**obj
, optional_yield
, const DoutPrefixProvider
*dpp
) override
;
171 int put(std::string
& entry
, RGWMetadataObject
*obj
, RGWObjVersionTracker
& objv_tracker
, optional_yield
, const DoutPrefixProvider
*dpp
, RGWMDLogSyncType type
, bool from_remote_zone
) override
;
172 int remove(std::string
& entry
, RGWObjVersionTracker
& objv_tracker
, optional_yield
, const DoutPrefixProvider
*dpp
) override
;
174 int mutate(const std::string
& entry
,
175 const ceph::real_time
& mtime
,
176 RGWObjVersionTracker
*objv_tracker
,
178 const DoutPrefixProvider
*dpp
,
179 RGWMDLogStatus op_type
,
180 std::function
<int()> f
) override
;
182 int get_shard_id(const std::string
& entry
, int *shard_id
) override
;
184 int list_keys_init(const DoutPrefixProvider
*dpp
, const std::string
& marker
, void **phandle
) override
;
185 int list_keys_next(const DoutPrefixProvider
*dpp
, void *handle
, int max
, std::list
<std::string
>& keys
, bool *truncated
) override
;
186 void list_keys_complete(void *handle
) override
;
188 std::string
get_marker(void *handle
) override
;
191 * Compare an incoming versus on-disk tag/version+mtime combo against
192 * the sync mode to see if the new one should replace the on-disk one.
194 * @return true if the update should proceed, false otherwise.
196 static bool check_versions(bool exists
,
197 const obj_version
& ondisk
, const real_time
& ondisk_time
,
198 const obj_version
& incoming
, const real_time
& incoming_time
,
199 RGWMDLogSyncType sync_mode
) {
202 if ((ondisk
.tag
!= incoming
.tag
) ||
203 (ondisk
.ver
>= incoming
.ver
))
207 if (ondisk_time
>= incoming_time
)
210 case APPLY_EXCLUSIVE
:
214 case APPLY_ALWAYS
: //deliberate fall-thru -- we always apply!
221 class RGWMetadataTopHandler
;
223 class RGWMetadataManager
{
224 friend class RGWMetadataHandler
;
227 RGWSI_Meta
*meta_svc
;
228 std::map
<std::string
, RGWMetadataHandler
*> handlers
;
229 std::unique_ptr
<RGWMetadataTopHandler
> md_top_handler
;
231 int find_handler(const std::string
& metadata_key
, RGWMetadataHandler
**handler
, std::string
& entry
);
232 int register_handler(RGWMetadataHandler
*handler
);
235 RGWMetadataManager(RGWSI_Meta
*_meta_svc
);
236 ~RGWMetadataManager();
238 RGWMetadataHandler
*get_handler(const std::string
& type
);
240 int get(std::string
& metadata_key
, Formatter
*f
, optional_yield y
, const DoutPrefixProvider
*dpp
);
241 int put(std::string
& metadata_key
, bufferlist
& bl
, optional_yield y
,
242 const DoutPrefixProvider
*dpp
,
243 RGWMDLogSyncType sync_mode
,
244 bool from_remote_zone
,
245 obj_version
*existing_version
= NULL
);
246 int remove(std::string
& metadata_key
, optional_yield y
, const DoutPrefixProvider
*dpp
);
248 int mutate(const std::string
& metadata_key
,
249 const ceph::real_time
& mtime
,
250 RGWObjVersionTracker
*objv_tracker
,
252 const DoutPrefixProvider
*dpp
,
253 RGWMDLogStatus op_type
,
254 std::function
<int()> f
);
256 int list_keys_init(const DoutPrefixProvider
*dpp
, const std::string
& section
, void **phandle
);
257 int list_keys_init(const DoutPrefixProvider
*dpp
, const std::string
& section
, const std::string
& marker
, void **phandle
);
258 int list_keys_next(const DoutPrefixProvider
*dpp
, void *handle
, int max
, std::list
<std::string
>& keys
, bool *truncated
);
259 void list_keys_complete(void *handle
);
261 std::string
get_marker(void *handle
);
263 void dump_log_entry(cls_log_entry
& entry
, Formatter
*f
);
265 void get_sections(std::list
<std::string
>& sections
);
267 void parse_metadata_key(const std::string
& metadata_key
, std::string
& type
, std::string
& entry
);
269 int get_shard_id(const std::string
& section
, const std::string
& key
, int *shard_id
);
272 class RGWMetadataHandlerPut_SObj
: public RGWMetadataHandler_GenericMetaBE::Put
275 std::unique_ptr
<RGWMetadataObject
> oo
;
276 RGWMetadataObject
*old_obj
{nullptr};
280 RGWMetadataHandlerPut_SObj(RGWMetadataHandler_GenericMetaBE
*handler
, RGWSI_MetaBackend_Handler::Op
*op
,
281 std::string
& entry
, RGWMetadataObject
*obj
, RGWObjVersionTracker
& objv_tracker
,
283 RGWMDLogSyncType type
, bool from_remote_zone
);
284 ~RGWMetadataHandlerPut_SObj();
286 int put_pre(const DoutPrefixProvider
*dpp
) override
;
287 int put(const DoutPrefixProvider
*dpp
) override
;
288 virtual int put_check(const DoutPrefixProvider
*dpp
) {
291 virtual int put_checked(const DoutPrefixProvider
*dpp
);
292 virtual void encode_obj(bufferlist
*bl
) {}
295 void rgw_shard_name(const std::string
& prefix
, unsigned max_shards
, const std::string
& key
, std::string
& name
, int *shard_id
);
296 void rgw_shard_name(const std::string
& prefix
, unsigned max_shards
, const std::string
& section
, const std::string
& key
, std::string
& name
);
297 void rgw_shard_name(const std::string
& prefix
, unsigned shard_id
, std::string
& name
);