1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
10 #include <boost/container/flat_map.hpp>
11 #include <boost/container/flat_set.hpp>
13 #include "include/types.h"
14 #include "rgw_common.h"
15 #include "rgw_tools.h"
16 #include "rgw_metadata.h"
17 #include "rgw/rgw_bucket.h"
19 #include "rgw_string.h"
22 #include "common/Formatter.h"
23 #include "common/lru_map.h"
24 #include "common/ceph_time.h"
26 #include "rgw_formats.h"
28 #include "services/svc_bucket_types.h"
29 #include "services/svc_bucket_sync.h"
31 // define as static when RGWBucket implementation completes
32 extern void rgw_get_buckets_obj(const rgw_user
& user_id
, std::string
& buckets_obj_id
);
35 class RGWBucketMetadataHandler
;
36 class RGWBucketInstanceMetadataHandler
;
42 // this is used as a filter to RGWRados::cls_bucket_list_ordered; it
43 // conforms to the type RGWBucketListNameFilter
44 extern bool rgw_bucket_object_check_filter(const std::string
& oid
);
46 void init_default_bucket_layout(CephContext
*cct
, rgw::BucketLayout
& layout
,
48 std::optional
<uint32_t> shards
,
49 std::optional
<rgw::BucketIndexType
> type
);
51 struct RGWBucketCompleteInfo
{
53 std::map
<std::string
, bufferlist
> attrs
;
55 void dump(Formatter
*f
) const;
56 void decode_json(JSONObj
*obj
);
59 class RGWBucketEntryMetadataObject
: public RGWMetadataObject
{
60 RGWBucketEntryPoint ep
;
61 std::map
<std::string
, bufferlist
> attrs
;
63 RGWBucketEntryMetadataObject(RGWBucketEntryPoint
& _ep
, const obj_version
& v
, real_time m
) : ep(_ep
) {
68 RGWBucketEntryMetadataObject(RGWBucketEntryPoint
& _ep
, const obj_version
& v
, real_time m
, std::map
<std::string
, bufferlist
>&& _attrs
) :
69 ep(_ep
), attrs(std::move(_attrs
)) {
75 void dump(Formatter
*f
) const override
{
79 RGWBucketEntryPoint
& get_ep() {
83 std::map
<std::string
, bufferlist
>& get_attrs() {
88 class RGWBucketInstanceMetadataObject
: public RGWMetadataObject
{
89 RGWBucketCompleteInfo info
;
91 RGWBucketInstanceMetadataObject() {}
92 RGWBucketInstanceMetadataObject(RGWBucketCompleteInfo
& i
, const obj_version
& v
, real_time m
) : info(i
) {
97 void dump(Formatter
*f
) const override
{
101 void decode_json(JSONObj
*obj
) {
102 info
.decode_json(obj
);
105 RGWBucketCompleteInfo
& get_bci() {
108 RGWBucketInfo
& get_bucket_info() {
114 * store a list of the user's buckets, with associated functinos.
116 class RGWUserBuckets
{
117 std::map
<std::string
, RGWBucketEnt
> buckets
;
120 RGWUserBuckets() = default;
121 RGWUserBuckets(RGWUserBuckets
&&) = default;
123 RGWUserBuckets
& operator=(const RGWUserBuckets
&) = default;
125 void encode(bufferlist
& bl
) const {
129 void decode(bufferlist::const_iterator
& bl
) {
134 * Check if the user owns a bucket by the given name.
136 bool owns(std::string
& name
) {
137 std::map
<std::string
, RGWBucketEnt
>::iterator iter
;
138 iter
= buckets
.find(name
);
139 return (iter
!= buckets
.end());
143 * Add a (created) bucket to the user's bucket list.
145 void add(const RGWBucketEnt
& bucket
) {
146 buckets
[bucket
.bucket
.name
] = bucket
;
150 * Remove a bucket from the user's list by name.
152 void remove(const std::string
& name
) {
153 std::map
<std::string
, RGWBucketEnt
>::iterator iter
;
154 iter
= buckets
.find(name
);
155 if (iter
!= buckets
.end()) {
161 * Get the user's buckets as a map.
163 std::map
<std::string
, RGWBucketEnt
>& get_buckets() { return buckets
; }
166 * Cleanup data structure
168 void clear() { buckets
.clear(); }
170 size_t count() { return buckets
.size(); }
172 WRITE_CLASS_ENCODER(RGWUserBuckets
)
174 class RGWBucketMetadataHandlerBase
: public RGWMetadataHandler_GenericMetaBE
{
176 virtual ~RGWBucketMetadataHandlerBase() {}
177 virtual void init(RGWSI_Bucket
*bucket_svc
,
178 RGWBucketCtl
*bucket_ctl
) = 0;
182 class RGWBucketInstanceMetadataHandlerBase
: public RGWMetadataHandler_GenericMetaBE
{
184 virtual ~RGWBucketInstanceMetadataHandlerBase() {}
185 virtual void init(RGWSI_Zone
*zone_svc
,
186 RGWSI_Bucket
*bucket_svc
,
187 RGWSI_BucketIndex
*bi_svc
) = 0;
190 class RGWBucketMetaHandlerAllocator
{
192 static RGWBucketMetadataHandlerBase
*alloc();
195 class RGWBucketInstanceMetaHandlerAllocator
{
197 static RGWBucketInstanceMetadataHandlerBase
*alloc(rgw::sal::Driver
* driver
);
200 class RGWArchiveBucketMetaHandlerAllocator
{
202 static RGWBucketMetadataHandlerBase
*alloc();
205 class RGWArchiveBucketInstanceMetaHandlerAllocator
{
207 static RGWBucketInstanceMetadataHandlerBase
*alloc(rgw::sal::Driver
* driver
);
210 extern int rgw_remove_object(const DoutPrefixProvider
*dpp
, rgw::sal::Driver
* driver
, rgw::sal::Bucket
* bucket
, rgw_obj_key
& key
);
212 extern int rgw_object_get_attr(rgw::sal::Driver
* driver
, rgw::sal::Object
* obj
,
213 const char* attr_name
, bufferlist
& out_bl
,
216 extern void check_bad_user_bucket_mapping(rgw::sal::Driver
* driver
, rgw::sal::User
& user
, bool fix
, optional_yield y
, const DoutPrefixProvider
*dpp
);
218 struct RGWBucketAdminOpState
{
220 std::string display_name
;
221 std::string bucket_name
;
222 std::string bucket_id
;
223 std::string object_name
;
224 std::string new_bucket_name
;
230 bool delete_child_objects
;
235 std::unique_ptr
<rgw::sal::Bucket
> bucket
;
238 RGWRateLimitInfo ratelimit_info
;
240 void set_fetch_stats(bool value
) { stat_buckets
= value
; }
241 void set_check_objects(bool value
) { check_objects
= value
; }
242 void set_fix_index(bool value
) { fix_index
= value
; }
243 void set_delete_children(bool value
) { delete_child_objects
= value
; }
245 void set_max_aio(int value
) { max_aio
= value
; }
247 void set_user_id(const rgw_user
& user_id
) {
248 if (!user_id
.empty())
251 void set_tenant(const std::string
& tenant_str
) {
252 uid
.tenant
= tenant_str
;
254 void set_bucket_name(const std::string
& bucket_str
) {
255 bucket_name
= bucket_str
;
257 void set_object(std::string
& object_str
) {
258 object_name
= object_str
;
260 void set_new_bucket_name(std::string
& new_bucket_str
) {
261 new_bucket_name
= new_bucket_str
;
263 void set_quota(RGWQuotaInfo
& value
) {
266 void set_bucket_ratelimit(RGWRateLimitInfo
& value
) {
267 ratelimit_info
= value
;
271 void set_sync_bucket(bool value
) { sync_bucket
= value
; }
273 rgw_user
& get_user_id() { return uid
; }
274 std::string
& get_user_display_name() { return display_name
; }
275 std::string
& get_bucket_name() { return bucket_name
; }
276 std::string
& get_object_name() { return object_name
; }
277 std::string
& get_tenant() { return uid
.tenant
; }
279 rgw::sal::Bucket
* get_bucket() { return bucket
.get(); }
280 void set_bucket(std::unique_ptr
<rgw::sal::Bucket
> _bucket
) {
281 bucket
= std::move(_bucket
);
282 bucket_stored
= true;
285 void set_bucket_id(const std::string
& bi
) {
288 const std::string
& get_bucket_id() { return bucket_id
; }
290 bool will_fetch_stats() { return stat_buckets
; }
291 bool will_fix_index() { return fix_index
; }
292 bool will_delete_children() { return delete_child_objects
; }
293 bool will_check_objects() { return check_objects
; }
294 bool is_user_op() { return !uid
.empty(); }
295 bool is_system_op() { return uid
.empty(); }
296 bool has_bucket_stored() { return bucket_stored
; }
297 int get_max_aio() { return max_aio
; }
298 bool will_sync_bucket() { return sync_bucket
; }
300 RGWBucketAdminOpState() : list_buckets(false), stat_buckets(false), check_objects(false),
301 fix_index(false), delete_child_objects(false),
302 bucket_stored(false), sync_bucket(true) {}
307 * A simple wrapper class for administrative bucket operations
310 RGWUserBuckets buckets
;
311 rgw::sal::Driver
* driver
;
312 RGWAccessHandle handle
;
314 std::unique_ptr
<rgw::sal::Bucket
> bucket
;
315 std::unique_ptr
<rgw::sal::User
> user
;
319 RGWObjVersionTracker ep_objv
; // entrypoint object version
322 RGWBucket() : driver(NULL
), handle(NULL
), failure(false) {}
323 int init(rgw::sal::Driver
* storage
, RGWBucketAdminOpState
& op_state
, optional_yield y
,
324 const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
326 int check_bad_index_multipart(RGWBucketAdminOpState
& op_state
,
327 RGWFormatterFlusher
& flusher
,
328 const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
330 int check_object_index(const DoutPrefixProvider
*dpp
,
331 RGWBucketAdminOpState
& op_state
,
332 RGWFormatterFlusher
& flusher
,
334 std::string
*err_msg
= NULL
);
336 int check_index(const DoutPrefixProvider
*dpp
,
337 RGWBucketAdminOpState
& op_state
,
338 std::map
<RGWObjCategory
, RGWStorageStats
>& existing_stats
,
339 std::map
<RGWObjCategory
, RGWStorageStats
>& calculated_stats
,
340 std::string
*err_msg
= NULL
);
342 int chown(RGWBucketAdminOpState
& op_state
, const std::string
& marker
,
343 optional_yield y
, const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
344 int set_quota(RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
346 int remove_object(const DoutPrefixProvider
*dpp
, RGWBucketAdminOpState
& op_state
, std::string
*err_msg
= NULL
);
347 int policy_bl_to_stream(bufferlist
& bl
, std::ostream
& o
);
348 int get_policy(RGWBucketAdminOpState
& op_state
, RGWAccessControlPolicy
& policy
, optional_yield y
, const DoutPrefixProvider
*dpp
);
349 int sync(RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
351 void clear_failure() { failure
= false; }
353 const RGWBucketInfo
& get_bucket_info() const { return bucket
->get_info(); }
356 class RGWBucketAdminOp
{
358 static int get_policy(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
,
359 RGWFormatterFlusher
& flusher
, const DoutPrefixProvider
*dpp
);
360 static int get_policy(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
,
361 RGWAccessControlPolicy
& policy
, const DoutPrefixProvider
*dpp
);
362 static int dump_s3_policy(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
,
363 std::ostream
& os
, const DoutPrefixProvider
*dpp
);
365 static int unlink(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
);
366 static int link(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
367 static int chown(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
, const std::string
& marker
, const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
369 static int check_index(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
,
370 RGWFormatterFlusher
& flusher
, optional_yield y
, const DoutPrefixProvider
*dpp
);
372 static int remove_bucket(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
, optional_yield y
,
373 const DoutPrefixProvider
*dpp
, bool bypass_gc
= false, bool keep_index_consistent
= true);
374 static int remove_object(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
);
375 static int info(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
, RGWFormatterFlusher
& flusher
, optional_yield y
, const DoutPrefixProvider
*dpp
);
376 static int limit_check(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
,
377 const std::list
<std::string
>& user_ids
,
378 RGWFormatterFlusher
& flusher
, optional_yield y
,
379 const DoutPrefixProvider
*dpp
,
380 bool warnings_only
= false);
381 static int set_quota(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
);
383 static int list_stale_instances(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
,
384 RGWFormatterFlusher
& flusher
, const DoutPrefixProvider
*dpp
);
386 static int clear_stale_instances(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
,
387 RGWFormatterFlusher
& flusher
, const DoutPrefixProvider
*dpp
);
388 static int fix_lc_shards(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
,
389 RGWFormatterFlusher
& flusher
, const DoutPrefixProvider
*dpp
);
390 static int fix_obj_expiry(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
,
391 RGWFormatterFlusher
& flusher
, const DoutPrefixProvider
*dpp
, bool dry_run
= false);
393 static int sync_bucket(rgw::sal::Driver
* driver
, RGWBucketAdminOpState
& op_state
, const DoutPrefixProvider
*dpp
, std::string
*err_msg
= NULL
);
397 RGWBucketEntryPoint
&ep
;
398 std::map
<std::string
, buffer::list
>& attrs
;
399 RGWObjVersionTracker ep_objv
;
400 rgw_ep_info(RGWBucketEntryPoint
&ep
, std::map
<std::string
, bufferlist
>& attrs
)
401 : ep(ep
), attrs(attrs
) {}
408 RGWSI_Zone
*zone
{nullptr};
409 RGWSI_Bucket
*bucket
{nullptr};
410 RGWSI_Bucket_Sync
*bucket_sync
{nullptr};
411 RGWSI_BucketIndex
*bi
{nullptr};
412 RGWSI_User
* user
= nullptr;
416 RGWUserCtl
*user
{nullptr};
419 RGWBucketMetadataHandler
*bm_handler
;
420 RGWBucketInstanceMetadataHandler
*bmi_handler
;
422 RGWSI_Bucket_BE_Handler bucket_be_handler
; /* bucket backend handler */
423 RGWSI_BucketInstance_BE_Handler bi_be_handler
; /* bucket instance backend handler */
425 int call(std::function
<int(RGWSI_Bucket_X_Ctx
& ctx
)> f
);
428 RGWBucketCtl(RGWSI_Zone
*zone_svc
,
429 RGWSI_Bucket
*bucket_svc
,
430 RGWSI_Bucket_Sync
*bucket_sync_svc
,
431 RGWSI_BucketIndex
*bi_svc
,
432 RGWSI_User
* user_svc
);
434 void init(RGWUserCtl
*user_ctl
,
435 RGWBucketMetadataHandler
*_bm_handler
,
436 RGWBucketInstanceMetadataHandler
*_bmi_handler
,
437 RGWDataChangesLog
*datalog
,
438 const DoutPrefixProvider
*dpp
);
442 RGWObjVersionTracker
*objv_tracker
{nullptr};
443 real_time
*mtime
{nullptr};
444 std::map
<std::string
, bufferlist
> *attrs
{nullptr};
445 rgw_cache_entry_info
*cache_info
{nullptr};
446 boost::optional
<obj_version
> refresh_version
;
447 std::optional
<RGWSI_MetaBackend_CtxParams
> bectx_params
;
451 GetParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
452 objv_tracker
= _objv_tracker
;
456 GetParams
& set_mtime(ceph::real_time
*_mtime
) {
461 GetParams
& set_attrs(std::map
<std::string
, bufferlist
> *_attrs
) {
466 GetParams
& set_cache_info(rgw_cache_entry_info
*_cache_info
) {
467 cache_info
= _cache_info
;
471 GetParams
& set_refresh_version(const obj_version
& _refresh_version
) {
472 refresh_version
= _refresh_version
;
476 GetParams
& set_bectx_params(std::optional
<RGWSI_MetaBackend_CtxParams
> _bectx_params
) {
477 bectx_params
= _bectx_params
;
483 RGWObjVersionTracker
*objv_tracker
{nullptr};
484 ceph::real_time mtime
;
485 bool exclusive
{false};
486 std::map
<std::string
, bufferlist
> *attrs
{nullptr};
490 PutParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
491 objv_tracker
= _objv_tracker
;
495 PutParams
& set_mtime(const ceph::real_time
& _mtime
) {
500 PutParams
& set_exclusive(bool _exclusive
) {
501 exclusive
= _exclusive
;
505 PutParams
& set_attrs(std::map
<std::string
, bufferlist
> *_attrs
) {
511 struct RemoveParams
{
512 RGWObjVersionTracker
*objv_tracker
{nullptr};
516 RemoveParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
517 objv_tracker
= _objv_tracker
;
523 struct BucketInstance
{
525 real_time
*mtime
{nullptr};
526 std::map
<std::string
, bufferlist
> *attrs
{nullptr};
527 rgw_cache_entry_info
*cache_info
{nullptr};
528 boost::optional
<obj_version
> refresh_version
;
529 RGWObjVersionTracker
*objv_tracker
{nullptr};
530 std::optional
<RGWSI_MetaBackend_CtxParams
> bectx_params
;
534 GetParams
& set_mtime(ceph::real_time
*_mtime
) {
539 GetParams
& set_attrs(std::map
<std::string
, bufferlist
> *_attrs
) {
544 GetParams
& set_cache_info(rgw_cache_entry_info
*_cache_info
) {
545 cache_info
= _cache_info
;
549 GetParams
& set_refresh_version(const obj_version
& _refresh_version
) {
550 refresh_version
= _refresh_version
;
554 GetParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
555 objv_tracker
= _objv_tracker
;
559 GetParams
& set_bectx_params(std::optional
<RGWSI_MetaBackend_CtxParams
> _bectx_params
) {
560 bectx_params
= _bectx_params
;
566 std::optional
<RGWBucketInfo
*> orig_info
; /* nullopt: orig_info was not fetched,
567 nullptr: orig_info was not found (new bucket instance */
568 ceph::real_time mtime
;
569 bool exclusive
{false};
570 std::map
<std::string
, bufferlist
> *attrs
{nullptr};
571 RGWObjVersionTracker
*objv_tracker
{nullptr};
575 PutParams
& set_orig_info(RGWBucketInfo
*pinfo
) {
580 PutParams
& set_mtime(const ceph::real_time
& _mtime
) {
585 PutParams
& set_exclusive(bool _exclusive
) {
586 exclusive
= _exclusive
;
590 PutParams
& set_attrs(std::map
<std::string
, bufferlist
> *_attrs
) {
595 PutParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
596 objv_tracker
= _objv_tracker
;
601 struct RemoveParams
{
602 RGWObjVersionTracker
*objv_tracker
{nullptr};
606 RemoveParams
& set_objv_tracker(RGWObjVersionTracker
*_objv_tracker
) {
607 objv_tracker
= _objv_tracker
;
613 /* bucket entrypoint */
614 int read_bucket_entrypoint_info(const rgw_bucket
& bucket
,
615 RGWBucketEntryPoint
*info
,
617 const DoutPrefixProvider
*dpp
,
618 const Bucket::GetParams
& params
= {});
619 int store_bucket_entrypoint_info(const rgw_bucket
& bucket
,
620 RGWBucketEntryPoint
& info
,
622 const DoutPrefixProvider
*dpp
,
623 const Bucket::PutParams
& params
= {});
624 int remove_bucket_entrypoint_info(const rgw_bucket
& bucket
,
626 const DoutPrefixProvider
*dpp
,
627 const Bucket::RemoveParams
& params
= {});
629 /* bucket instance */
630 int read_bucket_instance_info(const rgw_bucket
& bucket
,
633 const DoutPrefixProvider
*dpp
,
634 const BucketInstance::GetParams
& params
= {});
635 int store_bucket_instance_info(const rgw_bucket
& bucket
,
638 const DoutPrefixProvider
*dpp
,
639 const BucketInstance::PutParams
& params
= {});
640 int remove_bucket_instance_info(const rgw_bucket
& bucket
,
643 const DoutPrefixProvider
*dpp
,
644 const BucketInstance::RemoveParams
& params
= {});
647 * bucket_id may or may not be provided
649 * ep_objv_tracker might not be populated even if provided. Will only be set if entrypoint is read
650 * (that is: if bucket_id is empty).
652 int read_bucket_info(const rgw_bucket
& bucket
,
655 const DoutPrefixProvider
*dpp
,
656 const BucketInstance::GetParams
& params
= {},
657 RGWObjVersionTracker
*ep_objv_tracker
= nullptr);
660 int set_bucket_instance_attrs(RGWBucketInfo
& bucket_info
,
661 std::map
<std::string
, bufferlist
>& attrs
,
662 RGWObjVersionTracker
*objv_tracker
,
664 const DoutPrefixProvider
*dpp
);
667 int link_bucket(const rgw_user
& user_id
,
668 const rgw_bucket
& bucket
,
669 ceph::real_time creation_time
,
671 const DoutPrefixProvider
*dpp
,
672 bool update_entrypoint
= true,
673 rgw_ep_info
*pinfo
= nullptr);
675 int unlink_bucket(const rgw_user
& user_id
,
676 const rgw_bucket
& bucket
,
678 const DoutPrefixProvider
*dpp
,
679 bool update_entrypoint
= true);
681 int read_buckets_stats(std::map
<std::string
, RGWBucketEnt
>& m
,
683 const DoutPrefixProvider
*dpp
);
685 int read_bucket_stats(const rgw_bucket
& bucket
,
686 RGWBucketEnt
*result
,
688 const DoutPrefixProvider
*dpp
);
691 int sync_user_stats(const DoutPrefixProvider
*dpp
,
692 const rgw_user
& user_id
, const RGWBucketInfo
& bucket_info
,
697 int get_sync_policy_handler(std::optional
<rgw_zone_id
> zone
,
698 std::optional
<rgw_bucket
> bucket
,
699 RGWBucketSyncPolicyHandlerRef
*phandler
,
701 const DoutPrefixProvider
*dpp
);
702 int bucket_exports_data(const rgw_bucket
& bucket
,
704 const DoutPrefixProvider
*dpp
);
705 int bucket_imports_data(const rgw_bucket
& bucket
,
707 const DoutPrefixProvider
*dpp
);
710 int convert_old_bucket_info(RGWSI_Bucket_X_Ctx
& ctx
,
711 const rgw_bucket
& bucket
,
713 const DoutPrefixProvider
*dpp
);
715 int do_store_bucket_instance_info(RGWSI_Bucket_BI_Ctx
& ctx
,
716 const rgw_bucket
& bucket
,
719 const DoutPrefixProvider
*dpp
,
720 const BucketInstance::PutParams
& params
);
722 int do_store_linked_bucket_info(RGWSI_Bucket_X_Ctx
& ctx
,
724 RGWBucketInfo
*orig_info
,
725 bool exclusive
, real_time mtime
,
726 obj_version
*pep_objv
,
727 std::map
<std::string
, bufferlist
> *pattrs
,
728 bool create_entry_point
,
730 const DoutPrefixProvider
*dpp
);
732 int do_link_bucket(RGWSI_Bucket_EP_Ctx
& ctx
,
733 const rgw_user
& user
,
734 const rgw_bucket
& bucket
,
735 ceph::real_time creation_time
,
736 bool update_entrypoint
,
739 const DoutPrefixProvider
*dpp
);
741 int do_unlink_bucket(RGWSI_Bucket_EP_Ctx
& ctx
,
742 const rgw_user
& user_id
,
743 const rgw_bucket
& bucket
,
744 bool update_entrypoint
,
746 const DoutPrefixProvider
*dpp
);
750 bool rgw_find_bucket_by_id(const DoutPrefixProvider
*dpp
, CephContext
*cct
, rgw::sal::Driver
* driver
, const std::string
& marker
,
751 const std::string
& bucket_id
, rgw_bucket
* bucket_out
);