1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
4 #ifndef CEPH_RGW_BUCKET_H
5 #define CEPH_RGW_BUCKET_H
11 #include <boost/container/flat_map.hpp>
12 #include <boost/container/flat_set.hpp>
14 #include "include/types.h"
15 #include "rgw_common.h"
16 #include "rgw_tools.h"
17 #include "rgw_metadata.h"
19 #include "rgw_string.h"
21 #include "common/Formatter.h"
22 #include "common/lru_map.h"
23 #include "common/ceph_time.h"
25 #include "rgw_formats.h"
27 #include "services/svc_bucket_types.h"
28 #include "services/svc_bucket_sync.h"
30 // define as static when RGWBucket implementation completes
31 extern void rgw_get_buckets_obj(const rgw_user
& user_id
, string
& buckets_obj_id
);
34 class RGWBucketMetadataHandler
;
35 class RGWBucketInstanceMetadataHandler
;
40 namespace rgw
{ namespace sal
{
45 extern int rgw_bucket_parse_bucket_instance(const string
& bucket_instance
, string
*bucket_name
, string
*bucket_id
, int *shard_id
);
46 extern int rgw_bucket_parse_bucket_key(CephContext
*cct
, const string
& key
,
47 rgw_bucket
* bucket
, int *shard_id
);
49 extern std::string
rgw_make_bucket_entry_name(const std::string
& tenant_name
,
50 const std::string
& bucket_name
);
52 extern void rgw_parse_url_bucket(const string
& bucket
,
53 const string
& auth_tenant
,
54 string
&tenant_name
, string
&bucket_name
);
56 // this is used as a filter to RGWRados::cls_bucket_list_ordered; it
57 // conforms to the type declaration of RGWRados::check_filter_t.
58 extern bool rgw_bucket_object_check_filter(const string
& oid
);
60 void init_default_bucket_layout(CephContext
*cct
, rgw::BucketLayout
& layout
,
62 std::optional
<uint32_t> shards
,
63 std::optional
<rgw::BucketIndexType
> type
);
65 struct RGWBucketCompleteInfo
{
67 map
<string
, bufferlist
> attrs
;
69 void dump(Formatter
*f
) const;
70 void decode_json(JSONObj
*obj
);
73 class RGWBucketEntryMetadataObject
: public RGWMetadataObject
{
74 RGWBucketEntryPoint ep
;
75 map
<string
, bufferlist
> attrs
;
77 RGWBucketEntryMetadataObject(RGWBucketEntryPoint
& _ep
, const obj_version
& v
, real_time m
) : ep(_ep
) {
82 RGWBucketEntryMetadataObject(RGWBucketEntryPoint
& _ep
, const obj_version
& v
, real_time m
, std::map
<string
, bufferlist
>&& _attrs
) :
83 ep(_ep
), attrs(std::move(_attrs
)) {
89 void dump(Formatter
*f
) const override
{
93 RGWBucketEntryPoint
& get_ep() {
97 map
<string
, bufferlist
>& get_attrs() {
102 class RGWBucketInstanceMetadataObject
: public RGWMetadataObject
{
103 RGWBucketCompleteInfo info
;
105 RGWBucketInstanceMetadataObject() {}
106 RGWBucketInstanceMetadataObject(RGWBucketCompleteInfo
& i
, const obj_version
& v
, real_time m
) : info(i
) {
111 void dump(Formatter
*f
) const override
{
115 void decode_json(JSONObj
*obj
) {
116 info
.decode_json(obj
);
119 RGWBucketCompleteInfo
& get_bci() {
122 RGWBucketInfo
& get_bucket_info() {
128 * Store a list of the user's buckets, with associated functinos.
132 std::map
<std::string
, RGWBucketEnt
> buckets
;
135 RGWUserBuckets() = default;
136 RGWUserBuckets(RGWUserBuckets
&&) = default;
138 RGWUserBuckets
& operator=(const RGWUserBuckets
&) = default;
140 void encode(bufferlist
& bl
) const {
144 void decode(bufferlist::const_iterator
& bl
) {
149 * Check if the user owns a bucket by the given name.
151 bool owns(string
& name
) {
152 map
<string
, RGWBucketEnt
>::iterator iter
;
153 iter
= buckets
.find(name
);
154 return (iter
!= buckets
.end());
158 * Add a (created) bucket to the user's bucket list.
160 void add(const RGWBucketEnt
& bucket
) {
161 buckets
[bucket
.bucket
.name
] = bucket
;
165 * Remove a bucket from the user's list by name.
167 void remove(const string
& name
) {
168 map
<string
, RGWBucketEnt
>::iterator iter
;
169 iter
= buckets
.find(name
);
170 if (iter
!= buckets
.end()) {
176 * Get the user's buckets as a map.
178 map
<string
, RGWBucketEnt
>& get_buckets() { return buckets
; }
181 * Cleanup data structure
183 void clear() { buckets
.clear(); }
185 size_t count() { return buckets
.size(); }
187 WRITE_CLASS_ENCODER(RGWUserBuckets
)
189 class RGWBucketMetadataHandlerBase
: public RGWMetadataHandler_GenericMetaBE
{
191 virtual ~RGWBucketMetadataHandlerBase() {}
192 virtual void init(RGWSI_Bucket
*bucket_svc
,
193 RGWBucketCtl
*bucket_ctl
) = 0;
197 class RGWBucketInstanceMetadataHandlerBase
: public RGWMetadataHandler_GenericMetaBE
{
199 virtual ~RGWBucketInstanceMetadataHandlerBase() {}
200 virtual void init(RGWSI_Zone
*zone_svc
,
201 RGWSI_Bucket
*bucket_svc
,
202 RGWSI_BucketIndex
*bi_svc
) = 0;
205 class RGWBucketMetaHandlerAllocator
{
207 static RGWBucketMetadataHandlerBase
*alloc();
210 class RGWBucketInstanceMetaHandlerAllocator
{
212 static RGWBucketInstanceMetadataHandlerBase
*alloc();
215 class RGWArchiveBucketMetaHandlerAllocator
{
217 static RGWBucketMetadataHandlerBase
*alloc();
220 class RGWArchiveBucketInstanceMetaHandlerAllocator
{
222 static RGWBucketInstanceMetadataHandlerBase
*alloc();
226 * Get all the buckets owned by a user and fill up an RGWUserBuckets with them.
227 * Returns: 0 on success, -ERR# on failure.
229 extern int rgw_read_user_buckets(const DoutPrefixProvider
*dpp
,
230 rgw::sal::RGWRadosStore
*store
,
231 const rgw_user
& user_id
,
232 rgw::sal::RGWBucketList
& buckets
,
233 const string
& marker
,
234 const string
& end_marker
,
239 extern int rgw_remove_object(const DoutPrefixProvider
*dpp
, rgw::sal::RGWRadosStore
*store
, const RGWBucketInfo
& bucket_info
, const rgw_bucket
& bucket
, rgw_obj_key
& key
);
240 extern int rgw_remove_bucket_bypass_gc(rgw::sal::RGWRadosStore
*store
, rgw_bucket
& bucket
, int concurrent_max
, optional_yield y
);
242 extern int rgw_object_get_attr(rgw::sal::RGWRadosStore
* store
, const RGWBucketInfo
& bucket_info
,
243 const rgw_obj
& obj
, const char* attr_name
,
244 bufferlist
& out_bl
, optional_yield y
);
246 extern void check_bad_user_bucket_mapping(rgw::sal::RGWRadosStore
*store
, const rgw_user
& user_id
, bool fix
, optional_yield y
, const DoutPrefixProvider
*dpp
);
248 struct RGWBucketAdminOpState
{
250 std::string display_name
;
251 std::string bucket_name
;
252 std::string bucket_id
;
253 std::string object_name
;
254 std::string new_bucket_name
;
260 bool delete_child_objects
;
269 void set_fetch_stats(bool value
) { stat_buckets
= value
; }
270 void set_check_objects(bool value
) { check_objects
= value
; }
271 void set_fix_index(bool value
) { fix_index
= value
; }
272 void set_delete_children(bool value
) { delete_child_objects
= value
; }
274 void set_max_aio(int value
) { max_aio
= value
; }
276 void set_user_id(const rgw_user
& user_id
) {
277 if (!user_id
.empty())
280 void set_tenant(const std::string
& tenant_str
) {
281 uid
.tenant
= tenant_str
;
283 void set_bucket_name(const std::string
& bucket_str
) {
284 bucket_name
= bucket_str
;
286 void set_object(std::string
& object_str
) {
287 object_name
= object_str
;
289 void set_new_bucket_name(std::string
& new_bucket_str
) {
290 new_bucket_name
= new_bucket_str
;
292 void set_quota(RGWQuotaInfo
& value
) {
297 void set_sync_bucket(bool value
) { sync_bucket
= value
; }
299 rgw_user
& get_user_id() { return uid
; }
300 std::string
& get_user_display_name() { return display_name
; }
301 std::string
& get_bucket_name() { return bucket_name
; }
302 std::string
& get_object_name() { return object_name
; }
303 std::string
& get_tenant() { return uid
.tenant
; }
305 rgw_bucket
& get_bucket() { return bucket
; }
306 void set_bucket(rgw_bucket
& _bucket
) {
308 bucket_stored
= true;
311 void set_bucket_id(const string
& bi
) {
314 const string
& get_bucket_id() { return bucket_id
; }
316 bool will_fetch_stats() { return stat_buckets
; }
317 bool will_fix_index() { return fix_index
; }
318 bool will_delete_children() { return delete_child_objects
; }
319 bool will_check_objects() { return check_objects
; }
320 bool is_user_op() { return !uid
.empty(); }
321 bool is_system_op() { return uid
.empty(); }
322 bool has_bucket_stored() { return bucket_stored
; }
323 int get_max_aio() { return max_aio
; }
324 bool will_sync_bucket() { return sync_bucket
; }
326 RGWBucketAdminOpState() : list_buckets(false), stat_buckets(false), check_objects(false),
327 fix_index(false), delete_child_objects(false),
328 bucket_stored(false), sync_bucket(true) {}
332 * A simple wrapper class for administrative bucket operations
337 RGWUserBuckets buckets
;
338 rgw::sal::RGWRadosStore
*store
;
339 RGWAccessHandle handle
;
341 RGWUserInfo user_info
;
346 RGWBucketInfo bucket_info
;
347 RGWObjVersionTracker ep_objv
; // entrypoint object version
350 RGWBucket() : store(NULL
), handle(NULL
), failure(false) {}
351 int init(rgw::sal::RGWRadosStore
*storage
, RGWBucketAdminOpState
& op_state
, optional_yield y
,
352 const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
, map
<string
, bufferlist
> *pattrs
= NULL
);
354 int check_bad_index_multipart(RGWBucketAdminOpState
& op_state
,
355 RGWFormatterFlusher
& flusher
,
356 const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
358 int check_object_index(const DoutPrefixProvider
*dpp
,
359 RGWBucketAdminOpState
& op_state
,
360 RGWFormatterFlusher
& flusher
,
362 std::string
*err_msg
= NULL
);
364 int check_index(const DoutPrefixProvider
*dpp
,
365 RGWBucketAdminOpState
& op_state
,
366 map
<RGWObjCategory
, RGWStorageStats
>& existing_stats
,
367 map
<RGWObjCategory
, RGWStorageStats
>& calculated_stats
,
368 std::string
*err_msg
= NULL
);
370 int link(RGWBucketAdminOpState
& op_state
, optional_yield y
, const DoutPrefixProvider
*dpp
,
371 map
<string
, bufferlist
>& attrs
, std::string
*err_msg
= NULL
);
372 int chown(RGWBucketAdminOpState
& op_state
, const string
& marker
,
373 optional_yield y
, const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
374 int unlink(RGWBucketAdminOpState
& op_state
, optional_yield y
, const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
375 int set_quota(RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
377 int remove_object(const DoutPrefixProvider
*dpp
, RGWBucketAdminOpState
& op_state
, std::string
*err_msg
= NULL
);
378 int policy_bl_to_stream(bufferlist
& bl
, ostream
& o
);
379 int get_policy(RGWBucketAdminOpState
& op_state
, RGWAccessControlPolicy
& policy
, optional_yield y
, const DoutPrefixProvider
*dpp
);
380 int sync(RGWBucketAdminOpState
& op_state
, map
<string
, bufferlist
> *attrs
, const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
382 void clear_failure() { failure
= false; }
384 const RGWBucketInfo
& get_bucket_info() const { return bucket_info
; }
387 class RGWBucketAdminOp
390 static int get_policy(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
,
391 RGWFormatterFlusher
& flusher
, const DoutPrefixProvider
*dpp
);
392 static int get_policy(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
,
393 RGWAccessControlPolicy
& policy
, const DoutPrefixProvider
*dpp
);
394 static int dump_s3_policy(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
,
395 ostream
& os
, const DoutPrefixProvider
*dpp
);
397 static int unlink(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
);
398 static int link(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
, string
*err_msg
= NULL
);
399 static int chown(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
, const string
& marker
, const DoutPrefixProvider
*dpp
, string
*err_msg
= NULL
);
401 static int check_index(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
,
402 RGWFormatterFlusher
& flusher
, optional_yield y
, const DoutPrefixProvider
*dpp
);
404 static int remove_bucket(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
, optional_yield y
,
405 const DoutPrefixProvider
*dpp
, bool bypass_gc
= false, bool keep_index_consistent
= true);
406 static int remove_object(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
);
407 static int info(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
, RGWFormatterFlusher
& flusher
, optional_yield y
, const DoutPrefixProvider
*dpp
);
408 static int limit_check(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
,
409 const std::list
<std::string
>& user_ids
,
410 RGWFormatterFlusher
& flusher
, optional_yield y
,
411 const DoutPrefixProvider
*dpp
,
412 bool warnings_only
= false);
413 static int set_quota(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
);
415 static int list_stale_instances(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
,
416 RGWFormatterFlusher
& flusher
, const DoutPrefixProvider
*dpp
);
418 static int clear_stale_instances(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
,
419 RGWFormatterFlusher
& flusher
, const DoutPrefixProvider
*dpp
);
420 static int fix_lc_shards(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
,
421 RGWFormatterFlusher
& flusher
, const DoutPrefixProvider
*dpp
);
422 static int fix_obj_expiry(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
,
423 RGWFormatterFlusher
& flusher
, const DoutPrefixProvider
*dpp
, bool dry_run
= false);
425 static int sync_bucket(rgw::sal::RGWRadosStore
*store
, RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
, string
*err_msg
= NULL
);
429 RGWBucketEntryPoint
&ep
;
430 map
<std::string
, buffer::list
>& attrs
;
431 RGWObjVersionTracker ep_objv
;
432 rgw_ep_info(RGWBucketEntryPoint
&ep
, map
<string
, bufferlist
>& attrs
)
433 : ep(ep
), attrs(attrs
) {}
441 RGWSI_Zone
*zone
{nullptr};
442 RGWSI_Bucket
*bucket
{nullptr};
443 RGWSI_Bucket_Sync
*bucket_sync
{nullptr};
444 RGWSI_BucketIndex
*bi
{nullptr};
448 RGWUserCtl
*user
{nullptr};
451 RGWBucketMetadataHandler
*bm_handler
;
452 RGWBucketInstanceMetadataHandler
*bmi_handler
;
454 RGWSI_Bucket_BE_Handler bucket_be_handler
; /* bucket backend handler */
455 RGWSI_BucketInstance_BE_Handler bi_be_handler
; /* bucket instance backend handler */
457 int call(std::function
<int(RGWSI_Bucket_X_Ctx
& ctx
)> f
);
460 RGWBucketCtl(RGWSI_Zone
*zone_svc
,
461 RGWSI_Bucket
*bucket_svc
,
462 RGWSI_Bucket_Sync
*bucket_sync_svc
,
463 RGWSI_BucketIndex
*bi_svc
);
465 void init(RGWUserCtl
*user_ctl
,
466 RGWBucketMetadataHandler
*_bm_handler
,
467 RGWBucketInstanceMetadataHandler
*_bmi_handler
,
468 RGWDataChangesLog
*datalog
,
469 const DoutPrefixProvider
*dpp
);
473 RGWObjVersionTracker
*objv_tracker
{nullptr};
474 real_time
*mtime
{nullptr};
475 map
<string
, bufferlist
> *attrs
{nullptr};
476 rgw_cache_entry_info
*cache_info
{nullptr};
477 boost::optional
<obj_version
> refresh_version
;
478 std::optional
<RGWSI_MetaBackend_CtxParams
> bectx_params
;
482 GetParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
483 objv_tracker
= _objv_tracker
;
487 GetParams
& set_mtime(ceph::real_time
*_mtime
) {
492 GetParams
& set_attrs(map
<string
, bufferlist
> *_attrs
) {
497 GetParams
& set_cache_info(rgw_cache_entry_info
*_cache_info
) {
498 cache_info
= _cache_info
;
502 GetParams
& set_refresh_version(const obj_version
& _refresh_version
) {
503 refresh_version
= _refresh_version
;
507 GetParams
& set_bectx_params(std::optional
<RGWSI_MetaBackend_CtxParams
> _bectx_params
) {
508 bectx_params
= _bectx_params
;
514 RGWObjVersionTracker
*objv_tracker
{nullptr};
515 ceph::real_time mtime
;
516 bool exclusive
{false};
517 map
<string
, bufferlist
> *attrs
{nullptr};
521 PutParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
522 objv_tracker
= _objv_tracker
;
526 PutParams
& set_mtime(const ceph::real_time
& _mtime
) {
531 PutParams
& set_exclusive(bool _exclusive
) {
532 exclusive
= _exclusive
;
536 PutParams
& set_attrs(map
<string
, bufferlist
> *_attrs
) {
542 struct RemoveParams
{
543 RGWObjVersionTracker
*objv_tracker
{nullptr};
547 RemoveParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
548 objv_tracker
= _objv_tracker
;
554 struct BucketInstance
{
556 real_time
*mtime
{nullptr};
557 map
<string
, bufferlist
> *attrs
{nullptr};
558 rgw_cache_entry_info
*cache_info
{nullptr};
559 boost::optional
<obj_version
> refresh_version
;
560 RGWObjVersionTracker
*objv_tracker
{nullptr};
561 std::optional
<RGWSI_MetaBackend_CtxParams
> bectx_params
;
565 GetParams
& set_mtime(ceph::real_time
*_mtime
) {
570 GetParams
& set_attrs(map
<string
, bufferlist
> *_attrs
) {
575 GetParams
& set_cache_info(rgw_cache_entry_info
*_cache_info
) {
576 cache_info
= _cache_info
;
580 GetParams
& set_refresh_version(const obj_version
& _refresh_version
) {
581 refresh_version
= _refresh_version
;
585 GetParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
586 objv_tracker
= _objv_tracker
;
590 GetParams
& set_bectx_params(std::optional
<RGWSI_MetaBackend_CtxParams
> _bectx_params
) {
591 bectx_params
= _bectx_params
;
597 std::optional
<RGWBucketInfo
*> orig_info
; /* nullopt: orig_info was not fetched,
598 nullptr: orig_info was not found (new bucket instance */
599 ceph::real_time mtime
;
600 bool exclusive
{false};
601 map
<string
, bufferlist
> *attrs
{nullptr};
602 RGWObjVersionTracker
*objv_tracker
{nullptr};
606 PutParams
& set_orig_info(RGWBucketInfo
*pinfo
) {
611 PutParams
& set_mtime(const ceph::real_time
& _mtime
) {
616 PutParams
& set_exclusive(bool _exclusive
) {
617 exclusive
= _exclusive
;
621 PutParams
& set_attrs(map
<string
, bufferlist
> *_attrs
) {
626 PutParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
627 objv_tracker
= _objv_tracker
;
632 struct RemoveParams
{
633 RGWObjVersionTracker
*objv_tracker
{nullptr};
637 RemoveParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
638 objv_tracker
= _objv_tracker
;
644 /* bucket entrypoint */
645 int read_bucket_entrypoint_info(const rgw_bucket
& bucket
,
646 RGWBucketEntryPoint
*info
,
648 const DoutPrefixProvider
*dpp
,
649 const Bucket::GetParams
& params
= {});
650 int store_bucket_entrypoint_info(const rgw_bucket
& bucket
,
651 RGWBucketEntryPoint
& info
,
653 const DoutPrefixProvider
*dpp
,
654 const Bucket::PutParams
& params
= {});
655 int remove_bucket_entrypoint_info(const rgw_bucket
& bucket
,
657 const DoutPrefixProvider
*dpp
,
658 const Bucket::RemoveParams
& params
= {});
660 /* bucket instance */
661 int read_bucket_instance_info(const rgw_bucket
& bucket
,
664 const DoutPrefixProvider
*dpp
,
665 const BucketInstance::GetParams
& params
= {});
666 int store_bucket_instance_info(const rgw_bucket
& bucket
,
669 const DoutPrefixProvider
*dpp
,
670 const BucketInstance::PutParams
& params
= {});
671 int remove_bucket_instance_info(const rgw_bucket
& bucket
,
674 const DoutPrefixProvider
*dpp
,
675 const BucketInstance::RemoveParams
& params
= {});
678 * bucket_id may or may not be provided
680 * ep_objv_tracker might not be populated even if provided. Will only be set if entrypoint is read
681 * (that is: if bucket_id is empty).
683 int read_bucket_info(const rgw_bucket
& bucket
,
686 const DoutPrefixProvider
*dpp
,
687 const BucketInstance::GetParams
& params
= {},
688 RGWObjVersionTracker
*ep_objv_tracker
= nullptr);
691 int set_bucket_instance_attrs(RGWBucketInfo
& bucket_info
,
692 map
<string
, bufferlist
>& attrs
,
693 RGWObjVersionTracker
*objv_tracker
,
695 const DoutPrefixProvider
*dpp
);
698 int link_bucket(const rgw_user
& user_id
,
699 const rgw_bucket
& bucket
,
700 ceph::real_time creation_time
,
702 const DoutPrefixProvider
*dpp
,
703 bool update_entrypoint
= true,
704 rgw_ep_info
*pinfo
= nullptr);
706 int unlink_bucket(const rgw_user
& user_id
,
707 const rgw_bucket
& bucket
,
709 const DoutPrefixProvider
*dpp
,
710 bool update_entrypoint
= true);
712 int chown(rgw::sal::RGWRadosStore
*store
, RGWBucketInfo
& bucket_info
,
713 const rgw_user
& user_id
, const std::string
& display_name
,
714 const std::string
& marker
, optional_yield y
, const DoutPrefixProvider
*dpp
);
716 int set_acl(ACLOwner
& owner
, rgw_bucket
& bucket
,
717 RGWBucketInfo
& bucket_info
, bufferlist
& bl
, optional_yield y
,
718 const DoutPrefixProvider
*dpp
);
720 int read_buckets_stats(map
<string
, RGWBucketEnt
>& m
,
722 const DoutPrefixProvider
*dpp
);
724 int read_bucket_stats(const rgw_bucket
& bucket
,
725 RGWBucketEnt
*result
,
727 const DoutPrefixProvider
*dpp
);
730 int sync_user_stats(const DoutPrefixProvider
*dpp
,
731 const rgw_user
& user_id
, const RGWBucketInfo
& bucket_info
,
733 RGWBucketEnt
* pent
= nullptr);
736 int get_sync_policy_handler(std::optional
<rgw_zone_id
> zone
,
737 std::optional
<rgw_bucket
> bucket
,
738 RGWBucketSyncPolicyHandlerRef
*phandler
,
740 const DoutPrefixProvider
*dpp
);
741 int bucket_exports_data(const rgw_bucket
& bucket
,
743 const DoutPrefixProvider
*dpp
);
744 int bucket_imports_data(const rgw_bucket
& bucket
,
746 const DoutPrefixProvider
*dpp
);
749 int convert_old_bucket_info(RGWSI_Bucket_X_Ctx
& ctx
,
750 const rgw_bucket
& bucket
,
752 const DoutPrefixProvider
*dpp
);
754 int do_store_bucket_instance_info(RGWSI_Bucket_BI_Ctx
& ctx
,
755 const rgw_bucket
& bucket
,
758 const DoutPrefixProvider
*dpp
,
759 const BucketInstance::PutParams
& params
);
761 int do_store_linked_bucket_info(RGWSI_Bucket_X_Ctx
& ctx
,
763 RGWBucketInfo
*orig_info
,
764 bool exclusive
, real_time mtime
,
765 obj_version
*pep_objv
,
766 map
<string
, bufferlist
> *pattrs
,
767 bool create_entry_point
,
769 const DoutPrefixProvider
*dpp
);
771 int do_link_bucket(RGWSI_Bucket_EP_Ctx
& ctx
,
772 const rgw_user
& user
,
773 const rgw_bucket
& bucket
,
774 ceph::real_time creation_time
,
775 bool update_entrypoint
,
778 const DoutPrefixProvider
*dpp
);
780 int do_unlink_bucket(RGWSI_Bucket_EP_Ctx
& ctx
,
781 const rgw_user
& user_id
,
782 const rgw_bucket
& bucket
,
783 bool update_entrypoint
,
785 const DoutPrefixProvider
*dpp
);
789 bool rgw_find_bucket_by_id(const DoutPrefixProvider
*dpp
, CephContext
*cct
, RGWMetadataManager
*mgr
, const string
& marker
,
790 const string
& bucket_id
, rgw_bucket
* bucket_out
);