1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
5 #include "svc_meta_be.h"
7 #include "rgw/rgw_mdlog.h"
9 #define dout_subsys ceph_subsys_rgw
12 RGWSI_MetaBackend::Context::~Context() {} // needed, even though destructor is pure virtual
13 RGWSI_MetaBackend::Module::~Module() {} // ditto
14 RGWSI_MetaBackend::PutParams::~PutParams() {} // ...
15 RGWSI_MetaBackend::GetParams::~GetParams() {} // ...
16 RGWSI_MetaBackend::RemoveParams::~RemoveParams() {} // ...
18 int RGWSI_MetaBackend::pre_modify(const DoutPrefixProvider
*dpp
,
19 RGWSI_MetaBackend::Context
*ctx
,
21 RGWMetadataLogData
& log_data
,
22 RGWObjVersionTracker
*objv_tracker
,
23 RGWMDLogStatus op_type
,
26 /* if write version has not been set, and there's a read version, set it so that we can
30 objv_tracker
->read_version
.ver
&& !objv_tracker
->write_version
.ver
) {
31 objv_tracker
->write_version
= objv_tracker
->read_version
;
32 objv_tracker
->write_version
.ver
++;
38 int RGWSI_MetaBackend::post_modify(const DoutPrefixProvider
*dpp
,
39 RGWSI_MetaBackend::Context
*ctx
,
41 RGWMetadataLogData
& log_data
,
42 RGWObjVersionTracker
*objv_tracker
, int ret
,
48 int RGWSI_MetaBackend::prepare_mutate(RGWSI_MetaBackend::Context
*ctx
,
50 const real_time
& mtime
,
51 RGWObjVersionTracker
*objv_tracker
,
53 const DoutPrefixProvider
*dpp
)
57 int ret
= call_with_get_params(&orig_mtime
, [&](GetParams
& params
) {
58 return get_entry(ctx
, key
, params
, objv_tracker
, y
, dpp
);
60 if (ret
< 0 && ret
!= -ENOENT
) {
64 if (objv_tracker
->write_version
.tag
.empty()) {
65 if (objv_tracker
->read_version
.tag
.empty()) {
66 objv_tracker
->generate_new_write_ver(cct
);
68 objv_tracker
->write_version
= objv_tracker
->read_version
;
69 objv_tracker
->write_version
.ver
++;
75 int RGWSI_MetaBackend::do_mutate(RGWSI_MetaBackend::Context
*ctx
,
77 const ceph::real_time
& mtime
,
78 RGWObjVersionTracker
*objv_tracker
,
79 RGWMDLogStatus op_type
,
81 std::function
<int()> f
,
83 const DoutPrefixProvider
*dpp
)
87 if (generic_prepare
) {
88 ret
= prepare_mutate(ctx
, key
, mtime
, objv_tracker
, y
, dpp
);
90 ret
== STATUS_NO_APPLY
) {
95 RGWMetadataLogData log_data
;
96 ret
= pre_modify(dpp
, ctx
, key
, log_data
, objv_tracker
, op_type
, y
);
103 /* cascading ret into post_modify() */
105 ret
= post_modify(dpp
, ctx
, key
, log_data
, objv_tracker
, ret
, y
);
112 int RGWSI_MetaBackend::get(Context
*ctx
,
115 RGWObjVersionTracker
*objv_tracker
,
117 const DoutPrefixProvider
*dpp
)
119 return get_entry(ctx
, key
, params
, objv_tracker
, y
, dpp
);
122 int RGWSI_MetaBackend::put(Context
*ctx
,
125 RGWObjVersionTracker
*objv_tracker
,
127 const DoutPrefixProvider
*dpp
)
129 std::function
<int()> f
= [&]() {
130 return put_entry(dpp
, ctx
, key
, params
, objv_tracker
, y
);
133 return do_mutate(ctx
, key
, params
.mtime
, objv_tracker
,
141 int RGWSI_MetaBackend::remove(Context
*ctx
,
143 RemoveParams
& params
,
144 RGWObjVersionTracker
*objv_tracker
,
146 const DoutPrefixProvider
*dpp
)
148 std::function
<int()> f
= [&]() {
149 return remove_entry(dpp
, ctx
, key
, params
, objv_tracker
, y
);
152 return do_mutate(ctx
, key
, params
.mtime
, objv_tracker
,
160 int RGWSI_MetaBackend::mutate(Context
*ctx
,
161 const std::string
& key
,
162 MutateParams
& params
,
163 RGWObjVersionTracker
*objv_tracker
,
165 std::function
<int()> f
,
166 const DoutPrefixProvider
*dpp
)
168 return do_mutate(ctx
, key
, params
.mtime
, objv_tracker
,
175 int RGWSI_MetaBackend_Handler::call(std::optional
<RGWSI_MetaBackend_CtxParams
> bectx_params
,
176 std::function
<int(Op
*)> f
)
178 return be
->call(bectx_params
, [&](RGWSI_MetaBackend::Context
*ctx
) {
185 RGWSI_MetaBackend_Handler::Op_ManagedCtx::Op_ManagedCtx(RGWSI_MetaBackend_Handler
*handler
) : Op(handler
->be
, handler
->be
->alloc_ctx())