]>
Commit | Line | Data |
---|---|---|
11fdf7f2 | 1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
9f95a23c | 2 | // vim: ts=8 sw=2 smarttab ft=cpp |
11fdf7f2 TL |
3 | |
4 | #include "rgw_service.h" | |
5 | ||
6 | #include "services/svc_finisher.h" | |
9f95a23c TL |
7 | #include "services/svc_bi_rados.h" |
8 | #include "services/svc_bilog_rados.h" | |
9 | #include "services/svc_bucket_sobj.h" | |
10 | #include "services/svc_bucket_sync_sobj.h" | |
11 | #include "services/svc_cls.h" | |
12 | #include "services/svc_config_key_rados.h" | |
13 | #include "services/svc_datalog_rados.h" | |
14 | #include "services/svc_mdlog.h" | |
15 | #include "services/svc_meta.h" | |
16 | #include "services/svc_meta_be.h" | |
17 | #include "services/svc_meta_be_sobj.h" | |
18 | #include "services/svc_meta_be_otp.h" | |
11fdf7f2 | 19 | #include "services/svc_notify.h" |
9f95a23c | 20 | #include "services/svc_otp.h" |
11fdf7f2 TL |
21 | #include "services/svc_rados.h" |
22 | #include "services/svc_zone.h" | |
23 | #include "services/svc_zone_utils.h" | |
24 | #include "services/svc_quota.h" | |
25 | #include "services/svc_sync_modules.h" | |
26 | #include "services/svc_sys_obj.h" | |
27 | #include "services/svc_sys_obj_cache.h" | |
28 | #include "services/svc_sys_obj_core.h" | |
9f95a23c | 29 | #include "services/svc_user_rados.h" |
11fdf7f2 TL |
30 | |
31 | #include "common/errno.h" | |
32 | ||
9f95a23c TL |
33 | #include "rgw_metadata.h" |
34 | #include "rgw_user.h" | |
35 | #include "rgw_bucket.h" | |
36 | #include "rgw_otp.h" | |
37 | ||
11fdf7f2 TL |
38 | #define dout_subsys ceph_subsys_rgw |
39 | ||
40 | ||
41 | RGWServices_Def::RGWServices_Def() = default; | |
42 | RGWServices_Def::~RGWServices_Def() | |
43 | { | |
44 | shutdown(); | |
45 | } | |
46 | ||
47 | int RGWServices_Def::init(CephContext *cct, | |
48 | bool have_cache, | |
9f95a23c TL |
49 | bool raw, |
50 | bool run_sync) | |
11fdf7f2 TL |
51 | { |
52 | finisher = std::make_unique<RGWSI_Finisher>(cct); | |
9f95a23c TL |
53 | bucket_sobj = std::make_unique<RGWSI_Bucket_SObj>(cct); |
54 | bucket_sync_sobj = std::make_unique<RGWSI_Bucket_Sync_SObj>(cct); | |
55 | bi_rados = std::make_unique<RGWSI_BucketIndex_RADOS>(cct); | |
56 | bilog_rados = std::make_unique<RGWSI_BILog_RADOS>(cct); | |
57 | cls = std::make_unique<RGWSI_Cls>(cct); | |
58 | config_key_rados = std::make_unique<RGWSI_ConfigKey_RADOS>(cct); | |
59 | datalog_rados = std::make_unique<RGWSI_DataLog_RADOS>(cct); | |
60 | mdlog = std::make_unique<RGWSI_MDLog>(cct, run_sync); | |
61 | meta = std::make_unique<RGWSI_Meta>(cct); | |
62 | meta_be_sobj = std::make_unique<RGWSI_MetaBackend_SObj>(cct); | |
63 | meta_be_otp = std::make_unique<RGWSI_MetaBackend_OTP>(cct); | |
11fdf7f2 | 64 | notify = std::make_unique<RGWSI_Notify>(cct); |
9f95a23c | 65 | otp = std::make_unique<RGWSI_OTP>(cct); |
11fdf7f2 TL |
66 | rados = std::make_unique<RGWSI_RADOS>(cct); |
67 | zone = std::make_unique<RGWSI_Zone>(cct); | |
68 | zone_utils = std::make_unique<RGWSI_ZoneUtils>(cct); | |
69 | quota = std::make_unique<RGWSI_Quota>(cct); | |
70 | sync_modules = std::make_unique<RGWSI_SyncModules>(cct); | |
71 | sysobj = std::make_unique<RGWSI_SysObj>(cct); | |
72 | sysobj_core = std::make_unique<RGWSI_SysObj_Core>(cct); | |
9f95a23c | 73 | user_rados = std::make_unique<RGWSI_User_RADOS>(cct); |
11fdf7f2 TL |
74 | |
75 | if (have_cache) { | |
76 | sysobj_cache = std::make_unique<RGWSI_SysObj_Cache>(cct); | |
77 | } | |
9f95a23c TL |
78 | |
79 | vector<RGWSI_MetaBackend *> meta_bes{meta_be_sobj.get(), meta_be_otp.get()}; | |
80 | ||
11fdf7f2 | 81 | finisher->init(); |
9f95a23c TL |
82 | bi_rados->init(zone.get(), rados.get(), bilog_rados.get(), datalog_rados.get()); |
83 | bilog_rados->init(bi_rados.get()); | |
84 | bucket_sobj->init(zone.get(), sysobj.get(), sysobj_cache.get(), | |
85 | bi_rados.get(), meta.get(), meta_be_sobj.get(), | |
86 | sync_modules.get(), bucket_sync_sobj.get()); | |
87 | bucket_sync_sobj->init(zone.get(), | |
88 | sysobj.get(), | |
89 | sysobj_cache.get(), | |
90 | bucket_sobj.get()); | |
91 | cls->init(zone.get(), rados.get()); | |
92 | config_key_rados->init(rados.get()); | |
93 | datalog_rados->init(zone.get(), cls.get()); | |
94 | mdlog->init(rados.get(), zone.get(), sysobj.get(), cls.get()); | |
95 | meta->init(sysobj.get(), mdlog.get(), meta_bes); | |
96 | meta_be_sobj->init(sysobj.get(), mdlog.get()); | |
97 | meta_be_otp->init(sysobj.get(), mdlog.get(), cls.get()); | |
11fdf7f2 | 98 | notify->init(zone.get(), rados.get(), finisher.get()); |
9f95a23c | 99 | otp->init(zone.get(), meta.get(), meta_be_otp.get()); |
11fdf7f2 | 100 | rados->init(); |
9f95a23c | 101 | zone->init(sysobj.get(), rados.get(), sync_modules.get(), bucket_sync_sobj.get()); |
11fdf7f2 TL |
102 | zone_utils->init(rados.get(), zone.get()); |
103 | quota->init(zone.get()); | |
9f95a23c | 104 | sync_modules->init(zone.get()); |
11fdf7f2 TL |
105 | sysobj_core->core_init(rados.get(), zone.get()); |
106 | if (have_cache) { | |
107 | sysobj_cache->init(rados.get(), zone.get(), notify.get()); | |
108 | sysobj->init(rados.get(), sysobj_cache.get()); | |
109 | } else { | |
110 | sysobj->init(rados.get(), sysobj_core.get()); | |
111 | } | |
9f95a23c TL |
112 | user_rados->init(rados.get(), zone.get(), sysobj.get(), sysobj_cache.get(), |
113 | meta.get(), meta_be_sobj.get(), sync_modules.get()); | |
11fdf7f2 TL |
114 | |
115 | can_shutdown = true; | |
116 | ||
117 | int r = finisher->start(); | |
118 | if (r < 0) { | |
119 | ldout(cct, 0) << "ERROR: failed to start finisher service (" << cpp_strerror(-r) << dendl; | |
120 | return r; | |
121 | } | |
122 | ||
123 | if (!raw) { | |
124 | r = notify->start(); | |
125 | if (r < 0) { | |
126 | ldout(cct, 0) << "ERROR: failed to start notify service (" << cpp_strerror(-r) << dendl; | |
127 | return r; | |
128 | } | |
129 | } | |
130 | ||
131 | r = rados->start(); | |
132 | if (r < 0) { | |
133 | ldout(cct, 0) << "ERROR: failed to start rados service (" << cpp_strerror(-r) << dendl; | |
134 | return r; | |
135 | } | |
136 | ||
137 | if (!raw) { | |
138 | r = zone->start(); | |
139 | if (r < 0) { | |
140 | ldout(cct, 0) << "ERROR: failed to start zone service (" << cpp_strerror(-r) << dendl; | |
141 | return r; | |
142 | } | |
9f95a23c TL |
143 | |
144 | r = mdlog->start(); | |
145 | if (r < 0) { | |
146 | ldout(cct, 0) << "ERROR: failed to start mdlog service (" << cpp_strerror(-r) << dendl; | |
147 | return r; | |
148 | } | |
149 | ||
150 | r = sync_modules->start(); | |
151 | if (r < 0) { | |
152 | ldout(cct, 0) << "ERROR: failed to start sync modules service (" << cpp_strerror(-r) << dendl; | |
153 | return r; | |
154 | } | |
155 | } | |
156 | ||
157 | r = cls->start(); | |
158 | if (r < 0) { | |
159 | ldout(cct, 0) << "ERROR: failed to start cls service (" << cpp_strerror(-r) << dendl; | |
160 | return r; | |
161 | } | |
162 | ||
163 | r = config_key_rados->start(); | |
164 | if (r < 0) { | |
165 | ldout(cct, 0) << "ERROR: failed to start config_key service (" << cpp_strerror(-r) << dendl; | |
166 | return r; | |
11fdf7f2 TL |
167 | } |
168 | ||
169 | r = zone_utils->start(); | |
170 | if (r < 0) { | |
171 | ldout(cct, 0) << "ERROR: failed to start zone_utils service (" << cpp_strerror(-r) << dendl; | |
172 | return r; | |
173 | } | |
174 | ||
175 | r = quota->start(); | |
176 | if (r < 0) { | |
177 | ldout(cct, 0) << "ERROR: failed to start quota service (" << cpp_strerror(-r) << dendl; | |
178 | return r; | |
179 | } | |
180 | ||
181 | r = sysobj_core->start(); | |
182 | if (r < 0) { | |
183 | ldout(cct, 0) << "ERROR: failed to start sysobj_core service (" << cpp_strerror(-r) << dendl; | |
184 | return r; | |
185 | } | |
186 | ||
187 | if (have_cache) { | |
188 | r = sysobj_cache->start(); | |
189 | if (r < 0) { | |
190 | ldout(cct, 0) << "ERROR: failed to start sysobj_cache service (" << cpp_strerror(-r) << dendl; | |
191 | return r; | |
192 | } | |
193 | } | |
194 | ||
195 | r = sysobj->start(); | |
196 | if (r < 0) { | |
197 | ldout(cct, 0) << "ERROR: failed to start sysobj service (" << cpp_strerror(-r) << dendl; | |
198 | return r; | |
199 | } | |
200 | ||
9f95a23c TL |
201 | if (!raw) { |
202 | r = datalog_rados->start(); | |
203 | if (r < 0) { | |
204 | ldout(cct, 0) << "ERROR: failed to start datalog_rados service (" << cpp_strerror(-r) << dendl; | |
205 | return r; | |
206 | } | |
207 | ||
208 | r = meta_be_sobj->start(); | |
209 | if (r < 0) { | |
210 | ldout(cct, 0) << "ERROR: failed to start meta_be_sobj service (" << cpp_strerror(-r) << dendl; | |
211 | return r; | |
212 | } | |
213 | ||
214 | r = meta->start(); | |
215 | if (r < 0) { | |
216 | ldout(cct, 0) << "ERROR: failed to start meta service (" << cpp_strerror(-r) << dendl; | |
217 | return r; | |
218 | } | |
219 | ||
220 | r = bucket_sobj->start(); | |
221 | if (r < 0) { | |
222 | ldout(cct, 0) << "ERROR: failed to start bucket service (" << cpp_strerror(-r) << dendl; | |
223 | return r; | |
224 | } | |
225 | ||
226 | r = bucket_sync_sobj->start(); | |
227 | if (r < 0) { | |
228 | ldout(cct, 0) << "ERROR: failed to start bucket_sync service (" << cpp_strerror(-r) << dendl; | |
229 | return r; | |
230 | } | |
231 | ||
232 | r = user_rados->start(); | |
233 | if (r < 0) { | |
234 | ldout(cct, 0) << "ERROR: failed to start user_rados service (" << cpp_strerror(-r) << dendl; | |
235 | return r; | |
236 | } | |
237 | ||
238 | r = otp->start(); | |
239 | if (r < 0) { | |
240 | ldout(cct, 0) << "ERROR: failed to start otp service (" << cpp_strerror(-r) << dendl; | |
241 | return r; | |
242 | } | |
243 | } | |
244 | ||
11fdf7f2 TL |
245 | /* cache or core services will be started by sysobj */ |
246 | ||
247 | return 0; | |
248 | } | |
249 | ||
250 | void RGWServices_Def::shutdown() | |
251 | { | |
252 | if (!can_shutdown) { | |
253 | return; | |
254 | } | |
255 | ||
256 | if (has_shutdown) { | |
257 | return; | |
258 | } | |
259 | ||
9f95a23c TL |
260 | datalog_rados->shutdown(); |
261 | ||
11fdf7f2 TL |
262 | sysobj->shutdown(); |
263 | sysobj_core->shutdown(); | |
264 | notify->shutdown(); | |
265 | if (sysobj_cache) { | |
266 | sysobj_cache->shutdown(); | |
267 | } | |
268 | quota->shutdown(); | |
269 | zone_utils->shutdown(); | |
270 | zone->shutdown(); | |
271 | rados->shutdown(); | |
272 | ||
273 | has_shutdown = true; | |
274 | ||
275 | } | |
276 | ||
277 | ||
9f95a23c | 278 | int RGWServices::do_init(CephContext *_cct, bool have_cache, bool raw, bool run_sync) |
11fdf7f2 | 279 | { |
9f95a23c TL |
280 | cct = _cct; |
281 | ||
282 | int r = _svc.init(cct, have_cache, raw, run_sync); | |
11fdf7f2 TL |
283 | if (r < 0) { |
284 | return r; | |
285 | } | |
286 | ||
287 | finisher = _svc.finisher.get(); | |
9f95a23c TL |
288 | bi_rados = _svc.bi_rados.get(); |
289 | bi = bi_rados; | |
290 | bilog_rados = _svc.bilog_rados.get(); | |
291 | bucket_sobj = _svc.bucket_sobj.get(); | |
292 | bucket = bucket_sobj; | |
293 | bucket_sync_sobj = _svc.bucket_sync_sobj.get(); | |
294 | bucket_sync = bucket_sync_sobj; | |
295 | cls = _svc.cls.get(); | |
296 | config_key_rados = _svc.config_key_rados.get(); | |
297 | config_key = config_key_rados; | |
298 | datalog_rados = _svc.datalog_rados.get(); | |
299 | mdlog = _svc.mdlog.get(); | |
300 | meta = _svc.meta.get(); | |
301 | meta_be_sobj = _svc.meta_be_sobj.get(); | |
302 | meta_be_otp = _svc.meta_be_otp.get(); | |
11fdf7f2 | 303 | notify = _svc.notify.get(); |
9f95a23c | 304 | otp = _svc.otp.get(); |
11fdf7f2 TL |
305 | rados = _svc.rados.get(); |
306 | zone = _svc.zone.get(); | |
307 | zone_utils = _svc.zone_utils.get(); | |
308 | quota = _svc.quota.get(); | |
309 | sync_modules = _svc.sync_modules.get(); | |
310 | sysobj = _svc.sysobj.get(); | |
311 | cache = _svc.sysobj_cache.get(); | |
312 | core = _svc.sysobj_core.get(); | |
9f95a23c | 313 | user = _svc.user_rados.get(); |
11fdf7f2 TL |
314 | |
315 | return 0; | |
316 | } | |
317 | ||
318 | int RGWServiceInstance::start() | |
319 | { | |
320 | if (start_state != StateInit) { | |
321 | return 0; | |
322 | } | |
323 | ||
324 | start_state = StateStarting;; /* setting started prior to do_start() on purpose so that circular | |
325 | references can call start() on each other */ | |
326 | ||
327 | int r = do_start(); | |
328 | if (r < 0) { | |
329 | return r; | |
330 | } | |
331 | ||
332 | start_state = StateStarted; | |
333 | ||
334 | return 0; | |
335 | } | |
9f95a23c TL |
336 | |
337 | RGWCtlDef::RGWCtlDef() {} | |
338 | RGWCtlDef::~RGWCtlDef() {} | |
339 | RGWCtlDef::_meta::_meta() {} | |
340 | RGWCtlDef::_meta::~_meta() {} | |
341 | ||
342 | ||
343 | int RGWCtlDef::init(RGWServices& svc) | |
344 | { | |
345 | meta.mgr.reset(new RGWMetadataManager(svc.meta)); | |
346 | ||
347 | meta.user.reset(RGWUserMetaHandlerAllocator::alloc(svc.user)); | |
348 | ||
349 | auto sync_module = svc.sync_modules->get_sync_module(); | |
350 | if (sync_module) { | |
351 | meta.bucket.reset(sync_module->alloc_bucket_meta_handler()); | |
352 | meta.bucket_instance.reset(sync_module->alloc_bucket_instance_meta_handler()); | |
353 | } else { | |
354 | meta.bucket.reset(RGWBucketMetaHandlerAllocator::alloc()); | |
355 | meta.bucket_instance.reset(RGWBucketInstanceMetaHandlerAllocator::alloc()); | |
356 | } | |
357 | ||
358 | meta.otp.reset(RGWOTPMetaHandlerAllocator::alloc()); | |
359 | ||
360 | user.reset(new RGWUserCtl(svc.zone, svc.user, (RGWUserMetadataHandler *)meta.user.get())); | |
361 | bucket.reset(new RGWBucketCtl(svc.zone, | |
362 | svc.bucket, | |
363 | svc.bucket_sync, | |
364 | svc.bi)); | |
365 | otp.reset(new RGWOTPCtl(svc.zone, svc.otp)); | |
366 | ||
367 | RGWBucketMetadataHandlerBase *bucket_meta_handler = static_cast<RGWBucketMetadataHandlerBase *>(meta.bucket.get()); | |
368 | RGWBucketInstanceMetadataHandlerBase *bi_meta_handler = static_cast<RGWBucketInstanceMetadataHandlerBase *>(meta.bucket_instance.get()); | |
369 | ||
370 | bucket_meta_handler->init(svc.bucket, bucket.get()); | |
371 | bi_meta_handler->init(svc.zone, svc.bucket, svc.bi); | |
372 | ||
373 | RGWOTPMetadataHandlerBase *otp_handler = static_cast<RGWOTPMetadataHandlerBase *>(meta.otp.get()); | |
374 | otp_handler->init(svc.zone, svc.meta_be_otp, svc.otp); | |
375 | ||
376 | user->init(bucket.get()); | |
377 | bucket->init(user.get(), | |
378 | (RGWBucketMetadataHandler *)bucket_meta_handler, | |
379 | (RGWBucketInstanceMetadataHandler *)bi_meta_handler, | |
380 | svc.datalog_rados->get_log()); | |
381 | ||
382 | otp->init((RGWOTPMetadataHandler *)meta.otp.get()); | |
383 | ||
384 | return 0; | |
385 | } | |
386 | ||
387 | int RGWCtl::init(RGWServices *_svc) | |
388 | { | |
389 | svc = _svc; | |
390 | cct = svc->cct; | |
391 | ||
392 | int r = _ctl.init(*svc); | |
393 | if (r < 0) { | |
394 | ldout(cct, 0) << "ERROR: failed to start init ctls (" << cpp_strerror(-r) << dendl; | |
395 | return r; | |
396 | } | |
397 | ||
398 | meta.mgr = _ctl.meta.mgr.get(); | |
399 | meta.user = _ctl.meta.user.get(); | |
400 | meta.bucket = _ctl.meta.bucket.get(); | |
401 | meta.bucket_instance = _ctl.meta.bucket_instance.get(); | |
402 | meta.otp = _ctl.meta.otp.get(); | |
403 | ||
404 | user = _ctl.user.get(); | |
405 | bucket = _ctl.bucket.get(); | |
406 | otp = _ctl.otp.get(); | |
407 | ||
408 | r = meta.user->attach(meta.mgr); | |
409 | if (r < 0) { | |
410 | ldout(cct, 0) << "ERROR: failed to start init meta.user ctl (" << cpp_strerror(-r) << dendl; | |
411 | return r; | |
412 | } | |
413 | ||
414 | r = meta.bucket->attach(meta.mgr); | |
415 | if (r < 0) { | |
416 | ldout(cct, 0) << "ERROR: failed to start init meta.bucket ctl (" << cpp_strerror(-r) << dendl; | |
417 | return r; | |
418 | } | |
419 | ||
420 | r = meta.bucket_instance->attach(meta.mgr); | |
421 | if (r < 0) { | |
422 | ldout(cct, 0) << "ERROR: failed to start init meta.bucket_instance ctl (" << cpp_strerror(-r) << dendl; | |
423 | return r; | |
424 | } | |
425 | ||
426 | r = meta.otp->attach(meta.mgr); | |
427 | if (r < 0) { | |
428 | ldout(cct, 0) << "ERROR: failed to start init otp ctl (" << cpp_strerror(-r) << dendl; | |
429 | return r; | |
430 | } | |
431 | ||
432 | return 0; | |
433 | } | |
434 |