]> git.proxmox.com Git - ceph.git/blame - ceph/src/rgw/rgw_sal_filter.h
compile with GCC 12 not 11
[ceph.git] / ceph / src / rgw / rgw_sal_filter.h
CommitLineData
1e59de90
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 * Ceph - scalable distributed file system
6 *
7 * Copyright (C) 2022 Red Hat, Inc.
8 *
9 * This is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License version 2.1, as published by the Free Software
12 * Foundation. See file COPYING.
13 *
14 */
15
16#pragma once
17
18#include "rgw_sal.h"
19#include "rgw_oidc_provider.h"
20#include "rgw_role.h"
21
22namespace rgw { namespace sal {
23
24class FilterCompletions : public Completions {
25protected:
26 std::unique_ptr<Completions> next;
27
28public:
29 FilterCompletions(std::unique_ptr<Completions> _next) : next(std::move(_next)) {}
30 virtual ~FilterCompletions() = default;
31 virtual int drain() override { return next->drain(); }
32};
33
34class FilterPlacementTier : public PlacementTier {
35protected:
36 std::unique_ptr<PlacementTier> next;
37
38public:
39 FilterPlacementTier(std::unique_ptr<PlacementTier> _next) : next(std::move(_next)) {}
40 virtual ~FilterPlacementTier() = default;
41
42 virtual const std::string& get_tier_type() override { return next->get_tier_type(); }
43 virtual const std::string& get_storage_class() override { return next->get_storage_class(); }
44 virtual bool retain_head_object() override { return next->retain_head_object(); }
45
46 /* Internal to Filters */
47 PlacementTier* get_next() { return next.get(); }
48};
49
50class FilterZoneGroup : public ZoneGroup {
51protected:
52 std::unique_ptr<ZoneGroup> next;
53
54public:
55 FilterZoneGroup(std::unique_ptr<ZoneGroup> _next) : next(std::move(_next)) {}
56 virtual ~FilterZoneGroup() = default;
57 virtual const std::string& get_id() const override
58 { return next->get_id(); }
59 virtual const std::string& get_name() const override
60 { return next->get_name(); }
61 virtual int equals(const std::string& other_zonegroup) const override
62 { return next->equals(other_zonegroup); }
63 virtual const std::string& get_endpoint() const override
64 { return next->get_endpoint(); }
65 virtual bool placement_target_exists(std::string& target) const override
66 { return next->placement_target_exists(target); }
67 virtual bool is_master_zonegroup() const override
68 { return next->is_master_zonegroup(); }
69 virtual const std::string& get_api_name() const override
70 { return next->get_api_name(); }
71 virtual int get_placement_target_names(std::set<std::string>& names) const override
72 { return next->get_placement_target_names(names); }
73 virtual const std::string& get_default_placement_name() const override
74 { return next->get_default_placement_name(); }
75 virtual int get_hostnames(std::list<std::string>& names) const override
76 { return next->get_hostnames(names); }
77 virtual int get_s3website_hostnames(std::list<std::string>& names) const override
78 { return next->get_s3website_hostnames(names); }
79 virtual int get_zone_count() const override
80 { return next->get_zone_count(); }
81 virtual int get_placement_tier(const rgw_placement_rule& rule, std::unique_ptr<PlacementTier>* tier) override;
82 virtual int get_zone_by_id(const std::string& id, std::unique_ptr<Zone>* zone) override;
83 virtual int get_zone_by_name(const std::string& name, std::unique_ptr<Zone>* zone) override;
84 virtual int list_zones(std::list<std::string>& zone_ids) override
85 { return next->list_zones(zone_ids); }
86 virtual std::unique_ptr<ZoneGroup> clone() override {
87 std::unique_ptr<ZoneGroup> nzg = next->clone();
88 return std::make_unique<FilterZoneGroup>(std::move(nzg));
89 }
90};
91
92class FilterZone : public Zone {
93protected:
94 std::unique_ptr<Zone> next;
95private:
96 std::unique_ptr<ZoneGroup> group;
97
98public:
99 FilterZone(std::unique_ptr<Zone> _next) : next(std::move(_next))
100 {
101 group = std::make_unique<FilterZoneGroup>(next->get_zonegroup().clone());
102 }
103 virtual ~FilterZone() = default;
104
105 virtual std::unique_ptr<Zone> clone() override {
106 std::unique_ptr<Zone> nz = next->clone();
107 return std::make_unique<FilterZone>(std::move(nz));
108 }
109 virtual ZoneGroup& get_zonegroup() override {
110 return *group.get();
111 }
112 virtual const std::string& get_id() override {
113 return next->get_id();
114 }
115 virtual const std::string& get_name() const override {
116 return next->get_name();
117 }
118 virtual bool is_writeable() override {
119 return next->is_writeable();
120 }
121 virtual bool get_redirect_endpoint(std::string* endpoint) override {
122 return next->get_redirect_endpoint(endpoint);
123 }
124 virtual bool has_zonegroup_api(const std::string& api) const override {
125 return next->has_zonegroup_api(api);
126 }
127 virtual const std::string& get_current_period_id() override {
128 return next->get_current_period_id();
129 }
130 virtual const RGWAccessKey& get_system_key() override {
131 return next->get_system_key();
132 }
133 virtual const std::string& get_realm_name() override {
134 return next->get_realm_name();
135 }
136 virtual const std::string& get_realm_id() override {
137 return next->get_realm_id();
138 }
139 virtual const std::string_view get_tier_type() override {
140 return next->get_tier_type();
141 }
142 virtual RGWBucketSyncPolicyHandlerRef get_sync_policy_handler() override {
143 return next->get_sync_policy_handler();
144 }
145};
146
147class FilterDriver : public Driver {
148protected:
149 Driver* next;
150private:
151 std::unique_ptr<FilterZone> zone;
152
153public:
154 FilterDriver(Driver* _next) : next(_next) {}
155 virtual ~FilterDriver() = default;
156
157 virtual int initialize(CephContext *cct, const DoutPrefixProvider *dpp) override;
158 virtual const std::string get_name() const override;
159 virtual std::string get_cluster_id(const DoutPrefixProvider* dpp,
160 optional_yield y) override;
161 virtual std::unique_ptr<User> get_user(const rgw_user& u) override;
162 virtual int get_user_by_access_key(const DoutPrefixProvider* dpp, const
163 std::string& key, optional_yield y,
164 std::unique_ptr<User>* user) override;
165 virtual int get_user_by_email(const DoutPrefixProvider* dpp, const
166 std::string& email, optional_yield y,
167 std::unique_ptr<User>* user) override;
168 virtual int get_user_by_swift(const DoutPrefixProvider* dpp, const
169 std::string& user_str, optional_yield y,
170 std::unique_ptr<User>* user) override;
171 virtual std::unique_ptr<Object> get_object(const rgw_obj_key& k) override;
172 virtual int get_bucket(User* u, const RGWBucketInfo& i,
173 std::unique_ptr<Bucket>* bucket) override;
174 virtual int get_bucket(const DoutPrefixProvider* dpp, User* u, const
175 rgw_bucket& b, std::unique_ptr<Bucket>* bucket,
176 optional_yield y) override;
177 virtual int get_bucket(const DoutPrefixProvider* dpp, User* u, const
178 std::string& tenant, const std::string& name,
179 std::unique_ptr<Bucket>* bucket, optional_yield y) override;
180 virtual bool is_meta_master() override;
181 virtual int forward_request_to_master(const DoutPrefixProvider *dpp, User* user,
182 obj_version* objv, bufferlist& in_data,
183 JSONParser* jp, req_info& info,
184 optional_yield y) override;
185 virtual int forward_iam_request_to_master(const DoutPrefixProvider *dpp,
186 const RGWAccessKey& key,
187 obj_version* objv,
188 bufferlist& in_data,
189 RGWXMLDecoder::XMLParser* parser,
190 req_info& info,
191 optional_yield y) override;
192 virtual Zone* get_zone() override { return zone.get(); }
193 virtual std::string zone_unique_id(uint64_t unique_num) override;
194 virtual std::string zone_unique_trans_id(const uint64_t unique_num) override;
195 virtual int get_zonegroup(const std::string& id, std::unique_ptr<ZoneGroup>* zonegroup) override;
196 virtual int list_all_zones(const DoutPrefixProvider* dpp, std::list<std::string>& zone_ids) override {
197 return next->list_all_zones(dpp, zone_ids);
198 }
199 virtual int cluster_stat(RGWClusterStat& stats) override;
200 virtual std::unique_ptr<Lifecycle> get_lifecycle(void) override;
201 virtual std::unique_ptr<Completions> get_completions(void) override;
202
203 virtual std::unique_ptr<Notification> get_notification(rgw::sal::Object* obj,
204 rgw::sal::Object* src_obj, struct req_state* s,
205 rgw::notify::EventType event_type, optional_yield y,
206 const std::string* object_name=nullptr) override;
207 virtual std::unique_ptr<Notification> get_notification(
208 const DoutPrefixProvider* dpp, rgw::sal::Object* obj, rgw::sal::Object* src_obj,
209
210 rgw::notify::EventType event_type, rgw::sal::Bucket* _bucket,
211 std::string& _user_id, std::string& _user_tenant,
212 std::string& _req_id, optional_yield y) override;
213
214 int read_topics(const std::string& tenant, rgw_pubsub_topics& topics, RGWObjVersionTracker* objv_tracker,
215 optional_yield y, const DoutPrefixProvider *dpp) override {
216 return next->read_topics(tenant, topics, objv_tracker, y, dpp);
217 }
218 int write_topics(const std::string& tenant, const rgw_pubsub_topics& topics, RGWObjVersionTracker* objv_tracker,
219 optional_yield y, const DoutPrefixProvider *dpp) override {
220 return next->write_topics(tenant, topics, objv_tracker, y, dpp);
221 }
222 int remove_topics(const std::string& tenant, RGWObjVersionTracker* objv_tracker,
223 optional_yield y, const DoutPrefixProvider *dpp) override {
224 return next->remove_topics(tenant, objv_tracker, y, dpp);
225 }
226
227 virtual RGWLC* get_rgwlc(void) override;
228 virtual RGWCoroutinesManagerRegistry* get_cr_registry() override;
229
230 virtual int log_usage(const DoutPrefixProvider *dpp, std::map<rgw_user_bucket,
231 RGWUsageBatch>& usage_info) override;
232 virtual int log_op(const DoutPrefixProvider *dpp, std::string& oid,
233 bufferlist& bl) override;
234 virtual int register_to_service_map(const DoutPrefixProvider *dpp, const
235 std::string& daemon_type,
236 const std::map<std::string,
237 std::string>& meta) override;
238 virtual void get_quota(RGWQuota& quota) override;
239 virtual void get_ratelimit(RGWRateLimitInfo& bucket_ratelimit,
240 RGWRateLimitInfo& user_ratelimit,
241 RGWRateLimitInfo& anon_ratelimit) override;
242 virtual int set_buckets_enabled(const DoutPrefixProvider* dpp,
243 std::vector<rgw_bucket>& buckets,
244 bool enabled) override;
245 virtual uint64_t get_new_req_id() override;
246 virtual int get_sync_policy_handler(const DoutPrefixProvider* dpp,
247 std::optional<rgw_zone_id> zone,
248 std::optional<rgw_bucket> bucket,
249 RGWBucketSyncPolicyHandlerRef* phandler,
250 optional_yield y) override;
251 virtual RGWDataSyncStatusManager* get_data_sync_manager(const rgw_zone_id& source_zone) override;
252 virtual void wakeup_meta_sync_shards(std::set<int>& shard_ids) override;
253 virtual void wakeup_data_sync_shards(const DoutPrefixProvider *dpp,
254 const rgw_zone_id& source_zone,
255 boost::container::flat_map<int, boost::container::flat_set<rgw_data_notify_entry>>& shard_ids) override;
256 virtual int clear_usage(const DoutPrefixProvider *dpp) override;
257 virtual int read_all_usage(const DoutPrefixProvider *dpp,
258 uint64_t start_epoch, uint64_t end_epoch,
259 uint32_t max_entries, bool* is_truncated,
260 RGWUsageIter& usage_iter,
261 std::map<rgw_user_bucket, rgw_usage_log_entry>& usage) override;
262 virtual int trim_all_usage(const DoutPrefixProvider *dpp,
263 uint64_t start_epoch, uint64_t end_epoch) override;
264 virtual int get_config_key_val(std::string name, bufferlist* bl) override;
265 virtual int meta_list_keys_init(const DoutPrefixProvider *dpp,
266 const std::string& section,
267 const std::string& marker,
268 void** phandle) override;
269 virtual int meta_list_keys_next(const DoutPrefixProvider *dpp, void* handle,
270 int max, std::list<std::string>& keys,
271 bool* truncated) override;
272 virtual void meta_list_keys_complete(void* handle) override;
273 virtual std::string meta_get_marker(void* handle) override;
274 virtual int meta_remove(const DoutPrefixProvider* dpp,
275 std::string& metadata_key, optional_yield y) override;
276 virtual const RGWSyncModuleInstanceRef& get_sync_module() override;
277 virtual std::string get_host_id() override { return next->get_host_id(); }
278 virtual std::unique_ptr<LuaManager> get_lua_manager() override;
279 virtual std::unique_ptr<RGWRole> get_role(std::string name,
280 std::string tenant,
281 std::string path="",
282 std::string trust_policy="",
283 std::string
284 max_session_duration_str="",
285 std::multimap<std::string,std::string> tags={}) override;
286 virtual std::unique_ptr<RGWRole> get_role(std::string id) override;
287 virtual std::unique_ptr<RGWRole> get_role(const RGWRoleInfo& info) override;
288 virtual int get_roles(const DoutPrefixProvider *dpp,
289 optional_yield y,
290 const std::string& path_prefix,
291 const std::string& tenant,
292 std::vector<std::unique_ptr<RGWRole>>& roles) override;
293 virtual std::unique_ptr<RGWOIDCProvider> get_oidc_provider() override;
294 virtual int get_oidc_providers(const DoutPrefixProvider *dpp,
295 const std::string& tenant,
296 std::vector<std::unique_ptr<RGWOIDCProvider>>&
297 providers) override;
298 virtual std::unique_ptr<Writer> get_append_writer(const DoutPrefixProvider *dpp,
299 optional_yield y,
300 rgw::sal::Object* obj,
301 const rgw_user& owner,
302 const rgw_placement_rule
303 *ptail_placement_rule,
304 const std::string& unique_tag,
305 uint64_t position,
306 uint64_t *cur_accounted_size) override;
307 virtual std::unique_ptr<Writer> get_atomic_writer(const DoutPrefixProvider *dpp,
308 optional_yield y,
309 rgw::sal::Object* obj,
310 const rgw_user& owner,
311 const rgw_placement_rule *ptail_placement_rule,
312 uint64_t olh_epoch,
313 const std::string& unique_tag) override;
314
315 virtual const std::string& get_compression_type(const rgw_placement_rule& rule) override;
316 virtual bool valid_placement(const rgw_placement_rule& rule) override;
317
318 virtual void finalize(void) override;
319
320 virtual CephContext* ctx(void) override;
321
322 virtual void register_admin_apis(RGWRESTMgr* mgr) override {
323 return next->register_admin_apis(mgr);
324 }
325};
326
327class FilterUser : public User {
328protected:
329 std::unique_ptr<User> next;
330
331public:
332 FilterUser(std::unique_ptr<User> _next) : next(std::move(_next)) {}
333 FilterUser(FilterUser& u) : next(u.next->clone()) {};
334 virtual ~FilterUser() = default;
335
336 virtual std::unique_ptr<User> clone() override {
337 return std::make_unique<FilterUser>(*this);
338 }
339 virtual int list_buckets(const DoutPrefixProvider* dpp,
340 const std::string& marker, const std::string& end_marker,
341 uint64_t max, bool need_stats, BucketList& buckets,
342 optional_yield y) override;
343 virtual int create_bucket(const DoutPrefixProvider* dpp,
344 const rgw_bucket& b,
345 const std::string& zonegroup_id,
346 rgw_placement_rule& placement_rule,
347 std::string& swift_ver_location,
348 const RGWQuotaInfo* pquota_info,
349 const RGWAccessControlPolicy& policy,
350 Attrs& attrs,
351 RGWBucketInfo& info,
352 obj_version& ep_objv,
353 bool exclusive,
354 bool obj_lock_enabled,
355 bool* existed,
356 req_info& req_info,
357 std::unique_ptr<Bucket>* bucket,
358 optional_yield y) override;
359
360 virtual std::string& get_display_name() override { return next->get_display_name(); }
361 virtual const std::string& get_tenant() override { return next->get_tenant(); }
362 virtual void set_tenant(std::string& _t) override { next->set_tenant(_t); }
363 virtual const std::string& get_ns() override { return next->get_ns(); }
364 virtual void set_ns(std::string& _ns) override { next->set_ns(_ns); }
365 virtual void clear_ns() override { next->clear_ns(); }
366 virtual const rgw_user& get_id() const override { return next->get_id(); }
367 virtual uint32_t get_type() const override { return next->get_type(); }
368 virtual int32_t get_max_buckets() const override { return next->get_max_buckets(); }
369 virtual const RGWUserCaps& get_caps() const override { return next->get_caps(); }
370 virtual RGWObjVersionTracker& get_version_tracker() override {
371 return next->get_version_tracker();
372 }
373 virtual Attrs& get_attrs() override { return next->get_attrs(); }
374 virtual void set_attrs(Attrs& _attrs) override { next->set_attrs(_attrs); }
375 virtual bool empty() const override { return next->empty(); }
376 virtual int read_attrs(const DoutPrefixProvider* dpp, optional_yield y) override;
377 virtual int merge_and_store_attrs(const DoutPrefixProvider* dpp, Attrs&
378 new_attrs, optional_yield y) override;
379 virtual int read_stats(const DoutPrefixProvider *dpp,
380 optional_yield y, RGWStorageStats* stats,
381 ceph::real_time* last_stats_sync = nullptr,
382 ceph::real_time* last_stats_update = nullptr) override;
383 virtual int read_stats_async(const DoutPrefixProvider *dpp,
384 RGWGetUserStats_CB* cb) override;
385 virtual int complete_flush_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
386 virtual int read_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch,
387 uint64_t end_epoch, uint32_t max_entries,
388 bool* is_truncated, RGWUsageIter& usage_iter,
389 std::map<rgw_user_bucket, rgw_usage_log_entry>& usage) override;
390 virtual int trim_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch,
391 uint64_t end_epoch) override;
392
393 virtual int load_user(const DoutPrefixProvider* dpp, optional_yield y) override;
394 virtual int store_user(const DoutPrefixProvider* dpp, optional_yield y, bool
395 exclusive, RGWUserInfo* old_info = nullptr) override;
396 virtual int remove_user(const DoutPrefixProvider* dpp, optional_yield y) override;
397 virtual int verify_mfa(const std::string& mfa_str, bool* verified,
398 const DoutPrefixProvider* dpp, optional_yield y) override;
399
400 RGWUserInfo& get_info() override { return next->get_info(); }
401 virtual void print(std::ostream& out) const override { return next->print(out); }
402
403 /* Internal to Filters */
404 User* get_next() { return next.get(); }
405};
406
407class FilterBucket : public Bucket {
408protected:
409 std::unique_ptr<Bucket> next;
410private:
411 User* user;
412
413public:
414
415 FilterBucket(std::unique_ptr<Bucket> _next, User* _user) :
416 next(std::move(_next)), user(_user) {}
417 virtual ~FilterBucket() = default;
418
419 virtual std::unique_ptr<Object> get_object(const rgw_obj_key& key) override;
420 virtual int list(const DoutPrefixProvider* dpp, ListParams&, int,
421 ListResults&, optional_yield y) override;
422 virtual Attrs& get_attrs(void) override { return next->get_attrs(); }
423 virtual int set_attrs(Attrs a) override { return next->set_attrs(a); }
424 virtual int remove_bucket(const DoutPrefixProvider* dpp, bool delete_children,
425 bool forward_to_master, req_info* req_info,
426 optional_yield y) override;
427 virtual int remove_bucket_bypass_gc(int concurrent_max, bool
428 keep_index_consistent,
429 optional_yield y, const
430 DoutPrefixProvider *dpp) override;
431 virtual RGWAccessControlPolicy& get_acl(void) override { return next->get_acl(); }
432 virtual int set_acl(const DoutPrefixProvider* dpp, RGWAccessControlPolicy& acl,
433 optional_yield y) override;
434
435 virtual void set_owner(rgw::sal::User* _owner) override { next->set_owner(_owner); }
436 virtual int load_bucket(const DoutPrefixProvider* dpp, optional_yield y,
437 bool get_stats = false) override;
438 virtual int read_stats(const DoutPrefixProvider *dpp,
439 const bucket_index_layout_generation& idx_layout,
440 int shard_id, std::string* bucket_ver, std::string* master_ver,
441 std::map<RGWObjCategory, RGWStorageStats>& stats,
442 std::string* max_marker = nullptr,
443 bool* syncstopped = nullptr) override;
444 virtual int read_stats_async(const DoutPrefixProvider *dpp,
445 const bucket_index_layout_generation& idx_layout,
446 int shard_id, RGWGetBucketStats_CB* ctx) override;
447 virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
448 virtual int update_container_stats(const DoutPrefixProvider* dpp) override;
449 virtual int check_bucket_shards(const DoutPrefixProvider* dpp) override;
450 virtual int chown(const DoutPrefixProvider* dpp, User& new_user,
451 optional_yield y) override;
452 virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive,
453 ceph::real_time mtime) override;
454 virtual bool is_owner(User* user) override;
455 virtual User* get_owner(void) override { return user; }
456 virtual ACLOwner get_acl_owner(void) override { return next->get_acl_owner(); }
457 virtual int check_empty(const DoutPrefixProvider* dpp, optional_yield y) override;
458 virtual int check_quota(const DoutPrefixProvider *dpp, RGWQuota& quota,
459 uint64_t obj_size, optional_yield y,
460 bool check_size_only = false) override;
461 virtual int merge_and_store_attrs(const DoutPrefixProvider* dpp,
462 Attrs& new_attrs, optional_yield y) override;
463 virtual int try_refresh_info(const DoutPrefixProvider* dpp,
464 ceph::real_time* pmtime) override;
465 virtual int read_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch,
466 uint64_t end_epoch, uint32_t max_entries,
467 bool* is_truncated, RGWUsageIter& usage_iter,
468 std::map<rgw_user_bucket,
469 rgw_usage_log_entry>& usage) override;
470 virtual int trim_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch,
471 uint64_t end_epoch) override;
472 virtual int remove_objs_from_index(const DoutPrefixProvider *dpp,
473 std::list<rgw_obj_index_key>&
474 objs_to_unlink) override;
475 virtual int check_index(const DoutPrefixProvider *dpp,
476 std::map<RGWObjCategory, RGWStorageStats>&
477 existing_stats,
478 std::map<RGWObjCategory, RGWStorageStats>&
479 calculated_stats) override;
480 virtual int rebuild_index(const DoutPrefixProvider *dpp) override;
481 virtual int set_tag_timeout(const DoutPrefixProvider *dpp, uint64_t timeout) override;
482 virtual int purge_instance(const DoutPrefixProvider* dpp) override;
483 virtual bool empty() const override { return next->empty(); }
484 virtual const std::string& get_name() const override { return next->get_name(); }
485 virtual const std::string& get_tenant() const override { return next->get_tenant(); }
486 virtual const std::string& get_marker() const override { return next->get_marker(); }
487 virtual const std::string& get_bucket_id() const override { return next->get_bucket_id(); }
488 virtual size_t get_size() const override { return next->get_size(); }
489 virtual size_t get_size_rounded() const override { return next->get_size_rounded(); }
490 virtual uint64_t get_count() const override { return next->get_count(); }
491 virtual rgw_placement_rule& get_placement_rule() override { return next->get_placement_rule(); }
492 virtual ceph::real_time& get_creation_time() override { return next->get_creation_time(); }
493 virtual ceph::real_time& get_modification_time() override { return next->get_modification_time(); }
494 virtual obj_version& get_version() override { return next->get_version(); }
495 virtual void set_version(obj_version &ver) override { next->set_version(ver); }
496 virtual bool versioned() override { return next->versioned(); }
497 virtual bool versioning_enabled() override { return next->versioning_enabled(); }
498
499 virtual std::unique_ptr<Bucket> clone() override {
500 std::unique_ptr<Bucket> nb = next->clone();
501 return std::make_unique<FilterBucket>(std::move(nb), user);
502 }
503
504 virtual std::unique_ptr<MultipartUpload> get_multipart_upload(
505 const std::string& oid,
506 std::optional<std::string> upload_id=std::nullopt,
507 ACLOwner owner={}, ceph::real_time mtime=real_clock::now()) override;
508 virtual int list_multiparts(const DoutPrefixProvider *dpp,
509 const std::string& prefix,
510 std::string& marker,
511 const std::string& delim,
512 const int& max_uploads,
513 std::vector<std::unique_ptr<MultipartUpload>>& uploads,
514 std::map<std::string, bool> *common_prefixes,
515 bool *is_truncated) override;
516 virtual int abort_multiparts(const DoutPrefixProvider* dpp,
517 CephContext* cct) override;
518
519 int read_topics(rgw_pubsub_bucket_topics& notifications, RGWObjVersionTracker* objv_tracker,
520 optional_yield y, const DoutPrefixProvider *dpp) override {
521 return next->read_topics(notifications, objv_tracker, y, dpp);
522 }
523 int write_topics(const rgw_pubsub_bucket_topics& notifications, RGWObjVersionTracker* obj_tracker,
524 optional_yield y, const DoutPrefixProvider *dpp) override {
525 return next->write_topics(notifications, obj_tracker, y, dpp);
526 }
527 int remove_topics(RGWObjVersionTracker* objv_tracker,
528 optional_yield y, const DoutPrefixProvider *dpp) override {
529 return next->remove_topics(objv_tracker, y, dpp);
530 }
531
532 virtual rgw_bucket& get_key() override { return next->get_key(); }
533 virtual RGWBucketInfo& get_info() override { return next->get_info(); }
534
535 virtual void print(std::ostream& out) const override { return next->print(out); }
536
537 virtual bool operator==(const Bucket& b) const override { return next->operator==(b); }
538 virtual bool operator!=(const Bucket& b) const override { return next->operator!=(b); }
539
540 friend class BucketList;
541
542 /* Internal to Filters */
543 Bucket* get_next() { return next.get(); }
544};
545
546class FilterObject : public Object {
547protected:
548 std::unique_ptr<Object> next;
549private:
550 Bucket* bucket{nullptr};
551
552public:
553
554 struct FilterReadOp : ReadOp {
555 std::unique_ptr<ReadOp> next;
556
557 FilterReadOp(std::unique_ptr<ReadOp> _next) : next(std::move(_next)) {}
558 virtual ~FilterReadOp() = default;
559
560 virtual int prepare(optional_yield y, const DoutPrefixProvider* dpp) override;
561 virtual int read(int64_t ofs, int64_t end, bufferlist& bl, optional_yield y,
562 const DoutPrefixProvider* dpp) override;
563 virtual int iterate(const DoutPrefixProvider* dpp, int64_t ofs, int64_t end,
564 RGWGetDataCB* cb, optional_yield y) override;
565 virtual int get_attr(const DoutPrefixProvider* dpp, const char* name,
566 bufferlist& dest, optional_yield y) override;
567 };
568
569 struct FilterDeleteOp : DeleteOp {
570 std::unique_ptr<DeleteOp> next;
571
572 FilterDeleteOp(std::unique_ptr<DeleteOp> _next) : next(std::move(_next)) {}
573 virtual ~FilterDeleteOp() = default;
574
575 virtual int delete_obj(const DoutPrefixProvider* dpp, optional_yield y) override;
576 };
577
578 FilterObject(std::unique_ptr<Object> _next) : next(std::move(_next)) {}
579 FilterObject(std::unique_ptr<Object> _next, Bucket* _bucket) :
580 next(std::move(_next)), bucket(_bucket) {}
581 FilterObject(FilterObject& _o) {
582 next = _o.next->clone();
583 bucket = _o.bucket;
584 }
585 virtual ~FilterObject() = default;
586
587 virtual int delete_object(const DoutPrefixProvider* dpp,
588 optional_yield y,
589 bool prevent_versioning = false) override;
590 virtual int delete_obj_aio(const DoutPrefixProvider* dpp, RGWObjState* astate,
591 Completions* aio,
592 bool keep_index_consistent, optional_yield y) override;
593 virtual int copy_object(User* user,
594 req_info* info, const rgw_zone_id& source_zone,
595 rgw::sal::Object* dest_object, rgw::sal::Bucket* dest_bucket,
596 rgw::sal::Bucket* src_bucket,
597 const rgw_placement_rule& dest_placement,
598 ceph::real_time* src_mtime, ceph::real_time* mtime,
599 const ceph::real_time* mod_ptr, const ceph::real_time* unmod_ptr,
600 bool high_precision_time,
601 const char* if_match, const char* if_nomatch,
602 AttrsMod attrs_mod, bool copy_if_newer, Attrs& attrs,
603 RGWObjCategory category, uint64_t olh_epoch,
604 boost::optional<ceph::real_time> delete_at,
605 std::string* version_id, std::string* tag, std::string* etag,
606 void (*progress_cb)(off_t, void *), void* progress_data,
607 const DoutPrefixProvider* dpp, optional_yield y) override;
608 virtual RGWAccessControlPolicy& get_acl(void) override;
609 virtual int set_acl(const RGWAccessControlPolicy& acl) override { return next->set_acl(acl); }
610 virtual void set_atomic() override { return next->set_atomic(); }
611 virtual bool is_atomic() override { return next->is_atomic(); }
612 virtual void set_prefetch_data() override { return next->set_prefetch_data(); }
613 virtual bool is_prefetch_data() override { return next->is_prefetch_data(); }
614 virtual void set_compressed() override { return next->set_compressed(); }
615 virtual bool is_compressed() override { return next->is_compressed(); }
616 virtual void invalidate() override { return next->invalidate(); }
617 virtual bool empty() const override { return next->empty(); }
618 virtual const std::string &get_name() const override { return next->get_name(); }
619
620 virtual int get_obj_state(const DoutPrefixProvider* dpp, RGWObjState **state,
621 optional_yield y, bool follow_olh = true) override;
622 virtual int set_obj_attrs(const DoutPrefixProvider* dpp, Attrs* setattrs,
623 Attrs* delattrs, optional_yield y) override;
624 virtual int get_obj_attrs(optional_yield y, const DoutPrefixProvider* dpp,
625 rgw_obj* target_obj = NULL) override;
626 virtual int modify_obj_attrs(const char* attr_name, bufferlist& attr_val,
627 optional_yield y, const DoutPrefixProvider* dpp) override;
628 virtual int delete_obj_attrs(const DoutPrefixProvider* dpp, const char* attr_name,
629 optional_yield y) override;
630 virtual bool is_expired() override;
631 virtual void gen_rand_obj_instance_name() override;
632 virtual std::unique_ptr<MPSerializer> get_serializer(const DoutPrefixProvider *dpp,
633 const std::string& lock_name) override;
634 virtual int transition(Bucket* bucket,
635 const rgw_placement_rule& placement_rule,
636 const real_time& mtime,
637 uint64_t olh_epoch,
638 const DoutPrefixProvider* dpp,
639 optional_yield y) override;
640 virtual int transition_to_cloud(Bucket* bucket,
641 rgw::sal::PlacementTier* tier,
642 rgw_bucket_dir_entry& o,
643 std::set<std::string>& cloud_targets,
644 CephContext* cct,
645 bool update_object,
646 const DoutPrefixProvider* dpp,
647 optional_yield y) override;
648 virtual bool placement_rules_match(rgw_placement_rule& r1, rgw_placement_rule& r2) override;
649 virtual int dump_obj_layout(const DoutPrefixProvider *dpp, optional_yield y,
650 Formatter* f) override;
651
652 virtual Attrs& get_attrs(void) override { return next->get_attrs(); };
653 virtual const Attrs& get_attrs(void) const override { return next->get_attrs(); };
654 virtual int set_attrs(Attrs a) override { return next->set_attrs(a); };
655 virtual bool has_attrs(void) override { return next->has_attrs(); };
656 virtual ceph::real_time get_mtime(void) const override { return next->get_mtime(); };
657 virtual uint64_t get_obj_size(void) const override { return next->get_obj_size(); };
658 virtual Bucket* get_bucket(void) const override { return bucket; };
659 virtual void set_bucket(Bucket* b) override;
660 virtual std::string get_hash_source(void) override { return next->get_hash_source(); };
661 virtual void set_hash_source(std::string s) override { return next->set_hash_source(s); };
662 virtual std::string get_oid(void) const override { return next->get_oid(); };
663 virtual bool get_delete_marker(void) override { return next->get_delete_marker(); };
664 virtual bool get_in_extra_data(void) override { return next->get_in_extra_data(); };
665 virtual void set_in_extra_data(bool i) override { return next->set_in_extra_data(i); };
666 int range_to_ofs(uint64_t obj_size, int64_t &ofs, int64_t &end) {
667 return next->range_to_ofs(obj_size, ofs, end);
668 };
669 virtual void set_obj_size(uint64_t s) override { return next->set_obj_size(s); };
670 virtual void set_name(const std::string& n) override { return next->set_name(n); };
671 virtual void set_key(const rgw_obj_key& k) override { return next->set_key(k); };
672 virtual rgw_obj get_obj(void) const override { return next->get_obj(); };
673 virtual rgw_obj_key& get_key() override { return next->get_key(); }
674 virtual void set_instance(const std::string &i) override { return next->set_instance(i); }
675 virtual const std::string &get_instance() const override { return next->get_instance(); }
676 virtual bool have_instance(void) override { return next->have_instance(); }
677 virtual void clear_instance() override { return next->clear_instance(); }
678
679 virtual int swift_versioning_restore(bool& restored, /* out */
680 const DoutPrefixProvider* dpp) override;
681 virtual int swift_versioning_copy(const DoutPrefixProvider* dpp,
682 optional_yield y) override;
683
684 virtual std::unique_ptr<ReadOp> get_read_op() override;
685 virtual std::unique_ptr<DeleteOp> get_delete_op() override;
686
687 virtual int omap_get_vals(const DoutPrefixProvider *dpp, const std::string& marker,
688 uint64_t count, std::map<std::string, bufferlist>* m,
689 bool* pmore, optional_yield y) override;
690 virtual int omap_get_all(const DoutPrefixProvider *dpp,
691 std::map<std::string, bufferlist>* m,
692 optional_yield y) override;
693 virtual int omap_get_vals_by_keys(const DoutPrefixProvider *dpp,
694 const std::string& oid,
695 const std::set<std::string>& keys,
696 Attrs* vals) override;
697 virtual int omap_set_val_by_key(const DoutPrefixProvider *dpp,
698 const std::string& key, bufferlist& val,
699 bool must_exist, optional_yield y) override;
700 virtual int chown(User& new_user, const DoutPrefixProvider* dpp,
701 optional_yield y) override;
702
703 virtual std::unique_ptr<Object> clone() override {
704 return std::make_unique<FilterObject>(*this);
705 }
706
707 virtual void print(std::ostream& out) const override { return next->print(out); }
708
709 /* Internal to Filters */
710 Object* get_next() { return next.get(); }
711};
712
713class FilterMultipartPart : public MultipartPart {
714protected:
715 std::unique_ptr<MultipartPart> next;
716
717public:
718 FilterMultipartPart(std::unique_ptr<MultipartPart> _next) : next(std::move(_next)) {}
719 virtual ~FilterMultipartPart() = default;
720
721 virtual uint32_t get_num() override { return next->get_num(); }
722 virtual uint64_t get_size() override { return next->get_size(); }
723 virtual const std::string& get_etag() override { return next->get_etag(); }
724 virtual ceph::real_time& get_mtime() override { return next->get_mtime(); }
725};
726
727class FilterMultipartUpload : public MultipartUpload {
728protected:
729 std::unique_ptr<MultipartUpload> next;
730 Bucket* bucket;
731 std::map<uint32_t, std::unique_ptr<MultipartPart>> parts;
732
733public:
734 FilterMultipartUpload(std::unique_ptr<MultipartUpload> _next, Bucket* _b) :
735 next(std::move(_next)), bucket(_b) {}
736 virtual ~FilterMultipartUpload() = default;
737
738 virtual const std::string& get_meta() const override { return next->get_meta(); }
739 virtual const std::string& get_key() const override { return next->get_key(); }
740 virtual const std::string& get_upload_id() const override { return next->get_upload_id(); }
741 virtual const ACLOwner& get_owner() const override { return next->get_owner(); }
742 virtual ceph::real_time& get_mtime() override { return next->get_mtime(); }
743
744 virtual std::map<uint32_t, std::unique_ptr<MultipartPart>>& get_parts() override { return parts; }
745
746 virtual const jspan_context& get_trace() override { return next->get_trace(); }
747
748 virtual std::unique_ptr<rgw::sal::Object> get_meta_obj() override;
749
750 virtual int init(const DoutPrefixProvider* dpp, optional_yield y, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) override;
751 virtual int list_parts(const DoutPrefixProvider* dpp, CephContext* cct,
752 int num_parts, int marker,
753 int* next_marker, bool* truncated,
754 bool assume_unsorted = false) override;
755 virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct) override;
756 virtual int complete(const DoutPrefixProvider* dpp,
757 optional_yield y, CephContext* cct,
758 std::map<int, std::string>& part_etags,
759 std::list<rgw_obj_index_key>& remove_objs,
760 uint64_t& accounted_size, bool& compressed,
761 RGWCompressionInfo& cs_info, off_t& ofs,
762 std::string& tag, ACLOwner& owner,
763 uint64_t olh_epoch,
764 rgw::sal::Object* target_obj) override;
765
766 virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y,
767 rgw_placement_rule** rule,
768 rgw::sal::Attrs* attrs = nullptr) override;
769
770 virtual std::unique_ptr<Writer> get_writer(const DoutPrefixProvider *dpp,
771 optional_yield y,
772 rgw::sal::Object* obj,
773 const rgw_user& owner,
774 const rgw_placement_rule *ptail_placement_rule,
775 uint64_t part_num,
776 const std::string& part_num_str) override;
777 virtual void print(std::ostream& out) const override { return next->print(out); }
778};
779
780class FilterMPSerializer : public MPSerializer {
781protected:
782 std::unique_ptr<MPSerializer> next;
783
784public:
785 FilterMPSerializer(std::unique_ptr<MPSerializer> _next) : next(std::move(_next)) {}
786 virtual ~FilterMPSerializer() = default;
787
788 virtual int try_lock(const DoutPrefixProvider *dpp, utime_t dur, optional_yield y) override;
789 virtual int unlock() override { return next->unlock(); }
790 virtual void clear_locked() override { next->clear_locked(); }
791 virtual bool is_locked() override { return next->is_locked(); }
792 virtual void print(std::ostream& out) const override { return next->print(out); }
793};
794
795class FilterLCSerializer : public LCSerializer {
796protected:
797 std::unique_ptr<LCSerializer> next;
798
799public:
800 FilterLCSerializer(std::unique_ptr<LCSerializer> _next) : next(std::move(_next)) {}
801 virtual ~FilterLCSerializer() = default;
802
803 virtual int try_lock(const DoutPrefixProvider *dpp, utime_t dur, optional_yield y) override;
804 virtual int unlock() override { return next->unlock(); }
805 virtual void print(std::ostream& out) const override { return next->print(out); }
806};
807
808class FilterLifecycle : public Lifecycle {
809protected:
810 std::unique_ptr<Lifecycle> next;
811
812public:
813 struct FilterLCHead : LCHead {
814 std::unique_ptr<LCHead> next;
815
816 FilterLCHead(std::unique_ptr<LCHead> _next) : next(std::move(_next)) {}
817 virtual ~FilterLCHead() = default;
818
819 virtual time_t& get_start_date() override { return next->get_start_date(); }
820 virtual void set_start_date(time_t t) override { next->set_start_date(t); }
821 virtual std::string& get_marker() override { return next->get_marker(); }
822 virtual void set_marker(const std::string& m) override { next->set_marker(m); }
823 virtual time_t& get_shard_rollover_date() override { return next->get_shard_rollover_date(); }
824 virtual void set_shard_rollover_date(time_t t) override { next->set_shard_rollover_date(t); }
825 };
826
827 struct FilterLCEntry : LCEntry {
828 std::unique_ptr<LCEntry> next;
829
830 FilterLCEntry(std::unique_ptr<LCEntry> _next) : next(std::move(_next)) {}
831 virtual ~FilterLCEntry() = default;
832
833 virtual std::string& get_bucket() override { return next->get_bucket(); }
834 virtual void set_bucket(const std::string& b) override { next->set_bucket(b); }
835 virtual std::string& get_oid() override { return next->get_oid(); }
836 virtual void set_oid(const std::string& o) override { next->set_oid(o); }
837 virtual uint64_t get_start_time() override { return next->get_start_time(); }
838 virtual void set_start_time(uint64_t t) override { next->set_start_time(t); }
839 virtual uint32_t get_status() override { return next->get_status(); }
840 virtual void set_status(uint32_t s) override { next->set_status(s); }
841 virtual void print(std::ostream& out) const override { return next->print(out); }
842 };
843
844 FilterLifecycle(std::unique_ptr<Lifecycle> _next) : next(std::move(_next)) {}
845 virtual ~FilterLifecycle() = default;
846
847 virtual std::unique_ptr<LCEntry> get_entry() override;
848 virtual int get_entry(const std::string& oid, const std::string& marker,
849 std::unique_ptr<LCEntry>* entry) override;
850 virtual int get_next_entry(const std::string& oid, const std::string& marker,
851 std::unique_ptr<LCEntry>* entry) override;
852 virtual int set_entry(const std::string& oid, LCEntry& entry) override;
853 virtual int list_entries(const std::string& oid, const std::string& marker,
854 uint32_t max_entries,
855 std::vector<std::unique_ptr<LCEntry>>& entries) override;
856 virtual int rm_entry(const std::string& oid, LCEntry& entry) override;
857 virtual int get_head(const std::string& oid, std::unique_ptr<LCHead>* head) override;
858 virtual int put_head(const std::string& oid, LCHead& head) override;
859 virtual std::unique_ptr<LCSerializer> get_serializer(const std::string& lock_name,
860 const std::string& oid,
861 const std::string& cookie) override;
862};
863
864class FilterNotification : public Notification {
865protected:
866 std::unique_ptr<Notification> next;
867
868public:
869 FilterNotification(std::unique_ptr<Notification> _next) : next(std::move(_next)) {}
870
871 virtual ~FilterNotification() = default;
872
873 virtual int publish_reserve(const DoutPrefixProvider *dpp,
874 RGWObjTags* obj_tags = nullptr) override;
875 virtual int publish_commit(const DoutPrefixProvider* dpp, uint64_t size,
876 const ceph::real_time& mtime,
877 const std::string& etag,
878 const std::string& version) override;
879};
880
881class FilterWriter : public Writer {
882protected:
883 std::unique_ptr<Writer> next;
884 Object* obj;
885public:
886 FilterWriter(std::unique_ptr<Writer> _next, Object* _obj) :
887 next(std::move(_next)), obj(_obj) {}
888 virtual ~FilterWriter() = default;
889
890 virtual int prepare(optional_yield y) { return next->prepare(y); }
891 virtual int process(bufferlist&& data, uint64_t offset) override;
892 virtual int complete(size_t accounted_size, const std::string& etag,
893 ceph::real_time *mtime, ceph::real_time set_mtime,
894 std::map<std::string, bufferlist>& attrs,
895 ceph::real_time delete_at,
896 const char *if_match, const char *if_nomatch,
897 const std::string *user_data,
898 rgw_zone_set *zones_trace, bool *canceled,
899 optional_yield y) override;
900};
901
902class FilterLuaManager : public LuaManager {
903protected:
904 std::unique_ptr<LuaManager> next;
905
906public:
907 FilterLuaManager(std::unique_ptr<LuaManager> _next) : next(std::move(_next)) {}
908 virtual ~FilterLuaManager() = default;
909
910 virtual int get_script(const DoutPrefixProvider* dpp, optional_yield y, const std::string& key, std::string& script) override;
911 virtual int put_script(const DoutPrefixProvider* dpp, optional_yield y, const std::string& key, const std::string& script) override;
912 virtual int del_script(const DoutPrefixProvider* dpp, optional_yield y, const std::string& key) override;
913 virtual int add_package(const DoutPrefixProvider* dpp, optional_yield y, const std::string& package_name) override;
914 virtual int remove_package(const DoutPrefixProvider* dpp, optional_yield y, const std::string& package_name) override;
915 virtual int list_packages(const DoutPrefixProvider* dpp, optional_yield y, rgw::lua::packages_t& packages) override;
916};
917
918} } // namespace rgw::sal