]>
Commit | Line | Data |
---|---|---|
9f95a23c TL |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab ft=cpp | |
3 | ||
4 | ||
5 | #include "svc_meta_be.h" | |
6 | ||
1e59de90 | 7 | #include "rgw_mdlog.h" |
9f95a23c TL |
8 | |
9 | #define dout_subsys ceph_subsys_rgw | |
10 | ||
20effc67 | 11 | using namespace std; |
9f95a23c TL |
12 | |
13 | RGWSI_MetaBackend::Context::~Context() {} // needed, even though destructor is pure virtual | |
14 | RGWSI_MetaBackend::Module::~Module() {} // ditto | |
15 | RGWSI_MetaBackend::PutParams::~PutParams() {} // ... | |
16 | RGWSI_MetaBackend::GetParams::~GetParams() {} // ... | |
17 | RGWSI_MetaBackend::RemoveParams::~RemoveParams() {} // ... | |
18 | ||
b3b6e05e TL |
19 | int RGWSI_MetaBackend::pre_modify(const DoutPrefixProvider *dpp, |
20 | RGWSI_MetaBackend::Context *ctx, | |
9f95a23c TL |
21 | const string& key, |
22 | RGWMetadataLogData& log_data, | |
23 | RGWObjVersionTracker *objv_tracker, | |
24 | RGWMDLogStatus op_type, | |
25 | optional_yield y) | |
26 | { | |
27 | /* if write version has not been set, and there's a read version, set it so that we can | |
28 | * log it | |
29 | */ | |
30 | if (objv_tracker && | |
31 | objv_tracker->read_version.ver && !objv_tracker->write_version.ver) { | |
32 | objv_tracker->write_version = objv_tracker->read_version; | |
33 | objv_tracker->write_version.ver++; | |
34 | } | |
35 | ||
36 | return 0; | |
37 | } | |
38 | ||
b3b6e05e TL |
39 | int RGWSI_MetaBackend::post_modify(const DoutPrefixProvider *dpp, |
40 | RGWSI_MetaBackend::Context *ctx, | |
9f95a23c TL |
41 | const string& key, |
42 | RGWMetadataLogData& log_data, | |
43 | RGWObjVersionTracker *objv_tracker, int ret, | |
44 | optional_yield y) | |
45 | { | |
46 | return ret; | |
47 | } | |
48 | ||
49 | int RGWSI_MetaBackend::prepare_mutate(RGWSI_MetaBackend::Context *ctx, | |
50 | const string& key, | |
51 | const real_time& mtime, | |
52 | RGWObjVersionTracker *objv_tracker, | |
b3b6e05e TL |
53 | optional_yield y, |
54 | const DoutPrefixProvider *dpp) | |
9f95a23c TL |
55 | { |
56 | real_time orig_mtime; | |
57 | ||
58 | int ret = call_with_get_params(&orig_mtime, [&](GetParams& params) { | |
b3b6e05e | 59 | return get_entry(ctx, key, params, objv_tracker, y, dpp); |
9f95a23c TL |
60 | }); |
61 | if (ret < 0 && ret != -ENOENT) { | |
62 | return ret; | |
63 | } | |
64 | ||
65 | if (objv_tracker->write_version.tag.empty()) { | |
66 | if (objv_tracker->read_version.tag.empty()) { | |
67 | objv_tracker->generate_new_write_ver(cct); | |
68 | } else { | |
69 | objv_tracker->write_version = objv_tracker->read_version; | |
70 | objv_tracker->write_version.ver++; | |
71 | } | |
72 | } | |
73 | return 0; | |
74 | } | |
75 | ||
76 | int RGWSI_MetaBackend::do_mutate(RGWSI_MetaBackend::Context *ctx, | |
77 | const string& key, | |
78 | const ceph::real_time& mtime, | |
79 | RGWObjVersionTracker *objv_tracker, | |
80 | RGWMDLogStatus op_type, | |
81 | optional_yield y, | |
82 | std::function<int()> f, | |
b3b6e05e TL |
83 | bool generic_prepare, |
84 | const DoutPrefixProvider *dpp) | |
9f95a23c TL |
85 | { |
86 | int ret; | |
87 | ||
88 | if (generic_prepare) { | |
b3b6e05e | 89 | ret = prepare_mutate(ctx, key, mtime, objv_tracker, y, dpp); |
9f95a23c TL |
90 | if (ret < 0 || |
91 | ret == STATUS_NO_APPLY) { | |
92 | return ret; | |
93 | } | |
94 | } | |
95 | ||
96 | RGWMetadataLogData log_data; | |
b3b6e05e | 97 | ret = pre_modify(dpp, ctx, key, log_data, objv_tracker, op_type, y); |
9f95a23c TL |
98 | if (ret < 0) { |
99 | return ret; | |
100 | } | |
101 | ||
102 | ret = f(); | |
103 | ||
104 | /* cascading ret into post_modify() */ | |
105 | ||
b3b6e05e | 106 | ret = post_modify(dpp, ctx, key, log_data, objv_tracker, ret, y); |
9f95a23c TL |
107 | if (ret < 0) |
108 | return ret; | |
109 | ||
110 | return 0; | |
111 | } | |
112 | ||
113 | int RGWSI_MetaBackend::get(Context *ctx, | |
114 | const string& key, | |
115 | GetParams& params, | |
116 | RGWObjVersionTracker *objv_tracker, | |
b3b6e05e | 117 | optional_yield y, |
39ae355f TL |
118 | const DoutPrefixProvider *dpp, |
119 | bool get_raw_attrs) | |
9f95a23c | 120 | { |
39ae355f | 121 | return get_entry(ctx, key, params, objv_tracker, y, dpp, get_raw_attrs); |
9f95a23c TL |
122 | } |
123 | ||
124 | int RGWSI_MetaBackend::put(Context *ctx, | |
125 | const string& key, | |
126 | PutParams& params, | |
127 | RGWObjVersionTracker *objv_tracker, | |
b3b6e05e TL |
128 | optional_yield y, |
129 | const DoutPrefixProvider *dpp) | |
9f95a23c TL |
130 | { |
131 | std::function<int()> f = [&]() { | |
b3b6e05e | 132 | return put_entry(dpp, ctx, key, params, objv_tracker, y); |
9f95a23c TL |
133 | }; |
134 | ||
135 | return do_mutate(ctx, key, params.mtime, objv_tracker, | |
136 | MDLOG_STATUS_WRITE, | |
137 | y, | |
138 | f, | |
b3b6e05e TL |
139 | false, |
140 | dpp); | |
9f95a23c TL |
141 | } |
142 | ||
143 | int RGWSI_MetaBackend::remove(Context *ctx, | |
144 | const string& key, | |
145 | RemoveParams& params, | |
146 | RGWObjVersionTracker *objv_tracker, | |
b3b6e05e TL |
147 | optional_yield y, |
148 | const DoutPrefixProvider *dpp) | |
9f95a23c TL |
149 | { |
150 | std::function<int()> f = [&]() { | |
b3b6e05e | 151 | return remove_entry(dpp, ctx, key, params, objv_tracker, y); |
9f95a23c TL |
152 | }; |
153 | ||
154 | return do_mutate(ctx, key, params.mtime, objv_tracker, | |
155 | MDLOG_STATUS_REMOVE, | |
156 | y, | |
157 | f, | |
b3b6e05e TL |
158 | false, |
159 | dpp); | |
9f95a23c TL |
160 | } |
161 | ||
162 | int RGWSI_MetaBackend::mutate(Context *ctx, | |
163 | const std::string& key, | |
164 | MutateParams& params, | |
165 | RGWObjVersionTracker *objv_tracker, | |
166 | optional_yield y, | |
b3b6e05e TL |
167 | std::function<int()> f, |
168 | const DoutPrefixProvider *dpp) | |
9f95a23c TL |
169 | { |
170 | return do_mutate(ctx, key, params.mtime, objv_tracker, | |
171 | params.op_type, y, | |
172 | f, | |
b3b6e05e TL |
173 | false, |
174 | dpp); | |
9f95a23c TL |
175 | } |
176 | ||
177 | int RGWSI_MetaBackend_Handler::call(std::optional<RGWSI_MetaBackend_CtxParams> bectx_params, | |
178 | std::function<int(Op *)> f) | |
179 | { | |
180 | return be->call(bectx_params, [&](RGWSI_MetaBackend::Context *ctx) { | |
181 | ctx->init(this); | |
182 | Op op(be, ctx); | |
183 | return f(&op); | |
184 | }); | |
185 | } | |
186 | ||
187 | RGWSI_MetaBackend_Handler::Op_ManagedCtx::Op_ManagedCtx(RGWSI_MetaBackend_Handler *handler) : Op(handler->be, handler->be->alloc_ctx()) | |
188 | { | |
189 | auto c = ctx(); | |
190 | c->init(handler); | |
191 | pctx.reset(c); | |
192 | } | |
193 |