1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
6 #include "rgw/rgw_service.h"
11 class RGWSI_SyncModules
;
12 class RGWSI_Bucket_Sync
;
19 class RGWZonePlacementInfo
;
21 class RGWBucketSyncPolicyHandler
;
25 struct rgw_sync_policy_info
;
27 class RGWSI_Zone
: public RGWServiceInstance
29 friend struct RGWServices_Def
;
31 RGWSI_SysObj
*sysobj_svc
{nullptr};
32 RGWSI_RADOS
*rados_svc
{nullptr};
33 RGWSI_SyncModules
*sync_modules_svc
{nullptr};
34 RGWSI_Bucket_Sync
*bucket_sync_svc
{nullptr};
36 RGWRealm
*realm
{nullptr};
37 RGWZoneGroup
*zonegroup
{nullptr};
38 RGWZone
*zone_public_config
{nullptr}; /* external zone params, e.g., entrypoints, log flags, etc. */
39 RGWZoneParams
*zone_params
{nullptr}; /* internal zone params, e.g., rados pools */
40 RGWPeriod
*current_period
{nullptr};
41 rgw_zone_id cur_zone_id
;
42 uint32_t zone_short_id
{0};
43 bool writeable_zone
{false};
44 bool exports_data
{false};
46 std::shared_ptr
<RGWBucketSyncPolicyHandler
> sync_policy_handler
;
47 std::map
<rgw_zone_id
, std::shared_ptr
<RGWBucketSyncPolicyHandler
> > sync_policy_handlers
;
49 RGWRESTConn
*rest_master_conn
{nullptr};
50 std::map
<rgw_zone_id
, RGWRESTConn
*> zone_conn_map
;
51 std::vector
<const RGWZone
*> data_sync_source_zones
;
52 std::map
<rgw_zone_id
, RGWRESTConn
*> zone_data_notify_to_map
;
53 std::map
<std::string
, RGWRESTConn
*> zonegroup_conn_map
;
55 std::map
<std::string
, rgw_zone_id
> zone_id_by_name
;
56 std::map
<rgw_zone_id
, RGWZone
> zone_by_id
;
58 std::unique_ptr
<rgw_sync_policy_info
> sync_policy
;
60 void init(RGWSI_SysObj
*_sysobj_svc
,
61 RGWSI_RADOS
*_rados_svc
,
62 RGWSI_SyncModules
*_sync_modules_svc
,
63 RGWSI_Bucket_Sync
*_bucket_sync_svc
);
64 int do_start(optional_yield y
, const DoutPrefixProvider
*dpp
) override
;
65 void shutdown() override
;
67 int replace_region_with_zonegroup(const DoutPrefixProvider
*dpp
, optional_yield y
);
68 int init_zg_from_period(const DoutPrefixProvider
*dpp
, optional_yield y
);
69 int init_zg_from_local(const DoutPrefixProvider
*dpp
, optional_yield y
);
70 int convert_regionmap(const DoutPrefixProvider
*dpp
, optional_yield y
);
72 int update_placement_map(const DoutPrefixProvider
*dpp
, optional_yield y
);
74 int create_default_zg(const DoutPrefixProvider
*dpp
, optional_yield y
);
75 int init_default_zone(const DoutPrefixProvider
*dpp
, optional_yield y
);
77 int search_realm_with_zone(const DoutPrefixProvider
*dpp
,
78 const rgw_zone_id
& zid
,
81 RGWZoneGroup
*pzonegroup
,
85 RGWSI_Zone(CephContext
*cct
);
88 const RGWZoneParams
& get_zone_params() const;
89 const RGWPeriod
& get_current_period() const;
90 const RGWRealm
& get_realm() const;
91 const RGWZoneGroup
& get_zonegroup() const;
92 int get_zonegroup(const std::string
& id
, RGWZoneGroup
& zonegroup
) const;
93 const RGWZone
& get_zone() const;
95 std::shared_ptr
<RGWBucketSyncPolicyHandler
> get_sync_policy_handler(std::optional
<rgw_zone_id
> zone
= std::nullopt
) const;
97 const std::string
& zone_name() const;
98 const rgw_zone_id
& zone_id() const {
101 uint32_t get_zone_short_id() const;
103 const std::string
& get_current_period_id() const;
104 bool has_zonegroup_api(const std::string
& api
) const;
106 bool zone_is_writeable();
107 bool zone_syncs_from(const RGWZone
& target_zone
, const RGWZone
& source_zone
) const;
108 bool get_redirect_zone_endpoint(std::string
*endpoint
);
109 bool sync_module_supports_writes() const { return writeable_zone
; }
110 bool sync_module_exports_data() const { return exports_data
; }
112 RGWRESTConn
*get_master_conn() {
113 return rest_master_conn
;
116 std::map
<std::string
, RGWRESTConn
*>& get_zonegroup_conn_map() {
117 return zonegroup_conn_map
;
120 std::map
<rgw_zone_id
, RGWRESTConn
*>& get_zone_conn_map() {
121 return zone_conn_map
;
124 std::vector
<const RGWZone
*>& get_data_sync_source_zones() {
125 return data_sync_source_zones
;
128 std::map
<rgw_zone_id
, RGWRESTConn
*>& get_zone_data_notify_to_map() {
129 return zone_data_notify_to_map
;
132 bool find_zone(const rgw_zone_id
& id
, RGWZone
**zone
);
134 RGWRESTConn
*get_zone_conn(const rgw_zone_id
& zone_id
);
135 RGWRESTConn
*get_zone_conn_by_name(const std::string
& name
);
136 bool find_zone_id_by_name(const std::string
& name
, rgw_zone_id
*id
);
138 int select_bucket_placement(const DoutPrefixProvider
*dpp
, const RGWUserInfo
& user_info
, const std::string
& zonegroup_id
,
139 const rgw_placement_rule
& rule
,
140 rgw_placement_rule
*pselected_rule
, RGWZonePlacementInfo
*rule_info
, optional_yield y
);
141 int select_legacy_bucket_placement(const DoutPrefixProvider
*dpp
, RGWZonePlacementInfo
*rule_info
, optional_yield y
);
142 int select_new_bucket_location(const DoutPrefixProvider
*dpp
, const RGWUserInfo
& user_info
, const std::string
& zonegroup_id
,
143 const rgw_placement_rule
& rule
,
144 rgw_placement_rule
*pselected_rule_name
, RGWZonePlacementInfo
*rule_info
,
146 int select_bucket_location_by_rule(const DoutPrefixProvider
*dpp
, const rgw_placement_rule
& location_rule
, RGWZonePlacementInfo
*rule_info
, optional_yield y
);
148 int add_bucket_placement(const DoutPrefixProvider
*dpp
, const rgw_pool
& new_pool
, optional_yield y
);
149 int remove_bucket_placement(const DoutPrefixProvider
*dpp
, const rgw_pool
& old_pool
, optional_yield y
);
150 int list_placement_set(const DoutPrefixProvider
*dpp
, std::set
<rgw_pool
>& names
, optional_yield y
);
152 bool is_meta_master() const;
154 bool need_to_sync() const;
155 bool need_to_log_data() const;
156 bool need_to_log_metadata() const;
157 bool can_reshard() const;
158 bool is_syncing_bucket_meta(const rgw_bucket
& bucket
);
160 int list_zonegroups(const DoutPrefixProvider
*dpp
, std::list
<std::string
>& zonegroups
);
161 int list_regions(const DoutPrefixProvider
*dpp
, std::list
<std::string
>& regions
);
162 int list_zones(const DoutPrefixProvider
*dpp
, std::list
<std::string
>& zones
);
163 int list_realms(const DoutPrefixProvider
*dpp
, std::list
<std::string
>& realms
);
164 int list_periods(const DoutPrefixProvider
*dpp
, std::list
<std::string
>& periods
);
165 int list_periods(const DoutPrefixProvider
*dpp
, const std::string
& current_period
, std::list
<std::string
>& periods
, optional_yield y
);