1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
4 #include "rgw_service.h"
6 #include "services/svc_finisher.h"
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"
19 #include "services/svc_notify.h"
20 #include "services/svc_otp.h"
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"
29 #include "services/svc_user_rados.h"
31 #include "common/errno.h"
33 #include "rgw_metadata.h"
35 #include "rgw_bucket.h"
38 #define dout_subsys ceph_subsys_rgw
41 RGWServices_Def::RGWServices_Def() = default;
42 RGWServices_Def::~RGWServices_Def()
47 int RGWServices_Def::init(CephContext
*cct
,
52 finisher
= std::make_unique
<RGWSI_Finisher
>(cct
);
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
);
64 notify
= std::make_unique
<RGWSI_Notify
>(cct
);
65 otp
= std::make_unique
<RGWSI_OTP
>(cct
);
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
);
73 user_rados
= std::make_unique
<RGWSI_User_RADOS
>(cct
);
76 sysobj_cache
= std::make_unique
<RGWSI_SysObj_Cache
>(cct
);
79 vector
<RGWSI_MetaBackend
*> meta_bes
{meta_be_sobj
.get(), meta_be_otp
.get()};
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(),
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());
98 notify
->init(zone
.get(), rados
.get(), finisher
.get());
99 otp
->init(zone
.get(), meta
.get(), meta_be_otp
.get());
101 zone
->init(sysobj
.get(), rados
.get(), sync_modules
.get(), bucket_sync_sobj
.get());
102 zone_utils
->init(rados
.get(), zone
.get());
103 quota
->init(zone
.get());
104 sync_modules
->init(zone
.get());
105 sysobj_core
->core_init(rados
.get(), zone
.get());
107 sysobj_cache
->init(rados
.get(), zone
.get(), notify
.get());
108 sysobj
->init(rados
.get(), sysobj_cache
.get());
110 sysobj
->init(rados
.get(), sysobj_core
.get());
112 user_rados
->init(rados
.get(), zone
.get(), sysobj
.get(), sysobj_cache
.get(),
113 meta
.get(), meta_be_sobj
.get(), sync_modules
.get());
117 int r
= finisher
->start();
119 ldout(cct
, 0) << "ERROR: failed to start finisher service (" << cpp_strerror(-r
) << dendl
;
126 ldout(cct
, 0) << "ERROR: failed to start notify service (" << cpp_strerror(-r
) << dendl
;
133 ldout(cct
, 0) << "ERROR: failed to start rados service (" << cpp_strerror(-r
) << dendl
;
140 ldout(cct
, 0) << "ERROR: failed to start zone service (" << cpp_strerror(-r
) << dendl
;
146 ldout(cct
, 0) << "ERROR: failed to start mdlog service (" << cpp_strerror(-r
) << dendl
;
150 r
= sync_modules
->start();
152 ldout(cct
, 0) << "ERROR: failed to start sync modules service (" << cpp_strerror(-r
) << dendl
;
159 ldout(cct
, 0) << "ERROR: failed to start cls service (" << cpp_strerror(-r
) << dendl
;
163 r
= config_key_rados
->start();
165 ldout(cct
, 0) << "ERROR: failed to start config_key service (" << cpp_strerror(-r
) << dendl
;
169 r
= zone_utils
->start();
171 ldout(cct
, 0) << "ERROR: failed to start zone_utils service (" << cpp_strerror(-r
) << dendl
;
177 ldout(cct
, 0) << "ERROR: failed to start quota service (" << cpp_strerror(-r
) << dendl
;
181 r
= sysobj_core
->start();
183 ldout(cct
, 0) << "ERROR: failed to start sysobj_core service (" << cpp_strerror(-r
) << dendl
;
188 r
= sysobj_cache
->start();
190 ldout(cct
, 0) << "ERROR: failed to start sysobj_cache service (" << cpp_strerror(-r
) << dendl
;
197 ldout(cct
, 0) << "ERROR: failed to start sysobj service (" << cpp_strerror(-r
) << dendl
;
202 r
= datalog_rados
->start();
204 ldout(cct
, 0) << "ERROR: failed to start datalog_rados service (" << cpp_strerror(-r
) << dendl
;
208 r
= meta_be_sobj
->start();
210 ldout(cct
, 0) << "ERROR: failed to start meta_be_sobj service (" << cpp_strerror(-r
) << dendl
;
216 ldout(cct
, 0) << "ERROR: failed to start meta service (" << cpp_strerror(-r
) << dendl
;
220 r
= bucket_sobj
->start();
222 ldout(cct
, 0) << "ERROR: failed to start bucket service (" << cpp_strerror(-r
) << dendl
;
226 r
= bucket_sync_sobj
->start();
228 ldout(cct
, 0) << "ERROR: failed to start bucket_sync service (" << cpp_strerror(-r
) << dendl
;
232 r
= user_rados
->start();
234 ldout(cct
, 0) << "ERROR: failed to start user_rados service (" << cpp_strerror(-r
) << dendl
;
240 ldout(cct
, 0) << "ERROR: failed to start otp service (" << cpp_strerror(-r
) << dendl
;
245 /* cache or core services will be started by sysobj */
250 void RGWServices_Def::shutdown()
260 datalog_rados
->shutdown();
263 sysobj_core
->shutdown();
266 sysobj_cache
->shutdown();
269 zone_utils
->shutdown();
278 int RGWServices::do_init(CephContext
*_cct
, bool have_cache
, bool raw
, bool run_sync
)
282 int r
= _svc
.init(cct
, have_cache
, raw
, run_sync
);
287 finisher
= _svc
.finisher
.get();
288 bi_rados
= _svc
.bi_rados
.get();
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();
303 notify
= _svc
.notify
.get();
304 otp
= _svc
.otp
.get();
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();
313 user
= _svc
.user_rados
.get();
318 int RGWServiceInstance::start()
320 if (start_state
!= StateInit
) {
324 start_state
= StateStarting
;; /* setting started prior to do_start() on purpose so that circular
325 references can call start() on each other */
332 start_state
= StateStarted
;
337 RGWCtlDef::RGWCtlDef() {}
338 RGWCtlDef::~RGWCtlDef() {}
339 RGWCtlDef::_meta::_meta() {}
340 RGWCtlDef::_meta::~_meta() {}
343 int RGWCtlDef::init(RGWServices
& svc
)
345 meta
.mgr
.reset(new RGWMetadataManager(svc
.meta
));
347 meta
.user
.reset(RGWUserMetaHandlerAllocator::alloc(svc
.user
));
349 auto sync_module
= svc
.sync_modules
->get_sync_module();
351 meta
.bucket
.reset(sync_module
->alloc_bucket_meta_handler());
352 meta
.bucket_instance
.reset(sync_module
->alloc_bucket_instance_meta_handler());
354 meta
.bucket
.reset(RGWBucketMetaHandlerAllocator::alloc());
355 meta
.bucket_instance
.reset(RGWBucketInstanceMetaHandlerAllocator::alloc());
358 meta
.otp
.reset(RGWOTPMetaHandlerAllocator::alloc());
360 user
.reset(new RGWUserCtl(svc
.zone
, svc
.user
, (RGWUserMetadataHandler
*)meta
.user
.get()));
361 bucket
.reset(new RGWBucketCtl(svc
.zone
,
365 otp
.reset(new RGWOTPCtl(svc
.zone
, svc
.otp
));
367 RGWBucketMetadataHandlerBase
*bucket_meta_handler
= static_cast<RGWBucketMetadataHandlerBase
*>(meta
.bucket
.get());
368 RGWBucketInstanceMetadataHandlerBase
*bi_meta_handler
= static_cast<RGWBucketInstanceMetadataHandlerBase
*>(meta
.bucket_instance
.get());
370 bucket_meta_handler
->init(svc
.bucket
, bucket
.get());
371 bi_meta_handler
->init(svc
.zone
, svc
.bucket
, svc
.bi
);
373 RGWOTPMetadataHandlerBase
*otp_handler
= static_cast<RGWOTPMetadataHandlerBase
*>(meta
.otp
.get());
374 otp_handler
->init(svc
.zone
, svc
.meta_be_otp
, svc
.otp
);
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());
382 otp
->init((RGWOTPMetadataHandler
*)meta
.otp
.get());
387 int RGWCtl::init(RGWServices
*_svc
)
392 int r
= _ctl
.init(*svc
);
394 ldout(cct
, 0) << "ERROR: failed to start init ctls (" << cpp_strerror(-r
) << dendl
;
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();
404 user
= _ctl
.user
.get();
405 bucket
= _ctl
.bucket
.get();
406 otp
= _ctl
.otp
.get();
408 r
= meta
.user
->attach(meta
.mgr
);
410 ldout(cct
, 0) << "ERROR: failed to start init meta.user ctl (" << cpp_strerror(-r
) << dendl
;
414 r
= meta
.bucket
->attach(meta
.mgr
);
416 ldout(cct
, 0) << "ERROR: failed to start init meta.bucket ctl (" << cpp_strerror(-r
) << dendl
;
420 r
= meta
.bucket_instance
->attach(meta
.mgr
);
422 ldout(cct
, 0) << "ERROR: failed to start init meta.bucket_instance ctl (" << cpp_strerror(-r
) << dendl
;
426 r
= meta
.otp
->attach(meta
.mgr
);
428 ldout(cct
, 0) << "ERROR: failed to start init otp ctl (" << cpp_strerror(-r
) << dendl
;