]> git.proxmox.com Git - ceph.git/blame - ceph/src/rgw/rgw_service.cc
import ceph 15.2.10
[ceph.git] / ceph / src / rgw / rgw_service.cc
CommitLineData
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
41RGWServices_Def::RGWServices_Def() = default;
42RGWServices_Def::~RGWServices_Def()
43{
44 shutdown();
45}
46
47int 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
250void 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 278int 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
318int 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
337RGWCtlDef::RGWCtlDef() {}
338RGWCtlDef::~RGWCtlDef() {}
339RGWCtlDef::_meta::_meta() {}
340RGWCtlDef::_meta::~_meta() {}
341
342
343int 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
387int 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