]> git.proxmox.com Git - ceph.git/blob - ceph/src/rgw/services/svc_zone.h
import quincy beta 17.1.0
[ceph.git] / ceph / src / rgw / services / svc_zone.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
3
4 #pragma once
5
6 #include "rgw/rgw_service.h"
7
8
9 class RGWSI_RADOS;
10 class RGWSI_SysObj;
11 class RGWSI_SyncModules;
12 class RGWSI_Bucket_Sync;
13
14 class RGWRealm;
15 class RGWZoneGroup;
16 class RGWZone;
17 class RGWZoneParams;
18 class RGWPeriod;
19 class RGWZonePlacementInfo;
20
21 class RGWBucketSyncPolicyHandler;
22
23 class RGWRESTConn;
24
25 struct rgw_sync_policy_info;
26
27 class RGWSI_Zone : public RGWServiceInstance
28 {
29 friend struct RGWServices_Def;
30
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};
35
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};
45
46 std::shared_ptr<RGWBucketSyncPolicyHandler> sync_policy_handler;
47 std::map<rgw_zone_id, std::shared_ptr<RGWBucketSyncPolicyHandler> > sync_policy_handlers;
48
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;
54
55 std::map<std::string, rgw_zone_id> zone_id_by_name;
56 std::map<rgw_zone_id, RGWZone> zone_by_id;
57
58 std::unique_ptr<rgw_sync_policy_info> sync_policy;
59
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;
66
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);
71
72 int update_placement_map(const DoutPrefixProvider *dpp, optional_yield y);
73
74 int create_default_zg(const DoutPrefixProvider *dpp, optional_yield y);
75 int init_default_zone(const DoutPrefixProvider *dpp, optional_yield y);
76
77 int search_realm_with_zone(const DoutPrefixProvider *dpp,
78 const rgw_zone_id& zid,
79 RGWRealm *prealm,
80 RGWPeriod *pperiod,
81 RGWZoneGroup *pzonegroup,
82 bool *pfound,
83 optional_yield y);
84 public:
85 RGWSI_Zone(CephContext *cct);
86 ~RGWSI_Zone();
87
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;
94
95 std::shared_ptr<RGWBucketSyncPolicyHandler> get_sync_policy_handler(std::optional<rgw_zone_id> zone = std::nullopt) const;
96
97 const std::string& zone_name() const;
98 const rgw_zone_id& zone_id() const {
99 return cur_zone_id;
100 }
101 uint32_t get_zone_short_id() const;
102
103 const std::string& get_current_period_id() const;
104 bool has_zonegroup_api(const std::string& api) const;
105
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; }
111
112 RGWRESTConn *get_master_conn() {
113 return rest_master_conn;
114 }
115
116 std::map<std::string, RGWRESTConn *>& get_zonegroup_conn_map() {
117 return zonegroup_conn_map;
118 }
119
120 std::map<rgw_zone_id, RGWRESTConn *>& get_zone_conn_map() {
121 return zone_conn_map;
122 }
123
124 std::vector<const RGWZone*>& get_data_sync_source_zones() {
125 return data_sync_source_zones;
126 }
127
128 std::map<rgw_zone_id, RGWRESTConn *>& get_zone_data_notify_to_map() {
129 return zone_data_notify_to_map;
130 }
131
132 bool find_zone(const rgw_zone_id& id, RGWZone **zone);
133
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);
137
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,
145 optional_yield y);
146 int select_bucket_location_by_rule(const DoutPrefixProvider *dpp, const rgw_placement_rule& location_rule, RGWZonePlacementInfo *rule_info, optional_yield y);
147
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);
151
152 bool is_meta_master() const;
153
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);
159
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);
166 };