rgw: Remove RGWSI_RADOS from RGWSI_SysObj*

Simply use the RADOS handle and `rgw_rados_ref` directly.

Also make `rgw::AccessListFilter` a std::function.

Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
This commit is contained in:
Adam C. Emerson 2022-12-05 17:10:51 -05:00 committed by Casey Bodley
parent f2807f02b0
commit 34b8e9fb22
22 changed files with 169 additions and 145 deletions

View File

@ -1771,14 +1771,13 @@ class DB {
rgw_obj_key end_marker;
std::string ns;
bool enforce_ns;
RGWAccessListFilter* access_list_filter;
rgw::AccessListFilter access_list_filter;
RGWBucketListNameFilter force_check_filter;
bool list_versions;
bool allow_unordered;
Params() :
enforce_ns(true),
access_list_filter(nullptr),
list_versions(false),
allow_unordered(false)
{}

View File

@ -1929,7 +1929,7 @@ int RGWRados::Bucket::List::list_objects_ordered(
}
if (params.access_list_filter &&
! params.access_list_filter->filter(obj.name, index_key.name)) {
!params.access_list_filter(obj.name, index_key.name)) {
ldpp_dout(dpp, 20) << __func__ <<
": skipping past namespaced objects, including \"" << entry.key <<
"\"" << dendl;
@ -2223,7 +2223,7 @@ int RGWRados::Bucket::List::list_objects_unordered(const DoutPrefixProvider *dpp
}
if (params.access_list_filter &&
!params.access_list_filter->filter(obj.name, index_key.name)) {
!params.access_list_filter(obj.name, index_key.name)) {
ldpp_dout(dpp, 20) << __func__ <<
": skipping \"" << index_key <<
"\" because doesn't match filter" << dendl;
@ -8824,7 +8824,7 @@ string RGWRados::pool_iterate_get_cursor(RGWPoolIterCtx& ctx)
static int do_pool_iterate(const DoutPrefixProvider *dpp, CephContext* cct, RGWPoolIterCtx& ctx, uint32_t num,
vector<rgw_bucket_dir_entry>& objs,
bool *is_truncated, RGWAccessListFilter *filter)
bool *is_truncated, const rgw::AccessListFilter& filter)
{
librados::IoCtx& io_ctx = ctx.io_ctx;
librados::NObjectIterator& iter = ctx.iter;
@ -8841,7 +8841,7 @@ static int do_pool_iterate(const DoutPrefixProvider *dpp, CephContext* cct, RGWP
ldpp_dout(dpp, 20) << "RGWRados::pool_iterate: got " << oid << dendl;
// fill it in with initial values; we may correct later
if (filter && !filter->filter(oid, oid))
if (filter && !filter(oid, oid))
continue;
e.key = oid;
@ -8855,7 +8855,7 @@ static int do_pool_iterate(const DoutPrefixProvider *dpp, CephContext* cct, RGWP
}
int RGWRados::pool_iterate(const DoutPrefixProvider *dpp, RGWPoolIterCtx& ctx, uint32_t num, vector<rgw_bucket_dir_entry>& objs,
bool *is_truncated, RGWAccessListFilter *filter)
bool *is_truncated, const rgw::AccessListFilter& filter)
{
// catch exceptions from NObjectIterator::operator++()
try {
@ -8892,9 +8892,9 @@ int RGWRados::list_raw_objects_next(const DoutPrefixProvider *dpp, const string&
if (!ctx.initialized) {
return -EINVAL;
}
RGWAccessListFilterPrefix filter(prefix_filter);
auto filter = rgw::AccessListFilterPrefix(prefix_filter);
vector<rgw_bucket_dir_entry> objs;
int r = pool_iterate(dpp, ctx.iter_ctx, max, objs, is_truncated, &filter);
int r = pool_iterate(dpp, ctx.iter_ctx, max, objs, is_truncated, filter);
if (r < 0) {
if(r != -ENOENT)
ldpp_dout(dpp, 10) << "failed to list objects pool_iterate returned r=" << r << dendl;
@ -9660,7 +9660,6 @@ int RGWRados::cls_bucket_list_unordered(const DoutPrefixProvider *dpp,
ldout_bitx(bitx, dpp, 25) << "BACKTRACE: " << __func__ << ": " << ClibBackTrace(0) << dendl_bitx;
ent_list.clear();
static MultipartMetaFilter multipart_meta_filter;
*is_truncated = false;
librados::IoCtx index_pool;
@ -10008,9 +10007,8 @@ int RGWRados::check_disk_state(const DoutPrefixProvider *dpp,
rgw_obj obj(bucket_info.bucket, list_state.key);
MultipartMetaFilter multipart_meta_filter;
string temp_key;
if (multipart_meta_filter.filter(list_state.key.name, temp_key)) {
if (MultipartMetaFilter(list_state.key.name, temp_key)) {
obj.in_extra_data = true;
}

View File

@ -40,6 +40,7 @@
#include "rgw_cache.h"
#include "rgw_sal_fwd.h"
#include "rgw_pubsub.h"
#include "rgw_tools.h"
struct D3nDataCache;
@ -1023,14 +1024,13 @@ public:
rgw_obj_key end_marker;
std::string ns;
bool enforce_ns;
RGWAccessListFilter* access_list_filter;
rgw::AccessListFilter access_list_filter;
RGWBucketListNameFilter force_check_filter;
bool list_versions;
bool allow_unordered;
Params() :
enforce_ns(true),
access_list_filter(nullptr),
list_versions(false),
allow_unordered(false)
{}
@ -1638,7 +1638,7 @@ public:
*/
int pool_iterate(const DoutPrefixProvider *dpp, RGWPoolIterCtx& ctx, uint32_t num,
std::vector<rgw_bucket_dir_entry>& objs,
bool *is_truncated, RGWAccessListFilter *filter);
bool *is_truncated, const rgw::AccessListFilter& filter);
uint64_t next_bucket_id();

View File

@ -751,13 +751,12 @@ int RadosBucket::list_multiparts(const DoutPrefixProvider *dpp,
{
rgw::sal::Bucket::ListParams params;
rgw::sal::Bucket::ListResults results;
MultipartMetaFilter mp_filter;
params.prefix = prefix;
params.delim = delim;
params.marker = marker;
params.ns = RGW_OBJ_NS_MULTIPART;
params.access_list_filter = &mp_filter;
params.access_list_filter = MultipartMetaFilter;
int ret = list(dpp, params, max_uploads, results, y);

View File

@ -113,12 +113,12 @@ int RGWServices_Def::init(CephContext *cct,
zone_utils->init(radoshandle, zone.get());
quota->init(zone.get());
sync_modules->init(zone.get());
sysobj_core->core_init(rados.get(), zone.get());
sysobj_core->core_init(radoshandle, zone.get());
if (have_cache) {
sysobj_cache->init(rados.get(), zone.get(), notify.get());
sysobj->init(rados.get(), sysobj_cache.get());
sysobj_cache->init(radoshandle, zone.get(), notify.get());
sysobj->init(radoshandle, sysobj_cache.get());
} else {
sysobj->init(rados.get(), sysobj_core.get());
sysobj->init(radoshandle, sysobj_core.get());
}
user_rados->init(radoshandle, zone.get(), sysobj.get(), sysobj_cache.get(),
meta.get(), meta_be_sobj.get(), sync_modules.get());

View File

@ -497,3 +497,42 @@ int rgw_clog_warn(librados::Rados* h, const string& msg)
bufferlist inbl;
return h->mon_command(cmd, inbl, nullptr, nullptr);
}
int rgw_list_pool(const DoutPrefixProvider *dpp,
librados::IoCtx& ioctx,
uint32_t max,
const rgw::AccessListFilter& filter,
std::string& marker,
std::vector<string> *oids,
bool *is_truncated)
{
librados::ObjectCursor oc;
if (!oc.from_str(marker)) {
ldpp_dout(dpp, 10) << "failed to parse cursor: " << marker << dendl;
return -EINVAL;
}
auto iter = ioctx.nobjects_begin(oc);
/// Pool_iterate
if (iter == ioctx.nobjects_end())
return -ENOENT;
uint32_t i;
for (i = 0; i < max && iter != ioctx.nobjects_end(); ++i, ++iter) {
string oid = iter->get_oid();
ldpp_dout(dpp, 20) << "RGWRados::pool_iterate: got " << oid << dendl;
// fill it in with initial values; we may correct later
if (filter && !filter(oid, oid))
continue;
oids->push_back(oid);
}
marker = iter.get_cursor().to_str();
if (is_truncated)
*is_truncated = (iter != ioctx.nobjects_end());
return oids->size();
}

View File

@ -3,7 +3,9 @@
#pragma once
#include <functional>
#include <string>
#include <string_view>
#include "include/types.h"
#include "include/ceph_hash.h"
@ -333,3 +335,11 @@ std::map<std::string, ceph::buffer::list>* no_change_attrs();
bool rgw_check_secure_mon_conn(const DoutPrefixProvider *dpp);
int rgw_clog_warn(librados::Rados* h, const std::string& msg);
int rgw_list_pool(const DoutPrefixProvider *dpp,
librados::IoCtx& ioctx,
uint32_t max,
const rgw::AccessListFilter& filter,
std::string& marker,
std::vector<std::string> *oids,
bool *is_truncated);

View File

@ -814,7 +814,6 @@ int RGWLC::handle_multipart_expiration(rgw::sal::Bucket* target,
const multimap<string, lc_op>& prefix_map,
LCWorker* worker, time_t stop_at, bool once)
{
MultipartMetaFilter mp_filter;
int ret;
rgw::sal::Bucket::ListParams params;
rgw::sal::Bucket::ListResults results;
@ -825,7 +824,7 @@ int RGWLC::handle_multipart_expiration(rgw::sal::Bucket* target,
* operating on one shard at a time */
params.allow_unordered = true;
params.ns = RGW_OBJ_NS_MULTIPART;
params.access_list_filter = &mp_filter;
params.access_list_filter = MultipartMetaFilter;
const auto event_type = rgw::notify::ObjectExpirationAbortMPU;
@ -1108,7 +1107,7 @@ public:
return is_expired;
}
int process(lc_op_ctx& oc) {
int process(lc_op_ctx& oc) override {
auto& o = oc.o;
int r;
if (o.is_delete_marker()) {
@ -1172,7 +1171,7 @@ public:
pass_object_lock_check(oc.driver, oc.obj.get(), dpp);
}
int process(lc_op_ctx& oc) {
int process(lc_op_ctx& oc) override {
auto& o = oc.o;
int r = remove_expired_obj(oc.dpp, oc, true,
rgw::notify::ObjectExpirationNoncurrent);
@ -1217,7 +1216,7 @@ public:
return true;
}
int process(lc_op_ctx& oc) {
int process(lc_op_ctx& oc) override {
auto& o = oc.o;
int r = remove_expired_obj(oc.dpp, oc, true,
rgw::notify::ObjectExpirationDeleteMarker);
@ -1385,7 +1384,7 @@ public:
return 0;
}
int process(lc_op_ctx& oc) {
int process(lc_op_ctx& oc) override {
auto& o = oc.o;
int r;
@ -1460,7 +1459,7 @@ protected:
public:
LCOpAction_CurrentTransition(const transition_action& _transition)
: LCOpAction_Transition(_transition) {}
int process(lc_op_ctx& oc) {
int process(lc_op_ctx& oc) override {
int r = LCOpAction_Transition::process(oc);
if (r == 0) {
if (perfcounter) {
@ -1485,7 +1484,7 @@ public:
const transition_action& _transition)
: LCOpAction_Transition(_transition)
{}
int process(lc_op_ctx& oc) {
int process(lc_op_ctx& oc) override {
int r = LCOpAction_Transition::process(oc);
if (r == 0) {
if (perfcounter) {

View File

@ -3,11 +3,9 @@
#include "svc_tier_rados.h"
using namespace std;
const std::string MP_META_SUFFIX = ".meta";
bool MultipartMetaFilter::filter(const string& name, string& key) {
bool MultipartMetaFilter(const std::string& name, std::string& key) {
// the length of the suffix so we can skip past it
static const size_t MP_META_SUFFIX_LEN = MP_META_SUFFIX.length();
@ -19,11 +17,11 @@ bool MultipartMetaFilter::filter(const string& name, string& key) {
return false;
size_t pos = name.find(MP_META_SUFFIX, len - MP_META_SUFFIX_LEN);
if (pos == string::npos)
if (pos == std::string::npos)
return false;
pos = name.rfind('.', pos - 1);
if (pos == string::npos)
if (pos == std::string::npos)
return false;
key = name.substr(0, pos);

View File

@ -102,8 +102,6 @@ static string shadow_ns = RGW_OBJ_NS_SHADOW;
static void forward_req_info(const DoutPrefixProvider *dpp, CephContext *cct, req_info& info, const std::string& bucket_name);
static MultipartMetaFilter mp_filter;
// this probably should belong in the rgw_iam_policy_keywords, I'll get it to it
// at some point
static constexpr auto S3_EXISTING_OBJTAG = "s3:ExistingObjectTag";

View File

@ -31,7 +31,6 @@
struct RGWBucketEnt;
class RGWRESTMgr;
class RGWAccessListFilter;
class RGWLC;
struct rgw_user_bucket;
class RGWUsageBatch;
@ -582,7 +581,7 @@ class Bucket {
rgw_obj_key end_marker;
std::string ns;
bool enforce_ns{true};
RGWAccessListFilter* access_list_filter{nullptr};
rgw::AccessListFilter access_list_filter{};
RGWBucketListNameFilter force_check_filter;
bool list_versions{false};
bool allow_unordered{false};

View File

@ -15,8 +15,21 @@
#pragma once
#include <functional>
#include <string>
namespace rgw { namespace sal {
namespace rgw {
using AccessListFilter =
std::function<bool(const std::string&, std::string&)>;
inline auto AccessListFilterPrefix(std::string prefix) {
return [prefix = std::move(prefix)](const std::string& name,
std::string& key) {
return (prefix.compare(key.substr(0, prefix.size())) == 0);
};
}
namespace sal {
class Driver;
class User;

View File

@ -71,7 +71,7 @@ int RGWSI_RADOS::pool_iterate(const DoutPrefixProvider *dpp,
librados::IoCtx& io_ctx,
librados::NObjectIterator& iter,
uint32_t num, vector<rgw_bucket_dir_entry>& objs,
RGWAccessListFilter *filter,
const rgw::AccessListFilter& filter,
bool *is_truncated)
{
if (iter == io_ctx.nobjects_end())
@ -86,7 +86,7 @@ int RGWSI_RADOS::pool_iterate(const DoutPrefixProvider *dpp,
ldpp_dout(dpp, 20) << "RGWRados::pool_iterate: got " << oid << dendl;
// fill it in with initial values; we may correct later
if (filter && !filter->filter(oid, oid))
if (filter && filter(oid, oid))
continue;
e.key = oid;
@ -296,7 +296,7 @@ int RGWSI_RADOS::Pool::open(const DoutPrefixProvider *dpp, const OpenParams& par
return rados_svc->open_pool_ctx(dpp, pool, state.ioctx, params);
}
int RGWSI_RADOS::Pool::List::init(const DoutPrefixProvider *dpp, const string& marker, RGWAccessListFilter *filter)
int RGWSI_RADOS::Pool::List::init(const DoutPrefixProvider *dpp, const string& marker, rgw::AccessListFilter filter)
{
if (ctx.initialized) {
return -EINVAL;
@ -319,9 +319,6 @@ int RGWSI_RADOS::Pool::List::init(const DoutPrefixProvider *dpp, const string& m
try {
ctx.iter = ctx.ioctx.nobjects_begin(oc);
ctx.filter = filter;
ctx.initialized = true;
return 0;
} catch (const std::system_error& e) {
r = -e.code().value();
ldpp_dout(dpp, 10) << "nobjects_begin threw " << e.what()
@ -332,6 +329,10 @@ int RGWSI_RADOS::Pool::List::init(const DoutPrefixProvider *dpp, const string& m
<< ", returning -5" << dendl;
return -EIO;
}
ctx.filter = std::move(filter);
ctx.initialized = true;
return 0;
}
int RGWSI_RADOS::Pool::List::get_next(const DoutPrefixProvider *dpp,

View File

@ -8,23 +8,10 @@
#include "include/rados/librados.hpp"
#include "common/async/yield_context.h"
#include "rgw_tools.h"
class RGWAsyncRadosProcessor;
class RGWAccessListFilter {
public:
virtual ~RGWAccessListFilter() {}
virtual bool filter(const std::string& name, std::string& key) = 0;
};
struct RGWAccessListFilterPrefix : public RGWAccessListFilter {
std::string prefix;
explicit RGWAccessListFilterPrefix(const std::string& _prefix) : prefix(_prefix) {}
bool filter(const std::string& name, std::string& key) override {
return (prefix.compare(key.substr(0, prefix.size())) == 0);
}
};
class RGWSI_RADOS : public RGWServiceInstance
{
librados::Rados rados;
@ -55,7 +42,7 @@ private:
librados::IoCtx& ioctx,
librados::NObjectIterator& iter,
uint32_t num, std::vector<rgw_bucket_dir_entry>& objs,
RGWAccessListFilter *filter,
const rgw::AccessListFilter& filter,
bool *is_truncated);
public:
@ -118,13 +105,14 @@ public:
bool initialized{false};
librados::IoCtx ioctx;
librados::NObjectIterator iter;
RGWAccessListFilter *filter{nullptr};
rgw::AccessListFilter filter;
} ctx;
List() {}
List(Pool *_pool) : pool(_pool) {}
int init(const DoutPrefixProvider *dpp, const std::string& marker, RGWAccessListFilter *filter = nullptr);
int init(const DoutPrefixProvider *dpp, const std::string& marker,
rgw::AccessListFilter filter);
int get_next(const DoutPrefixProvider *dpp, int max,
std::vector<std::string> *oids,
bool *is_truncated);

View File

@ -246,12 +246,12 @@ public:
friend class Pool::Op;
protected:
RGWSI_RADOS *rados_svc{nullptr};
librados::Rados* rados{nullptr};
RGWSI_SysObj_Core *core_svc{nullptr};
void init(RGWSI_RADOS *_rados_svc,
void init(librados::Rados* rados_,
RGWSI_SysObj_Core *_core_svc) {
rados_svc = _rados_svc;
rados = rados_;
core_svc = _core_svc;
}

View File

@ -1,4 +1,3 @@
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab ft=cpp

View File

@ -17,7 +17,7 @@ class RGWSI_SysObj_Cache_ASocketHook;
class RGWSI_SysObj_Cache : public RGWSI_SysObj_Core
{
friend class RGWSI_SysObj_Cache_CB;
friend class RGWServices_Def;
friend RGWServices_Def;
friend class ASocketHandler;
RGWSI_Notify *notify_svc{nullptr};
@ -27,10 +27,10 @@ class RGWSI_SysObj_Cache : public RGWSI_SysObj_Core
void normalize_pool_and_obj(const rgw_pool& src_pool, const std::string& src_obj, rgw_pool& dst_pool, std::string& dst_obj);
protected:
void init(RGWSI_RADOS *_rados_svc,
void init(librados::Rados* rados_,
RGWSI_Zone *_zone_svc,
RGWSI_Notify *_notify_svc) {
core_init(_rados_svc, _zone_svc);
core_init(rados_, _zone_svc);
notify_svc = _notify_svc;
}
@ -80,12 +80,12 @@ protected:
real_time set_mtime,
optional_yield y) override;
int write_data(const DoutPrefixProvider *dpp,
int write_data(const DoutPrefixProvider *dpp,
const rgw_raw_obj& obj,
const bufferlist& bl,
bool exclusive,
RGWObjVersionTracker *objv_tracker,
optional_yield y);
optional_yield y) override;
int distribute_cache(const DoutPrefixProvider *dpp, const std::string& normal_name, const rgw_raw_obj& obj,
ObjectCacheInfo& obj_info, int op,

View File

@ -12,10 +12,10 @@
using namespace std;
int RGWSI_SysObj_Core_GetObjState::get_rados_obj(const DoutPrefixProvider *dpp,
RGWSI_RADOS *rados_svc,
librados::Rados* rados,
RGWSI_Zone *zone_svc,
const rgw_raw_obj& obj,
RGWSI_RADOS::Obj **pobj)
rgw_rados_ref** pobj)
{
if (!has_rados_obj) {
if (obj.oid.empty()) {
@ -23,8 +23,7 @@ int RGWSI_SysObj_Core_GetObjState::get_rados_obj(const DoutPrefixProvider *dpp,
return -EINVAL;
}
rados_obj = rados_svc->obj(obj);
int r = rados_obj.open(dpp);
int r = rgw_get_rados_ref(dpp, rados, obj, &rados_obj);
if (r < 0) {
return r;
}
@ -37,15 +36,14 @@ int RGWSI_SysObj_Core_GetObjState::get_rados_obj(const DoutPrefixProvider *dpp,
int RGWSI_SysObj_Core::get_rados_obj(const DoutPrefixProvider *dpp,
RGWSI_Zone *zone_svc,
const rgw_raw_obj& obj,
RGWSI_RADOS::Obj *pobj)
rgw_rados_ref* pobj)
{
if (obj.oid.empty()) {
ldpp_dout(dpp, 0) << "ERROR: obj.oid is empty" << dendl;
return -EINVAL;
}
*pobj = rados_svc->obj(obj);
int r = pobj->open(dpp);
int r = rgw_get_rados_ref(dpp, rados, obj, pobj);
if (r < 0) {
return r;
}
@ -59,7 +57,7 @@ int RGWSI_SysObj_Core::raw_stat(const DoutPrefixProvider *dpp, const rgw_raw_obj
RGWObjVersionTracker *objv_tracker,
optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
return r;
@ -172,7 +170,7 @@ int RGWSI_SysObj_Core::read(const DoutPrefixProvider *dpp,
}
}
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -185,7 +183,7 @@ int RGWSI_SysObj_Core::read(const DoutPrefixProvider *dpp,
}
ldpp_dout(dpp, 20) << "rados_obj.operate() r=" << r << " bl.length=" << bl->length() << dendl;
uint64_t op_ver = rados_obj.get_last_version();
uint64_t op_ver = rados_obj.ioctx.get_last_version();
if (read_state.last_ver > 0 &&
read_state.last_ver != op_ver) {
@ -218,7 +216,7 @@ int RGWSI_SysObj_Core::get_attr(const DoutPrefixProvider *dpp,
bufferlist *dest,
optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -229,7 +227,7 @@ int RGWSI_SysObj_Core::get_attr(const DoutPrefixProvider *dpp,
int rval;
op.getxattr(name, dest, &rval);
r = rados_obj.operate(dpp, &op, nullptr, y);
if (r < 0)
return r;
@ -244,7 +242,7 @@ int RGWSI_SysObj_Core::set_attrs(const DoutPrefixProvider *dpp,
RGWObjVersionTracker *objv_tracker,
bool exclusive, optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -301,7 +299,7 @@ int RGWSI_SysObj_Core::omap_get_vals(const DoutPrefixProvider *dpp,
bool *pmore,
optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -341,7 +339,7 @@ int RGWSI_SysObj_Core::omap_get_all(const DoutPrefixProvider *dpp,
std::map<string, bufferlist> *m,
optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -359,7 +357,7 @@ int RGWSI_SysObj_Core::omap_get_all(const DoutPrefixProvider *dpp,
std::map<string, bufferlist> t;
int rval;
op.omap_get_vals2(start_after, count, &t, &more, &rval);
r = rados_obj.operate(dpp, &op, nullptr, y);
if (r < 0) {
return r;
@ -377,7 +375,7 @@ int RGWSI_SysObj_Core::omap_set(const DoutPrefixProvider *dpp, const rgw_raw_obj
bufferlist& bl, bool must_exist,
optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -400,7 +398,7 @@ int RGWSI_SysObj_Core::omap_set(const DoutPrefixProvider *dpp, const rgw_raw_obj
const std::map<std::string, bufferlist>& m,
bool must_exist, optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -418,7 +416,7 @@ int RGWSI_SysObj_Core::omap_set(const DoutPrefixProvider *dpp, const rgw_raw_obj
int RGWSI_SysObj_Core::omap_del(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj, const std::string& key,
optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -440,7 +438,7 @@ int RGWSI_SysObj_Core::notify(const DoutPrefixProvider *dpp, const rgw_raw_obj&
uint64_t timeout_ms, bufferlist *pbl,
optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -456,7 +454,7 @@ int RGWSI_SysObj_Core::remove(const DoutPrefixProvider *dpp,
const rgw_raw_obj& obj,
optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -487,7 +485,7 @@ int RGWSI_SysObj_Core::write(const DoutPrefixProvider *dpp,
real_time set_mtime,
optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -552,7 +550,7 @@ int RGWSI_SysObj_Core::write_data(const DoutPrefixProvider *dpp,
RGWObjVersionTracker *objv_tracker,
optional_yield y)
{
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
if (r < 0) {
ldpp_dout(dpp, 20) << "get_rados_obj() on obj=" << obj << " returned " << r << dendl;
@ -585,21 +583,17 @@ int RGWSI_SysObj_Core::pool_list_prefixed_objs(const DoutPrefixProvider *dpp,
{
bool is_truncated;
auto rados_pool = rados_svc->pool(pool);
librados::IoCtx rados_pool;
rgw_init_ioctx(dpp, rados, pool, rados_pool, true, false);
auto op = rados_pool.op();
RGWAccessListFilterPrefix filter(prefix);
int r = op.init(dpp, string(), &filter);
if (r < 0) {
return r;
}
auto filter{rgw::AccessListFilterPrefix(prefix)};
std::string marker;
do {
vector<string> oids;
#define MAX_OBJS_DEFAULT 1000
int r = op.get_next(dpp, MAX_OBJS_DEFAULT, &oids, &is_truncated);
static constexpr auto MAX_OBJS_DEFAULT = 1000u;
int r = rgw_list_pool(dpp, rados_pool, MAX_OBJS_DEFAULT, filter, marker,
&oids, &is_truncated);
if (r < 0) {
return r;
}
@ -623,12 +617,9 @@ int RGWSI_SysObj_Core::pool_list_objects_init(const DoutPrefixProvider *dpp,
auto& ctx = static_cast<PoolListImplInfo&>(*_ctx->impl);
ctx.pool = rados_svc->pool(pool);
ctx.op = ctx.pool.op();
int r = ctx.op.init(dpp, marker, &ctx.filter);
int r = rgw_init_ioctx(dpp, rados, pool, ctx.pool, true, false);
if (r < 0) {
ldpp_dout(dpp, 10) << "failed to list objects pool_iterate_begin() returned r=" << r << dendl;
ldpp_dout(dpp, 10) << "failed to create IoCtx returned r=" << r << dendl;
return r;
}
return 0;
@ -644,7 +635,8 @@ int RGWSI_SysObj_Core::pool_list_objects_next(const DoutPrefixProvider *dpp,
return -EINVAL;
}
auto& ctx = static_cast<PoolListImplInfo&>(*_ctx.impl);
int r = ctx.op.get_next(dpp, max, oids, is_truncated);
int r = rgw_list_pool(dpp, ctx.pool, max, ctx.filter, ctx.marker, oids,
is_truncated);
if (r < 0) {
if(r != -ENOENT)
ldpp_dout(dpp, 10) << "failed to list objects pool_iterate returned r=" << r << dendl;
@ -662,5 +654,6 @@ int RGWSI_SysObj_Core::pool_list_objects_get_marker(RGWSI_SysObj::Pool::ListCtx&
}
auto& ctx = static_cast<PoolListImplInfo&>(*_ctx.impl);
return ctx.op.get_marker(marker);
*marker = ctx.marker;
return 0;
}

View File

@ -16,22 +16,22 @@ struct rgw_cache_entry_info;
class RGWSI_SysObj_Core : public RGWServiceInstance
{
friend class RGWServices_Def;
friend struct RGWServices_Def;
friend class RGWSI_SysObj;
protected:
RGWSI_RADOS *rados_svc{nullptr};
librados::Rados* rados{nullptr};
RGWSI_Zone *zone_svc{nullptr};
using GetObjState = RGWSI_SysObj_Core_GetObjState;
using PoolListImplInfo = RGWSI_SysObj_Core_PoolListImplInfo;
void core_init(RGWSI_RADOS *_rados_svc,
void core_init(librados::Rados* rados_,
RGWSI_Zone *_zone_svc) {
rados_svc = _rados_svc;
rados = rados_;
zone_svc = _zone_svc;
}
int get_rados_obj(const DoutPrefixProvider *dpp, RGWSI_Zone *zone_svc, const rgw_raw_obj& obj, RGWSI_RADOS::Obj *pobj);
int get_rados_obj(const DoutPrefixProvider *dpp, RGWSI_Zone *zone_svc, const rgw_raw_obj& obj, rgw_rados_ref* pobj);
virtual int raw_stat(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj,
uint64_t *psize, real_time *pmtime,

View File

@ -4,6 +4,7 @@
#pragma once
#include "rgw_tools.h"
#include "rgw_service.h"
#include "svc_rados.h"
@ -12,23 +13,24 @@
struct RGWSI_SysObj_Core_GetObjState : public RGWSI_SysObj_Obj_GetObjState {
RGWSI_RADOS::Obj rados_obj;
rgw_rados_ref rados_obj;
bool has_rados_obj{false};
uint64_t last_ver{0};
RGWSI_SysObj_Core_GetObjState() {}
int get_rados_obj(const DoutPrefixProvider *dpp,
RGWSI_RADOS *rados_svc,
librados::Rados* rados_svc,
RGWSI_Zone *zone_svc,
const rgw_raw_obj& obj,
RGWSI_RADOS::Obj **pobj);
rgw_rados_ref** pobj);
};
struct RGWSI_SysObj_Core_PoolListImplInfo : public RGWSI_SysObj_Pool_ListInfo {
RGWSI_RADOS::Pool pool;
RGWSI_RADOS::Pool::List op;
RGWAccessListFilterPrefix filter;
librados::IoCtx pool;
rgw::AccessListFilter filter;
std::string marker;
RGWSI_SysObj_Core_PoolListImplInfo(const std::string& prefix) : op(pool.op()), filter(prefix) {}
RGWSI_SysObj_Core_PoolListImplInfo(const std::string& prefix)
: filter(rgw::AccessListFilterPrefix(prefix)) {}
};

View File

@ -7,9 +7,7 @@ using namespace std;
const std::string MP_META_SUFFIX = ".meta";
MultipartMetaFilter::~MultipartMetaFilter() {}
bool MultipartMetaFilter::filter(const string& name, string& key) {
bool MultipartMetaFilter(const string& name, string& key) {
// the length of the suffix so we can skip past it
static const size_t MP_META_SUFFIX_LEN = MP_META_SUFFIX.length();
@ -32,5 +30,3 @@ bool MultipartMetaFilter::filter(const string& name, string& key) {
return true;
}

View File

@ -110,21 +110,14 @@ public:
* the name provided is such. It will also extract the key used for
* bucket index shard calculation from the adorned name.
*/
class MultipartMetaFilter : public RGWAccessListFilter {
public:
MultipartMetaFilter() {}
virtual ~MultipartMetaFilter() override;
/**
* @param name [in] The object name as it appears in the bucket index.
* @param key [out] An output parameter that will contain the bucket
* index key if this entry is in the form of a multipart meta object.
* @return true if the name provided is in the form of a multipart meta
* object, false otherwise
*/
bool filter(const std::string& name, std::string& key) override;
};
/**
* @param name [in] The object name as it appears in the bucket index.
* @param key [out] An output parameter that will contain the bucket
* index key if this entry is in the form of a multipart meta object.
* @return true if the name provided is in the form of a multipart meta
* object, false otherwise
*/
bool MultipartMetaFilter(const std::string& name, std::string& key);
class RGWSI_Tier_RADOS : public RGWServiceInstance
{