return 0;
}
-int RGWOrphanSearch::handle_stat_result(const DoutPrefixProvider *dpp, map<int, list<string> >& oids, rgw::sal::Object::StatOp::Result& result)
+int RGWOrphanSearch::handle_stat_result(const DoutPrefixProvider *dpp, map<int, list<string> >& oids, RGWRados::Object::Stat::Result& result)
{
set<string> obj_oids;
- rgw::sal::Bucket* bucket = result.obj->get_bucket();
+ rgw_bucket& bucket = result.obj.bucket;
if (!result.manifest) { /* a very very old object, or part of a multipart upload during upload */
- const string loc = bucket->get_bucket_id() + "_" + result.obj->get_oid();
+ const string loc = bucket.bucket_id + "_" + result.obj.get_oid();
obj_oids.insert(obj_fingerprint(loc));
/*
return 0;
}
-int RGWOrphanSearch::pop_and_handle_stat_op(const DoutPrefixProvider *dpp, map<int, list<string> >& oids, std::deque<std::unique_ptr<rgw::sal::Object::StatOp>>& ops)
+int RGWOrphanSearch::pop_and_handle_stat_op(const DoutPrefixProvider *dpp, map<int, list<string> >& oids, std::deque<RGWRados::Object::Stat>& ops)
{
- rgw::sal::Object::StatOp* front_op = ops.front().get();
+ RGWRados::Object::Stat& front_op = ops.front();
- int ret = front_op->wait(dpp);
+ int ret = front_op.wait(dpp);
if (ret < 0) {
if (ret != -ENOENT) {
ldpp_dout(dpp, -1) << "ERROR: stat_async() returned error: " << cpp_strerror(-ret) << dendl;
}
goto done;
}
- ret = handle_stat_result(dpp, oids, front_op->result);
+ ret = handle_stat_result(dpp, oids, front_op.result);
if (ret < 0) {
ldpp_dout(dpp, -1) << "ERROR: handle_stat_response() returned error: " << cpp_strerror(-ret) << dendl;
}
}
ldpp_dout(dpp, 10) << "building linked oids for bucket instance: " << bucket_instance_id << dendl;
- rgw::sal::Bucket::ListParams params;
- rgw::sal::Bucket::ListResults results;
+ RGWRados::Bucket target(store->getRados(), cur_bucket->get_info());
+ RGWRados::Bucket::List list_op(&target);
string marker;
- params.marker = rgw_obj_key(marker);
- params.list_versions = true;
- params.enforce_ns = false;
+ list_op.params.marker = rgw_obj_key(marker);
+ list_op.params.list_versions = true;
+ list_op.params.enforce_ns = false;
- std::deque<std::unique_ptr<rgw::sal::Object>> objs;
- std::deque<std::unique_ptr<rgw::sal::Object::StatOp>> stat_ops;
+ bool truncated;
+
+ deque<RGWRados::Object::Stat> stat_ops;
do {
- ret = bucket->list(dpp, params, max_list_bucket_entries, results, null_yield);
+ vector<rgw_bucket_dir_entry> result;
+
+ ret = list_op.list_objects(dpp, max_list_bucket_entries,
+ &result, nullptr, &truncated, null_yield);
if (ret < 0) {
cerr << "ERROR: store->list_objects(): " << cpp_strerror(-ret) << std::endl;
return ret;
}
- for (vector<rgw_bucket_dir_entry>::iterator iter = results.objs.begin(); iter != results.objs.end(); ++iter) {
+ for (vector<rgw_bucket_dir_entry>::iterator iter = result.begin(); iter != result.end(); ++iter) {
rgw_bucket_dir_entry& entry = *iter;
if (entry.key.instance.empty()) {
ldpp_dout(dpp, 20) << "obj entry: " << entry.key.name << dendl;
continue;
}
- std::unique_ptr<rgw::sal::Object> obj = bucket->get_object(entry.key);
- std::unique_ptr<rgw::sal::Object::StatOp> stat_op = obj->get_stat_op(&obj_ctx);
- rgw::sal::Object::StatOp* op = stat_op.get();
+ rgw_obj obj(cur_bucket->get_key(), entry.key);
- objs.push_back(std::move(obj));
- stat_ops.push_back(std::move(stat_op));
+ RGWRados::Object op_target(store->getRados(), cur_bucket->get_info(), obj_ctx, obj);
+ stat_ops.push_back(RGWRados::Object::Stat(&op_target));
+ RGWRados::Object::Stat& op = stat_ops.back();
- ret = op->stat_async(dpp);
+ ret = op.stat_async(dpp);
if (ret < 0) {
ldpp_dout(dpp, -1) << "ERROR: stat_async() returned error: " << cpp_strerror(-ret) << dendl;
return ret;
oids.clear();
}
}
- } while (results.is_truncated);
+ } while (truncated);
while (!stat_ops.empty()) {
ret = pop_and_handle_stat_op(dpp, oids, stat_ops);
int RGWRadosList::handle_stat_result(const DoutPrefixProvider *dpp,
- rgw::sal::Object::StatOp::Result& result,
+ RGWRados::Object::Stat::Result& result,
std::string& bucket_name,
rgw_obj_key& obj_key,
std::set<string>& obj_oids)
{
obj_oids.clear();
- rgw::sal::Bucket* bucket = result.obj->get_bucket();
+ rgw_bucket& bucket = result.obj.bucket;
ldpp_dout(dpp, 20) << "RGWRadosList::" << __func__ <<
" bucket=" << bucket <<
- ", has_manifest=" << !!result.manifest <<
+ ", has_manifest=" << result.manifest.has_value() <<
dendl;
// iterator to store result of dlo/slo attribute find
- auto attr_it = result.obj->get_attrs().end();
- const std::string oid = bucket->get_marker() + "_" + result.obj->get_oid();
+ decltype(result.attrs)::iterator attr_it = result.attrs.end();
+ const std::string oid = bucket.marker + "_" + result.obj.get_oid();
ldpp_dout(dpp, 20) << "radoslist processing object=\"" <<
oid << "\"" << dendl;
if (visited_oids.find(oid) != visited_oids.end()) {
return 0;
}
- bucket_name = bucket->get_name();
- obj_key = result.obj->get_key();
+ bucket_name = bucket.name;
+ obj_key = result.obj.key;
if (!result.manifest) {
/* a very very old object, or part of a multipart upload during upload */
* object; we'll process them in
* RGWRadosList::do_incomplete_multipart
*/
- } else if ((attr_it = result.obj->get_attrs().find(RGW_ATTR_USER_MANIFEST)) !=
- result.obj->get_attrs().end()) {
+ } else if ((attr_it = result.attrs.find(RGW_ATTR_USER_MANIFEST)) !=
+ result.attrs.end()) {
// *** handle DLO object ***
obj_oids.insert(oid);
ldpp_dout(dpp, 25) << "radoslist DLO oid=\"" << oid <<
"\" added bucket=\"" << bucket_name << "\" prefix=\"" <<
prefix << "\" to process list" << dendl;
- } else if ((attr_it = result.obj->get_attrs().find(RGW_ATTR_SLO_MANIFEST)) !=
- result.obj->get_attrs().end()) {
+ } else if ((attr_it = result.attrs.find(RGW_ATTR_USER_MANIFEST)) !=
+ result.attrs.end()) {
// *** handle SLO object ***
obj_oids.insert(oid);
int RGWRadosList::pop_and_handle_stat_op(
const DoutPrefixProvider *dpp,
RGWObjectCtx& obj_ctx,
- std::deque<std::unique_ptr<rgw::sal::Object::StatOp>>& ops)
+ std::deque<RGWRados::Object::Stat>& ops)
{
std::string bucket_name;
rgw_obj_key obj_key;
std::set<std::string> obj_oids;
- std::unique_ptr<rgw::sal::Object::StatOp> front_op = std::move(ops.front());
+ RGWRados::Object::Stat& front_op = ops.front();
- int ret = front_op->wait(dpp);
+ int ret = front_op.wait(dpp);
if (ret < 0) {
if (ret != -ENOENT) {
ldpp_dout(dpp, -1) << "ERROR: stat_async() returned error: " <<
goto done;
}
- ret = handle_stat_result(dpp, front_op->result, bucket_name, obj_key, obj_oids);
+ ret = handle_stat_result(dpp, front_op.result, bucket_name, obj_key, obj_oids);
if (ret < 0) {
ldpp_dout(dpp, -1) << "ERROR: handle_stat_result() returned error: " <<
cpp_strerror(-ret) << dendl;
// invalidate object context for this object to avoid memory leak
// (see pr https://github.com/ceph/ceph/pull/30174)
- obj_ctx.invalidate(front_op->result.obj->get_obj());
+ obj_ctx.invalidate(front_op.result.obj);
ops.pop_front();
return ret;
", prefix=" << prefix <<
", entries_filter.size=" << entries_filter.size() << dendl;
- rgw_bucket b;
- rgw_bucket_parse_bucket_key(store->ctx(), bucket_instance_id, &b, nullptr);
- std::unique_ptr<rgw::sal::Bucket> bucket;
- int ret = store->get_bucket(dpp, nullptr, b, &bucket, null_yield);
+ RGWBucketInfo bucket_info;
+ RGWSysObjectCtx sys_obj_ctx = store->svc()->sysobj->init_obj_ctx();
+ int ret = store->getRados()->get_bucket_instance_info(sys_obj_ctx,
+ bucket_instance_id,
+ bucket_info,
+ nullptr,
+ nullptr,
+ null_yield,
+ dpp);
if (ret < 0) {
if (ret == -ENOENT) {
// probably raced with bucket removal
return ret;
}
- rgw::sal::Bucket::ListParams params;
- rgw::sal::Bucket::ListResults results;
+ RGWRados::Bucket target(store->getRados(), bucket_info);
+ RGWRados::Bucket::List list_op(&target);
std::string marker;
- params.marker = rgw_obj_key(marker);
- params.list_versions = true;
- params.enforce_ns = false;
- params.allow_unordered = false;
- params.prefix = prefix;
-
- std::deque<std::unique_ptr<rgw::sal::Object>> objs;
- std::deque<std::unique_ptr<rgw::sal::Object::StatOp>> stat_ops;
+ list_op.params.marker = rgw_obj_key(marker);
+ list_op.params.list_versions = true;
+ list_op.params.enforce_ns = false;
+ list_op.params.allow_unordered = false;
+ list_op.params.prefix = prefix;
+
+ bool truncated;
+
+ std::deque<RGWRados::Object::Stat> stat_ops;
std::string prev_versioned_key_name = "";
RGWObjectCtx obj_ctx(store);
do {
+ std::vector<rgw_bucket_dir_entry> result;
constexpr int64_t LIST_OBJS_MAX_ENTRIES = 100;
- ret = bucket->list(dpp, params, LIST_OBJS_MAX_ENTRIES, results, null_yield);
+ ret = list_op.list_objects(dpp, LIST_OBJS_MAX_ENTRIES, &result,
+ NULL, &truncated, null_yield);
if (ret == -ENOENT) {
// race with bucket delete?
ret = 0;
return ret;
}
- for (std::vector<rgw_bucket_dir_entry>::iterator iter = results.objs.begin();
- iter != results.objs.end();
+ for (std::vector<rgw_bucket_dir_entry>::iterator iter = result.begin();
+ iter != result.end();
++iter) {
rgw_bucket_dir_entry& entry = *iter;
[&](const rgw_obj_key& key) -> int {
int ret;
- std::unique_ptr<rgw::sal::Object> obj = bucket->get_object(key);
- std::unique_ptr<rgw::sal::Object::StatOp> stat_op = obj->get_stat_op(&obj_ctx);
- rgw::sal::Object::StatOp* op = stat_op.get();
+ rgw_obj obj(bucket_info.bucket, key);
+ RGWRados::Object op_target(store->getRados(), bucket_info,
+ obj_ctx, obj);
- objs.push_back(std::move(obj));
- stat_ops.push_back(std::move(stat_op));
+ stat_ops.push_back(RGWRados::Object::Stat(&op_target));
+ RGWRados::Object::Stat& op = stat_ops.back();
- ret = op->stat_async(dpp);
+ ret = op.stat_async(dpp);
if (ret < 0) {
ldpp_dout(dpp, -1) << "ERROR: stat_async() returned error: " <<
cpp_strerror(-ret) << dendl;
return ret;
}
} // for iter loop
- } while (results.is_truncated);
+ } while (truncated);
while (!stat_ops.empty()) {
ret = pop_and_handle_stat_op(dpp, obj_ctx, stat_ops);
#include "common/Formatter.h"
#include "common/errno.h"
-#include "rgw_sal.h"
+#include "rgw_sal_rados.h"
#define dout_subsys ceph_subsys_rgw
WRITE_CLASS_ENCODER(RGWOrphanSearchState)
class RGWOrphanStore {
- rgw::sal::Store* store;
+ rgw::sal::RadosStore* store;
librados::IoCtx ioctx;
std::string oid;
public:
- explicit RGWOrphanStore(rgw::sal::Store* _store) : store(_store), oid(RGW_ORPHAN_INDEX_OID) {}
+ explicit RGWOrphanStore(rgw::sal::RadosStore* _store) : store(_store), oid(RGW_ORPHAN_INDEX_OID) {}
librados::IoCtx& get_ioctx() { return ioctx; }
class RGWOrphanSearch {
- rgw::sal::Store* store;
+ rgw::sal::RadosStore* store;
RGWOrphanStore orphan_store;
return ceph_str_hash_linux(str.c_str(), str.size()) % RGW_ORPHANSEARCH_HASH_PRIME % search_info.num_shards;
}
- int handle_stat_result(const DoutPrefixProvider *dpp, std::map<int, std::list<std::string> >& oids, rgw::sal::Object::StatOp::Result& result);
- int pop_and_handle_stat_op(const DoutPrefixProvider *dpp, std::map<int, std::list<std::string> >& oids, std::deque<std::unique_ptr<rgw::sal::Object::StatOp>>& ops);
+ int handle_stat_result(const DoutPrefixProvider *dpp, std::map<int, std::list<std::string> >& oids, RGWRados::Object::Stat::Result& result);
+ int pop_and_handle_stat_op(const DoutPrefixProvider *dpp, std::map<int, std::list<std::string> >& oids, std::deque<RGWRados::Object::Stat>& ops);
int remove_index(std::map<int, std::string>& index);
public:
- RGWOrphanSearch(rgw::sal::Store* _store, int _max_ios, uint64_t _stale_secs) : store(_store), orphan_store(store), max_concurrent_ios(_max_ios), stale_secs(_stale_secs) {}
+ RGWOrphanSearch(rgw::sal::RadosStore* _store, int _max_ios, uint64_t _stale_secs) : store(_store), orphan_store(store), max_concurrent_ios(_max_ios), stale_secs(_stale_secs) {}
int save_state() {
RGWOrphanSearchState state;
p.first->second.filter_keys.insert(obj_key);
}
- rgw::sal::Store* store;
+ rgw::sal::RadosStore* store;
uint16_t max_concurrent_ios;
uint64_t stale_secs;
std::string field_separator;
int handle_stat_result(const DoutPrefixProvider *dpp,
- rgw::sal::Object::StatOp::Result& result,
+ RGWRados::Object::Stat::Result& result,
std::string& bucket_name,
rgw_obj_key& obj_key,
std::set<std::string>& obj_oids);
int pop_and_handle_stat_op(const DoutPrefixProvider *dpp,
RGWObjectCtx& obj_ctx,
- std::deque<std::unique_ptr<rgw::sal::Object::StatOp>>& ops);
+ std::deque<RGWRados::Object::Stat>& ops);
public:
- RGWRadosList(rgw::sal::Store* _store,
+ RGWRadosList(rgw::sal::RadosStore* _store,
int _max_ios,
uint64_t _stale_secs,
const std::string& _tenant_name) :