Similar to svc, just for higher level apis.
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
return otp_meta_handler;
}
-void rgw_otp_init(RGWRados *store)
+RGWMetadataHandler *RGWOTPMetaHandlerAllocator::alloc(RGWSI_Zone *zone_svc,
+ RGWSI_MetaBackend *meta_be_svc)
{
- otp_meta_handler = new RGWOTPMetadataHandler(store->svc.zone,
- store->svc.meta_be);
- otp_meta_handler->init(store->svc.meta->get_mgr());
+ return new RGWOTPMetadataHandler(zone_svc, meta_be_svc);
}
class RGWMetadataHandler;
RGWMetadataHandler *rgw_otp_get_handler(void);
-void rgw_otp_init(RGWRados *store);
+
+class RGWOTPMetaHandlerAllocator {
+public:
+ static RGWMetadataHandler *alloc(RGWSI_Zone *zone_svc, RGWSI_MetaBackend *meta_be_svc);
+};
+
#endif
if (run_sync_thread) {
// initialize the log period history
- meta_mgr->init_oldest_log_period();
+ ctl.meta.mgr->init_oldest_log_period();
}
async_rados = new RGWAsyncRadosProcessor(this, cct->_conf->rgw_num_async_rados_threads);
async_rados->start();
- ret = meta_mgr->init(current_period.get_id());
+ ret = ctl.meta.mgr->init(current_period.get_id());
if (ret < 0) {
lderr(cct) << "ERROR: failed to initialize metadata log: "
<< cpp_strerror(-ret) << dendl;
}
if (svc.zone->is_meta_master()) {
- auto md_log = meta_mgr->get_log(current_period.get_id());
+ auto md_log = ctl.meta.mgr->get_log(current_period.get_id());
meta_notifier = new RGWMetaNotifier(this, md_log);
meta_notifier->start();
}
return svc.init(cct, use_cache);
}
+int RGWRados::init_ctl()
+{
+ return ctl.init(svc);
+}
+
/**
* Initialize the RADOS instance and prepare to do other ops
* Returns 0 on success, -ERR# on failure.
return ret;
}
+ ret = init_ctl();
+ if (ret < 0) {
+ ldout(cct, 0) << "ERROR: failed to init ctls (ret=" << cpp_strerror(-ret) << ")" << dendl;
+ return ret;
+ }
+
host_id = svc.zone_utils->gen_host_id();
ret = init_rados();
}
RGWServices svc;
+ RGWCtl ctl;
/**
* AmazonS3 errors contain a HostId string, but is an opaque base64 blob; we
}
/** Initialize the RADOS instance and prepare to do other ops */
int init_svc(bool raw);
+ int init_ctl();
int init_rados();
int init_complete();
int initialize();
#include "services/svc_meta.h"
#include "services/svc_meta_be.h"
#include "services/svc_meta_be_sobj.h"
+#include "services/svc_meta_be_otp.h"
#include "services/svc_notify.h"
#include "services/svc_rados.h"
#include "services/svc_zone.h"
#include "common/errno.h"
+#include "rgw_metadata.h"
+#include "rgw_user.h"
+#include "rgw_bucket.h"
+#include "rgw_otp.h"
+
#define dout_subsys ceph_subsys_rgw
mdlog = std::make_unique<RGWSI_MDLog>(cct);
meta = std::make_unique<RGWSI_Meta>(cct);
meta_be_sobj = std::make_unique<RGWSI_MetaBackend_SObj>(cct);
+ meta_be_otp = std::make_unique<RGWSI_MetaBackend_OTP>(cct);
notify = std::make_unique<RGWSI_Notify>(cct);
rados = std::make_unique<RGWSI_RADOS>(cct);
zone = std::make_unique<RGWSI_Zone>(cct);
sysobj_cache = std::make_unique<RGWSI_SysObj_Cache>(cct);
}
- vector<RGWSI_MetaBackend *> meta_bes{meta_be_sobj.get()};
+ vector<RGWSI_MetaBackend *> meta_bes{meta_be_sobj.get(), meta_be_otp.get()};
finisher->init();
bucket->init(zone.get(), sysobj.get(), sysobj_cache.get(), meta.get(), sync_modules.get());
mdlog->init(zone.get(), sysobj.get());
meta->init(sysobj.get(), mdlog.get(), meta_bes);
meta_be_sobj->init(sysobj.get(), mdlog.get());
+ meta_be_otp->init(sysobj.get(), mdlog.get(), cls.get());
notify->init(zone.get(), rados.get(), finisher.get());
rados->init();
zone->init(sysobj.get(), rados.get(), sync_modules.get());
}
-int RGWServices::do_init(CephContext *cct, bool have_cache, bool raw)
+int RGWServices::do_init(CephContext *_cct, bool have_cache, bool raw)
{
+ cct = _cct;
+
int r = _svc.init(cct, have_cache, raw);
if (r < 0) {
return r;
cls = _svc.cls.get();
mdlog = _svc.mdlog.get();
meta = _svc.meta.get();
- meta_be = _svc.meta_be_sobj.get();
+ meta_be_sobj = _svc.meta_be_sobj.get();
+ meta_be_otp = _svc.meta_be_otp.get();
notify = _svc.notify.get();
rados = _svc.rados.get();
zone = _svc.zone.get();
sysobj = _svc.sysobj.get();
cache = _svc.sysobj_cache.get();
core = _svc.sysobj_core.get();
+ user = _svc.user.get();
return 0;
}
return 0;
}
+
+RGWCtlDef::RGWCtlDef() {}
+RGWCtlDef::~RGWCtlDef() {}
+RGWCtlDef::_meta::_meta() {}
+RGWCtlDef::_meta::~_meta() {}
+
+
+int RGWCtlDef::init(RGWServices& svc)
+{
+ meta.mgr.reset(new RGWMetadataManager(svc.meta));
+
+ meta.user.reset(RGWUserMetaHandlerAllocator::alloc(svc.user));
+
+ auto sync_module = svc.sync_modules->get_sync_module();
+ if (sync_module) {
+ meta.bucket.reset(sync_module->alloc_bucket_meta_handler());
+ meta.bucket_instance.reset(sync_module->alloc_bucket_instance_meta_handler());
+ } else {
+ meta.bucket.reset(RGWBucketMetaHandlerAllocator::alloc());
+ meta.bucket_instance.reset(RGWBucketInstanceMetaHandlerAllocator::alloc());
+ }
+
+ meta.otp.reset(RGWOTPMetaHandlerAllocator::alloc(svc.zone, svc.meta_be_otp));
+
+ user.reset(new RGWUserCtl(svc.zone, svc.user, (RGWUserMetadataHandler *)meta.user.get()));
+
+ return 0;
+}
+
+int RGWCtl::init(RGWServices& svc)
+{
+ int r = _ctl.init(svc);
+ if (r < 0) {
+ ldout(svc.cct, 0) << "ERROR: failed to start init ctls (" << cpp_strerror(-r) << dendl;
+ return r;
+ }
+
+ meta.mgr = _ctl.meta.mgr.get();
+ meta.user = _ctl.meta.user.get();
+ meta.bucket = _ctl.meta.bucket.get();
+ meta.bucket_instance = _ctl.meta.bucket_instance.get();
+
+ user = _ctl.user.get();
+
+ r = meta.user->init(meta.mgr);
+ if (r < 0) {
+ ldout(svc.cct, 0) << "ERROR: failed to start init meta.user ctl (" << cpp_strerror(-r) << dendl;
+ return r;
+ }
+
+ r = meta.bucket->init(meta.mgr);
+ if (r < 0) {
+ ldout(svc.cct, 0) << "ERROR: failed to start init meta.bucket ctl (" << cpp_strerror(-r) << dendl;
+ return r;
+ }
+
+ r = meta.bucket_instance->init(meta.mgr);
+ if (r < 0) {
+ ldout(svc.cct, 0) << "ERROR: failed to start init meta.bucket_instance ctl (" << cpp_strerror(-r) << dendl;
+ return r;
+ }
+
+ r = meta.otp->init(meta.mgr);
+ if (r < 0) {
+ ldout(svc.cct, 0) << "ERROR: failed to start init otp ctl (" << cpp_strerror(-r) << dendl;
+ return r;
+ }
+
+ return 0;
+}
+
class RGWSI_Meta;
class RGWSI_MetaBackend;
class RGWSI_MetaBackend_SObj;
+class RGWSI_MetaBackend_OTP;
class RGWSI_Notify;
class RGWSI_RADOS;
class RGWSI_Zone;
std::unique_ptr<RGWSI_MDLog> mdlog;
std::unique_ptr<RGWSI_Meta> meta;
std::unique_ptr<RGWSI_MetaBackend_SObj> meta_be_sobj;
+ std::unique_ptr<RGWSI_MetaBackend_OTP> meta_be_otp;
std::unique_ptr<RGWSI_Notify> notify;
std::unique_ptr<RGWSI_RADOS> rados;
std::unique_ptr<RGWSI_Zone> zone;
{
RGWServices_Def _svc;
+ CephContext *cct;
+
RGWSI_Finisher *finisher{nullptr};
RGWSI_Bucket *bucket{nullptr};
RGWSI_Cls *cls{nullptr};
RGWSI_MDLog *mdlog{nullptr};
RGWSI_Meta *meta{nullptr};
- RGWSI_MetaBackend *meta_be{nullptr};
+ RGWSI_MetaBackend *meta_be_sobj{nullptr};
+ RGWSI_MetaBackend *meta_be_otp{nullptr};
RGWSI_Notify *notify{nullptr};
RGWSI_RADOS *rados{nullptr};
RGWSI_Zone *zone{nullptr};
RGWSI_SysObj *sysobj{nullptr};
RGWSI_SysObj_Cache *cache{nullptr};
RGWSI_SysObj_Core *core{nullptr};
+ RGWSI_User *user{nullptr};
int do_init(CephContext *cct, bool have_cache, bool raw_storage);
}
};
+class RGWMetadataManager;
+class RGWMetadataHandler;
+class RGWUserCtl;
+
+struct RGWCtlDef {
+ struct _meta {
+ std::unique_ptr<RGWMetadataManager> mgr;
+ std::unique_ptr<RGWMetadataHandler> bucket;
+ std::unique_ptr<RGWMetadataHandler> bucket_instance;
+ std::unique_ptr<RGWMetadataHandler> user;
+ std::unique_ptr<RGWMetadataHandler> otp;
+
+ _meta();
+ ~_meta();
+ } meta;
+
+ std::unique_ptr<RGWUserCtl> user;
+
+ RGWCtlDef();
+ ~RGWCtlDef();
+
+ int init(RGWServices& svc);
+};
+
+struct RGWCtl {
+ RGWCtlDef _ctl;
+
+ struct _meta {
+ RGWMetadataManager *mgr{nullptr};
+
+ RGWMetadataHandler *bucket{nullptr};
+ RGWMetadataHandler *bucket_instance{nullptr};
+ RGWMetadataHandler *user{nullptr};
+ RGWMetadataHandler *otp{nullptr};
+ } meta;
+
+ RGWUserCtl *user{nullptr};
+
+ int init(RGWServices& svc);
+};
#endif
{
binfo_cache.reset(new RGWChainedCacheImpl<bucket_info_cache_entry>);
binfo_cache->init(svc.cache);
-
- auto mm = svc.meta->get_mgr();
- auto sync_module = svc.sync_modules->get_sync_module();
- if (sync_module) {
- bucket_meta_handler = sync_module->alloc_bucket_meta_handler();
- bucket_instance_meta_handler = sync_module->alloc_bucket_instance_meta_handler();
- } else {
- bucket_meta_handler = RGWBucketMetaHandlerAllocator::alloc();
- bucket_instance_meta_handler = RGWBucketInstanceMetaHandlerAllocator::alloc();
- }
-
- int r = bucket_meta_handler->init(mm);
- if (r < 0) {
- return r;
- }
-
- r = bucket_instance_meta_handler->init(mm);
- if (r < 0) {
- return r;
- }
return 0;
}
{
uinfo_cache.reset(new RGWChainedCacheImpl<user_info_cache_entry>);
uinfo_cache->init(svc.cache);
-
- auto mm = svc.meta->get_mgr();
- user_meta_handler = RGWUserMetaHandlerAllocator::alloc(this);
-
- int r = user_meta_handler->init(mm);
- if (r < 0) {
- return r;
- }
-
return 0;
}