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 "svc_meta_be_sobj.h"
5 #include "svc_meta_be_params.h"
8 #include "rgw/rgw_tools.h"
9 #include "rgw/rgw_metadata.h"
10 #include "rgw/rgw_mdlog.h"
12 #define dout_subsys ceph_subsys_rgw
15 RGWSI_MetaBackend_SObj::RGWSI_MetaBackend_SObj(CephContext
*cct
) : RGWSI_MetaBackend(cct
) {
18 RGWSI_MetaBackend_SObj::~RGWSI_MetaBackend_SObj() {
21 RGWSI_MetaBackend_Handler
*RGWSI_MetaBackend_SObj::alloc_be_handler()
23 return new RGWSI_MetaBackend_Handler_SObj(this);
26 RGWSI_MetaBackend::Context
*RGWSI_MetaBackend_SObj::alloc_ctx()
28 return new Context_SObj(sysobj_svc
);
31 int RGWSI_MetaBackend_SObj::pre_modify(const DoutPrefixProvider
*dpp
, RGWSI_MetaBackend::Context
*_ctx
,
33 RGWMetadataLogData
& log_data
,
34 RGWObjVersionTracker
*objv_tracker
,
35 RGWMDLogStatus op_type
,
38 auto ctx
= static_cast<Context_SObj
*>(_ctx
);
39 int ret
= RGWSI_MetaBackend::pre_modify(dpp
, ctx
, key
, log_data
,
40 objv_tracker
, op_type
,
46 /* if write version has not been set, and there's a read version, set it so that we can
50 log_data
.read_version
= objv_tracker
->read_version
;
51 log_data
.write_version
= objv_tracker
->write_version
;
54 log_data
.status
= op_type
;
57 encode(log_data
, logbl
);
59 ret
= mdlog_svc
->add_entry(dpp
, ctx
->module
->get_hash_key(key
), ctx
->module
->get_section(), key
, logbl
);
66 int RGWSI_MetaBackend_SObj::post_modify(const DoutPrefixProvider
*dpp
,
67 RGWSI_MetaBackend::Context
*_ctx
,
69 RGWMetadataLogData
& log_data
,
70 RGWObjVersionTracker
*objv_tracker
, int ret
,
73 auto ctx
= static_cast<Context_SObj
*>(_ctx
);
75 log_data
.status
= MDLOG_STATUS_COMPLETE
;
77 log_data
.status
= MDLOG_STATUS_ABORT
;
80 encode(log_data
, logbl
);
82 int r
= mdlog_svc
->add_entry(dpp
, ctx
->module
->get_hash_key(key
), ctx
->module
->get_section(), key
, logbl
);
89 return RGWSI_MetaBackend::post_modify(dpp
, ctx
, key
, log_data
, objv_tracker
, ret
, y
);
92 int RGWSI_MetaBackend_SObj::get_shard_id(RGWSI_MetaBackend::Context
*_ctx
,
93 const std::string
& key
,
96 auto ctx
= static_cast<Context_SObj
*>(_ctx
);
97 *shard_id
= mdlog_svc
->get_shard_id(ctx
->module
->get_hash_key(key
), shard_id
);
101 int RGWSI_MetaBackend_SObj::call(std::optional
<RGWSI_MetaBackend_CtxParams
> opt
,
102 std::function
<int(RGWSI_MetaBackend::Context
*)> f
)
105 RGWSI_MetaBackend_SObj::Context_SObj
ctx(sysobj_svc
);
110 auto& opt_sobj
= std::get
<RGWSI_MetaBackend_CtxParams_SObj
>(*opt
); // w contains int, not float: will throw
112 RGWSI_MetaBackend_SObj::Context_SObj
ctx(sysobj_svc
, opt_sobj
.sysobj_ctx
);
114 } catch (const std::bad_variant_access
&) {
115 ldout(cct
, 0) << "ERROR: possible bug: " << __FILE__
<< ":" << __LINE__
<< ":" << __func__
<< "(): bad variant access" << dendl
;
121 void RGWSI_MetaBackend_SObj::Context_SObj::init(RGWSI_MetaBackend_Handler
*h
)
123 RGWSI_MetaBackend_Handler_SObj
*handler
= static_cast<RGWSI_MetaBackend_Handler_SObj
*>(h
);
124 module
= handler
->module
;
126 _obj_ctx
.emplace(sysobj_svc
->init_obj_ctx());
127 obj_ctx
= &(*_obj_ctx
);
131 int RGWSI_MetaBackend_SObj::call_with_get_params(ceph::real_time
*pmtime
, std::function
<int(RGWSI_MetaBackend::GetParams
&)> cb
)
134 RGWSI_MBSObj_GetParams params
;
135 params
.pmtime
= pmtime
;
140 int RGWSI_MetaBackend_SObj::get_entry(RGWSI_MetaBackend::Context
*_ctx
,
143 RGWObjVersionTracker
*objv_tracker
,
145 const DoutPrefixProvider
*dpp
)
147 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
148 RGWSI_MBSObj_GetParams
& params
= static_cast<RGWSI_MBSObj_GetParams
&>(_params
);
152 ctx
->module
->get_pool_and_oid(key
, &pool
, &oid
);
154 return rgw_get_system_obj(*ctx
->obj_ctx
, pool
, oid
, *params
.pbl
,
155 objv_tracker
, params
.pmtime
,
157 params
.pattrs
, params
.cache_info
,
158 params
.refresh_version
);
161 int RGWSI_MetaBackend_SObj::put_entry(const DoutPrefixProvider
*dpp
,
162 RGWSI_MetaBackend::Context
*_ctx
,
165 RGWObjVersionTracker
*objv_tracker
,
168 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
169 RGWSI_MBSObj_PutParams
& params
= static_cast<RGWSI_MBSObj_PutParams
&>(_params
);
173 ctx
->module
->get_pool_and_oid(key
, &pool
, &oid
);
175 return rgw_put_system_obj(dpp
, *ctx
->obj_ctx
, pool
, oid
, params
.bl
, params
.exclusive
,
176 objv_tracker
, params
.mtime
, y
, params
.pattrs
);
179 int RGWSI_MetaBackend_SObj::remove_entry(const DoutPrefixProvider
*dpp
,
180 RGWSI_MetaBackend::Context
*_ctx
,
182 RemoveParams
& params
,
183 RGWObjVersionTracker
*objv_tracker
,
186 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
190 ctx
->module
->get_pool_and_oid(key
, &pool
, &oid
);
191 rgw_raw_obj
k(pool
, oid
);
193 auto sysobj
= ctx
->obj_ctx
->get_obj(k
);
195 .set_objv_tracker(objv_tracker
)
199 int RGWSI_MetaBackend_SObj::list_init(const DoutPrefixProvider
*dpp
,
200 RGWSI_MetaBackend::Context
*_ctx
,
201 const string
& marker
)
203 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
208 ctx
->module
->get_pool_and_oid(no_key
, &pool
, nullptr);
210 ctx
->list
.pool
= sysobj_svc
->get_pool(pool
);
211 ctx
->list
.op
.emplace(ctx
->list
.pool
->op());
213 string prefix
= ctx
->module
->get_oid_prefix();
214 ctx
->list
.op
->init(dpp
, marker
, prefix
);
219 int RGWSI_MetaBackend_SObj::list_next(RGWSI_MetaBackend::Context
*_ctx
,
220 int max
, list
<string
> *keys
,
223 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
229 int ret
= ctx
->list
.op
->get_next(max
, &oids
, truncated
);
230 if (ret
< 0 && ret
!= -ENOENT
)
232 if (ret
== -ENOENT
) {
238 auto module
= ctx
->module
;
240 for (auto& o
: oids
) {
241 if (!module
->is_valid_oid(o
)) {
244 keys
->emplace_back(module
->oid_to_key(o
));
250 int RGWSI_MetaBackend_SObj::list_get_marker(RGWSI_MetaBackend::Context
*_ctx
,
253 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
255 return ctx
->list
.op
->get_marker(marker
);