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
16 RGWSI_MetaBackend_SObj::RGWSI_MetaBackend_SObj(CephContext
*cct
) : RGWSI_MetaBackend(cct
) {
19 RGWSI_MetaBackend_SObj::~RGWSI_MetaBackend_SObj() {
22 RGWSI_MetaBackend_Handler
*RGWSI_MetaBackend_SObj::alloc_be_handler()
24 return new RGWSI_MetaBackend_Handler_SObj(this);
27 RGWSI_MetaBackend::Context
*RGWSI_MetaBackend_SObj::alloc_ctx()
29 return new Context_SObj(sysobj_svc
);
32 int RGWSI_MetaBackend_SObj::pre_modify(const DoutPrefixProvider
*dpp
, RGWSI_MetaBackend::Context
*_ctx
,
34 RGWMetadataLogData
& log_data
,
35 RGWObjVersionTracker
*objv_tracker
,
36 RGWMDLogStatus op_type
,
39 auto ctx
= static_cast<Context_SObj
*>(_ctx
);
40 int ret
= RGWSI_MetaBackend::pre_modify(dpp
, ctx
, key
, log_data
,
41 objv_tracker
, op_type
,
47 /* if write version has not been set, and there's a read version, set it so that we can
51 log_data
.read_version
= objv_tracker
->read_version
;
52 log_data
.write_version
= objv_tracker
->write_version
;
55 log_data
.status
= op_type
;
58 encode(log_data
, logbl
);
60 ret
= mdlog_svc
->add_entry(dpp
, ctx
->module
->get_hash_key(key
), ctx
->module
->get_section(), key
, logbl
);
67 int RGWSI_MetaBackend_SObj::post_modify(const DoutPrefixProvider
*dpp
,
68 RGWSI_MetaBackend::Context
*_ctx
,
70 RGWMetadataLogData
& log_data
,
71 RGWObjVersionTracker
*objv_tracker
, int ret
,
74 auto ctx
= static_cast<Context_SObj
*>(_ctx
);
76 log_data
.status
= MDLOG_STATUS_COMPLETE
;
78 log_data
.status
= MDLOG_STATUS_ABORT
;
81 encode(log_data
, logbl
);
83 int r
= mdlog_svc
->add_entry(dpp
, ctx
->module
->get_hash_key(key
), ctx
->module
->get_section(), key
, logbl
);
90 return RGWSI_MetaBackend::post_modify(dpp
, ctx
, key
, log_data
, objv_tracker
, ret
, y
);
93 int RGWSI_MetaBackend_SObj::get_shard_id(RGWSI_MetaBackend::Context
*_ctx
,
94 const std::string
& key
,
97 auto ctx
= static_cast<Context_SObj
*>(_ctx
);
98 *shard_id
= mdlog_svc
->get_shard_id(ctx
->module
->get_hash_key(key
), shard_id
);
102 int RGWSI_MetaBackend_SObj::call(std::optional
<RGWSI_MetaBackend_CtxParams
> opt
,
103 std::function
<int(RGWSI_MetaBackend::Context
*)> f
)
106 RGWSI_MetaBackend_SObj::Context_SObj
ctx(sysobj_svc
);
111 auto& opt_sobj
= std::get
<RGWSI_MetaBackend_CtxParams_SObj
>(*opt
); // w contains int, not float: will throw
113 RGWSI_MetaBackend_SObj::Context_SObj
ctx(sysobj_svc
, opt_sobj
.sysobj_ctx
);
115 } catch (const std::bad_variant_access
&) {
116 ldout(cct
, 0) << "ERROR: possible bug: " << __FILE__
<< ":" << __LINE__
<< ":" << __func__
<< "(): bad variant access" << dendl
;
122 void RGWSI_MetaBackend_SObj::Context_SObj::init(RGWSI_MetaBackend_Handler
*h
)
124 RGWSI_MetaBackend_Handler_SObj
*handler
= static_cast<RGWSI_MetaBackend_Handler_SObj
*>(h
);
125 module
= handler
->module
;
127 _obj_ctx
.emplace(sysobj_svc
->init_obj_ctx());
128 obj_ctx
= &(*_obj_ctx
);
132 int RGWSI_MetaBackend_SObj::call_with_get_params(ceph::real_time
*pmtime
, std::function
<int(RGWSI_MetaBackend::GetParams
&)> cb
)
135 RGWSI_MBSObj_GetParams params
;
136 params
.pmtime
= pmtime
;
141 int RGWSI_MetaBackend_SObj::get_entry(RGWSI_MetaBackend::Context
*_ctx
,
144 RGWObjVersionTracker
*objv_tracker
,
146 const DoutPrefixProvider
*dpp
)
148 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
149 RGWSI_MBSObj_GetParams
& params
= static_cast<RGWSI_MBSObj_GetParams
&>(_params
);
153 ctx
->module
->get_pool_and_oid(key
, &pool
, &oid
);
155 return rgw_get_system_obj(*ctx
->obj_ctx
, pool
, oid
, *params
.pbl
,
156 objv_tracker
, params
.pmtime
,
158 params
.pattrs
, params
.cache_info
,
159 params
.refresh_version
);
162 int RGWSI_MetaBackend_SObj::put_entry(const DoutPrefixProvider
*dpp
,
163 RGWSI_MetaBackend::Context
*_ctx
,
166 RGWObjVersionTracker
*objv_tracker
,
169 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
170 RGWSI_MBSObj_PutParams
& params
= static_cast<RGWSI_MBSObj_PutParams
&>(_params
);
174 ctx
->module
->get_pool_and_oid(key
, &pool
, &oid
);
176 return rgw_put_system_obj(dpp
, *ctx
->obj_ctx
, pool
, oid
, params
.bl
, params
.exclusive
,
177 objv_tracker
, params
.mtime
, y
, params
.pattrs
);
180 int RGWSI_MetaBackend_SObj::remove_entry(const DoutPrefixProvider
*dpp
,
181 RGWSI_MetaBackend::Context
*_ctx
,
183 RemoveParams
& params
,
184 RGWObjVersionTracker
*objv_tracker
,
187 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
191 ctx
->module
->get_pool_and_oid(key
, &pool
, &oid
);
192 rgw_raw_obj
k(pool
, oid
);
194 auto sysobj
= ctx
->obj_ctx
->get_obj(k
);
196 .set_objv_tracker(objv_tracker
)
200 int RGWSI_MetaBackend_SObj::list_init(const DoutPrefixProvider
*dpp
,
201 RGWSI_MetaBackend::Context
*_ctx
,
202 const string
& marker
)
204 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
209 ctx
->module
->get_pool_and_oid(no_key
, &pool
, nullptr);
211 ctx
->list
.pool
= sysobj_svc
->get_pool(pool
);
212 ctx
->list
.op
.emplace(ctx
->list
.pool
->op());
214 string prefix
= ctx
->module
->get_oid_prefix();
215 ctx
->list
.op
->init(dpp
, marker
, prefix
);
220 int RGWSI_MetaBackend_SObj::list_next(const DoutPrefixProvider
*dpp
,
221 RGWSI_MetaBackend::Context
*_ctx
,
222 int max
, list
<string
> *keys
,
225 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
231 int ret
= ctx
->list
.op
->get_next(dpp
, max
, &oids
, truncated
);
232 if (ret
< 0 && ret
!= -ENOENT
)
234 if (ret
== -ENOENT
) {
240 auto module
= ctx
->module
;
242 for (auto& o
: oids
) {
243 if (!module
->is_valid_oid(o
)) {
246 keys
->emplace_back(module
->oid_to_key(o
));
252 int RGWSI_MetaBackend_SObj::list_get_marker(RGWSI_MetaBackend::Context
*_ctx
,
255 RGWSI_MetaBackend_SObj::Context_SObj
*ctx
= static_cast<RGWSI_MetaBackend_SObj::Context_SObj
*>(_ctx
);
257 return ctx
->list
.op
->get_marker(marker
);