]> git.proxmox.com Git - ceph.git/blame - ceph/src/rgw/rgw_sync_module.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / rgw / rgw_sync_module.h
CommitLineData
11fdf7f2
TL
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3
7c673cae
FG
4#ifndef CEPH_RGW_SYNC_MODULE_H
5#define CEPH_RGW_SYNC_MODULE_H
6
7#include "rgw_common.h"
8#include "rgw_coroutine.h"
9
10class RGWBucketInfo;
11class RGWRemoteDataLog;
12struct RGWDataSyncEnv;
13struct rgw_bucket_entry_owner;
14struct rgw_obj_key;
15
16
17class RGWDataSyncModule {
18public:
19 RGWDataSyncModule() {}
20 virtual ~RGWDataSyncModule() {}
21
31f18b77
FG
22 virtual void init(RGWDataSyncEnv *sync_env, uint64_t instance_id) {}
23
24 virtual RGWCoroutine *init_sync(RGWDataSyncEnv *sync_env) {
25 return nullptr;
26 }
27
11fdf7f2
TL
28 virtual RGWCoroutine *start_sync(RGWDataSyncEnv *sync_env) {
29 return nullptr;
30 }
31 virtual RGWCoroutine *sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, std::optional<uint64_t> versioned_epoch, rgw_zone_set *zones_trace) = 0;
7c673cae 32 virtual RGWCoroutine *remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime,
31f18b77 33 bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) = 0;
7c673cae 34 virtual RGWCoroutine *create_delete_marker(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime,
31f18b77 35 rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) = 0;
7c673cae
FG
36};
37
31f18b77 38class RGWRESTMgr;
11fdf7f2 39class RGWMetadataHandler;
31f18b77 40
7c673cae
FG
41class RGWSyncModuleInstance {
42public:
43 RGWSyncModuleInstance() {}
44 virtual ~RGWSyncModuleInstance() {}
45 virtual RGWDataSyncModule *get_data_handler() = 0;
31f18b77
FG
46 virtual RGWRESTMgr *get_rest_filter(int dialect, RGWRESTMgr *orig) {
47 return orig;
48 }
11fdf7f2
TL
49 virtual bool supports_user_writes() {
50 return false;
51 }
52 virtual RGWMetadataHandler *alloc_bucket_meta_handler();
53 virtual RGWMetadataHandler *alloc_bucket_instance_meta_handler();
7c673cae
FG
54};
55
56typedef std::shared_ptr<RGWSyncModuleInstance> RGWSyncModuleInstanceRef;
57
11fdf7f2
TL
58class JSONFormattable;
59
7c673cae
FG
60class RGWSyncModule {
61
62public:
63 RGWSyncModule() {}
64 virtual ~RGWSyncModule() {}
65
11fdf7f2
TL
66 virtual bool supports_writes() {
67 return false;
68 }
7c673cae 69 virtual bool supports_data_export() = 0;
11fdf7f2 70 virtual int create_instance(CephContext *cct, const JSONFormattable& config, RGWSyncModuleInstanceRef *instance) = 0;
7c673cae
FG
71};
72
73typedef std::shared_ptr<RGWSyncModule> RGWSyncModuleRef;
74
75
76class RGWSyncModulesManager {
77 Mutex lock;
78
79 map<string, RGWSyncModuleRef> modules;
80public:
81 RGWSyncModulesManager() : lock("RGWSyncModulesManager") {}
82
83 void register_module(const string& name, RGWSyncModuleRef& module, bool is_default = false) {
84 Mutex::Locker l(lock);
85 modules[name] = module;
86 if (is_default) {
87 modules[string()] = module;
88 }
89 }
90
91 bool get_module(const string& name, RGWSyncModuleRef *module) {
92 Mutex::Locker l(lock);
93 auto iter = modules.find(name);
94 if (iter == modules.end()) {
95 return false;
96 }
11fdf7f2
TL
97 if (module != nullptr) {
98 *module = iter->second;
99 }
7c673cae
FG
100 return true;
101 }
102
103
104 int supports_data_export(const string& name) {
105 RGWSyncModuleRef module;
106 if (!get_module(name, &module)) {
107 return -ENOENT;
108 }
109
110 return module.get()->supports_data_export();
111 }
112
11fdf7f2 113 int create_instance(CephContext *cct, const string& name, const JSONFormattable& config, RGWSyncModuleInstanceRef *instance) {
7c673cae
FG
114 RGWSyncModuleRef module;
115 if (!get_module(name, &module)) {
116 return -ENOENT;
117 }
118
119 return module.get()->create_instance(cct, config, instance);
120 }
11fdf7f2
TL
121
122 vector<string> get_registered_module_names() const {
123 vector<string> names;
124 for (auto& i: modules) {
125 if (!i.first.empty()) {
126 names.push_back(i.first);
127 }
128 }
129 return names;
130 }
7c673cae
FG
131};
132
133class RGWStatRemoteObjCBCR : public RGWCoroutine {
134protected:
135 RGWDataSyncEnv *sync_env;
136
137 RGWBucketInfo bucket_info;
138 rgw_obj_key key;
139
140 ceph::real_time mtime;
11fdf7f2
TL
141 uint64_t size = 0;
142 string etag;
7c673cae 143 map<string, bufferlist> attrs;
11fdf7f2 144 map<string, string> headers;
7c673cae
FG
145public:
146 RGWStatRemoteObjCBCR(RGWDataSyncEnv *_sync_env,
147 RGWBucketInfo& _bucket_info, rgw_obj_key& _key);
148 ~RGWStatRemoteObjCBCR() override {}
149
150 void set_result(ceph::real_time& _mtime,
151 uint64_t _size,
11fdf7f2
TL
152 const string& _etag,
153 map<string, bufferlist>&& _attrs,
154 map<string, string>&& _headers) {
7c673cae
FG
155 mtime = _mtime;
156 size = _size;
11fdf7f2 157 etag = _etag;
7c673cae 158 attrs = std::move(_attrs);
11fdf7f2 159 headers = std::move(_headers);
7c673cae
FG
160 }
161};
162
163class RGWCallStatRemoteObjCR : public RGWCoroutine {
164 ceph::real_time mtime;
165 uint64_t size{0};
11fdf7f2 166 string etag;
7c673cae 167 map<string, bufferlist> attrs;
11fdf7f2 168 map<string, string> headers;
7c673cae
FG
169
170protected:
171 RGWDataSyncEnv *sync_env;
172
173 RGWBucketInfo bucket_info;
174 rgw_obj_key key;
175
176public:
177 RGWCallStatRemoteObjCR(RGWDataSyncEnv *_sync_env,
178 RGWBucketInfo& _bucket_info, rgw_obj_key& _key);
179
180 ~RGWCallStatRemoteObjCR() override {}
181
182 int operate() override;
183
184 virtual RGWStatRemoteObjCBCR *allocate_callback() {
185 return nullptr;
186 }
187};
188
189void rgw_register_sync_modules(RGWSyncModulesManager *modules_manager);
190
191#endif