diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/rgw/services/svc_rados.h | |
parent | Initial commit. (diff) | |
download | ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.tar.xz ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.zip |
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/rgw/services/svc_rados.h')
-rw-r--r-- | src/rgw/services/svc_rados.h | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/src/rgw/services/svc_rados.h b/src/rgw/services/svc_rados.h new file mode 100644 index 00000000..0453eb0c --- /dev/null +++ b/src/rgw/services/svc_rados.h @@ -0,0 +1,178 @@ +#ifndef CEPH_RGW_SERVICES_RADOS_H +#define CEPH_RGW_SERVICES_RADOS_H + + +#include "rgw/rgw_service.h" + +#include "include/rados/librados.hpp" +#include "common/async/yield_context.h" + +class RGWAccessListFilter { +public: + virtual ~RGWAccessListFilter() {} + virtual bool filter(const string& name, string& key) = 0; +}; + +struct RGWAccessListFilterPrefix : public RGWAccessListFilter { + string prefix; + + explicit RGWAccessListFilterPrefix(const string& _prefix) : prefix(_prefix) {} + bool filter(const string& name, string& key) override { + return (prefix.compare(key.substr(0, prefix.size())) == 0); + } +}; + +struct rgw_rados_ref { + rgw_raw_obj obj; + librados::IoCtx ioctx; +}; + +class RGWSI_RADOS : public RGWServiceInstance +{ + librados::Rados rados; + + int do_start() override; + + librados::Rados* get_rados_handle(); + int open_pool_ctx(const rgw_pool& pool, librados::IoCtx& io_ctx); + int pool_iterate(librados::IoCtx& ioctx, + librados::NObjectIterator& iter, + uint32_t num, vector<rgw_bucket_dir_entry>& objs, + RGWAccessListFilter *filter, + bool *is_truncated); + +public: + RGWSI_RADOS(CephContext *cct) : RGWServiceInstance(cct) {} + + void init() {} + + uint64_t instance_id(); + + class Handle; + + class Obj { + friend class RGWSI_RADOS; + friend Handle; + + RGWSI_RADOS *rados_svc{nullptr}; + rgw_rados_ref ref; + + void init(const rgw_raw_obj& obj); + + Obj(RGWSI_RADOS *_rados_svc, const rgw_raw_obj& _obj) + : rados_svc(_rados_svc) { + init(_obj); + } + + public: + Obj() {} + + int open(); + + int operate(librados::ObjectWriteOperation *op, optional_yield y); + int operate(librados::ObjectReadOperation *op, bufferlist *pbl, + optional_yield y); + int aio_operate(librados::AioCompletion *c, librados::ObjectWriteOperation *op); + int aio_operate(librados::AioCompletion *c, librados::ObjectReadOperation *op, + bufferlist *pbl); + + int watch(uint64_t *handle, librados::WatchCtx2 *ctx); + int aio_watch(librados::AioCompletion *c, uint64_t *handle, librados::WatchCtx2 *ctx); + int unwatch(uint64_t handle); + int notify(bufferlist& bl, + uint64_t timeout_ms, + bufferlist *pbl); + void notify_ack(uint64_t notify_id, + uint64_t cookie, + bufferlist& bl); + + uint64_t get_last_version(); + + rgw_rados_ref& get_ref() { return ref; } + const rgw_rados_ref& get_ref() const { return ref; } + }; + + class Pool { + friend class RGWSI_RADOS; + friend Handle; + + RGWSI_RADOS *rados_svc{nullptr}; + rgw_pool pool; + + Pool(RGWSI_RADOS *_rados_svc, + const rgw_pool& _pool) : rados_svc(_rados_svc), + pool(_pool) {} + + Pool(RGWSI_RADOS *_rados_svc) : rados_svc(_rados_svc) {} + public: + Pool() {} + + int create(); + int create(const std::vector<rgw_pool>& pools, std::vector<int> *retcodes); + int lookup(); + + struct List { + Pool& pool; + + struct Ctx { + bool initialized{false}; + librados::IoCtx ioctx; + librados::NObjectIterator iter; + RGWAccessListFilter *filter{nullptr}; + } ctx; + + List(Pool& _pool) : pool(_pool) {} + + int init(const string& marker, RGWAccessListFilter *filter = nullptr); + int get_next(int max, + std::list<string> *oids, + bool *is_truncated); + }; + + List op() { + return List(*this); + } + + friend List; + }; + + class Handle { + friend class RGWSI_RADOS; + + RGWSI_RADOS *rados_svc{nullptr}; + + Handle(RGWSI_RADOS *_rados_svc) : rados_svc(_rados_svc) {} + public: + Obj obj(const rgw_raw_obj& o) { + return Obj(rados_svc, o); + } + + Pool pool(const rgw_pool& p) { + return Pool(rados_svc, p); + } + + int watch_flush(); + }; + + Handle handle() { + return Handle(this); + } + + Obj obj(const rgw_raw_obj& o) { + return Obj(this, o); + } + + Pool pool() { + return Pool(this); + } + + Pool pool(const rgw_pool& p) { + return Pool(this, p); + } + + friend Obj; + friend Pool; + friend Pool::List; +}; + +#endif |