From 54f2e0ac18bcc3037176f7cd5bf8864441537926 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 6 Aug 2014 17:31:12 -0700 Subject: [PATCH] rgw: adapt to new objclass interface use rgw_obj_key instead of string, and pass it on to the objclass. Signed-off-by: Yehuda Sadeh --- src/cls/rgw/cls_rgw_client.cc | 15 +++----- src/cls/rgw/cls_rgw_client.h | 8 ++-- src/cls/rgw/cls_rgw_types.h | 3 ++ src/rgw/rgw_bucket.cc | 23 +++++++----- src/rgw/rgw_bucket.h | 2 +- src/rgw/rgw_cache.h | 4 +- src/rgw/rgw_common.h | 11 ++++++ src/rgw/rgw_gc.cc | 10 +++-- src/rgw/rgw_op.cc | 7 +++- src/rgw/rgw_rados.cc | 70 ++++++++++++++++++++++------------- src/rgw/rgw_rados.h | 12 +++--- 11 files changed, 102 insertions(+), 63 deletions(-) diff --git a/src/cls/rgw/cls_rgw_client.cc b/src/cls/rgw/cls_rgw_client.cc index 23103fada5154..ccb30ebde7476 100644 --- a/src/cls/rgw/cls_rgw_client.cc +++ b/src/cls/rgw/cls_rgw_client.cc @@ -27,15 +27,14 @@ void cls_rgw_bucket_set_tag_timeout(ObjectWriteOperation& o, uint64_t tag_timeou } void cls_rgw_bucket_prepare_op(ObjectWriteOperation& o, RGWModifyOp op, string& tag, - const string& name, const string& instance, const string& locator, bool log_op) + const cls_rgw_obj_key& key, const string& locator, bool log_op) { struct rgw_cls_obj_prepare_op call; call.op = op; call.tag = tag; - call.name = name; + call.key = key; call.locator = locator; call.log_op = log_op; - call.instance = instance; bufferlist in; ::encode(call, in); o.exec("rgw", "bucket_prepare_op", in); @@ -43,20 +42,19 @@ void cls_rgw_bucket_prepare_op(ObjectWriteOperation& o, RGWModifyOp op, string& void cls_rgw_bucket_complete_op(ObjectWriteOperation& o, RGWModifyOp op, string& tag, rgw_bucket_entry_ver& ver, - const string& name, const string& instance, + const cls_rgw_obj_key& key, rgw_bucket_dir_entry_meta& dir_meta, - list *remove_objs, bool log_op) + list *remove_objs, bool log_op) { bufferlist in; struct rgw_cls_obj_complete_op call; call.op = op; call.tag = tag; - call.name = name; + call.key = key; call.ver = ver; call.meta = dir_meta; call.log_op = log_op; - call.instance = instance; if (remove_objs) call.remove_objs = *remove_objs; ::encode(call, in); @@ -65,7 +63,7 @@ void cls_rgw_bucket_complete_op(ObjectWriteOperation& o, RGWModifyOp op, string& int cls_rgw_list_op(IoCtx& io_ctx, const string& oid, - const string& start_obj, const string& start_instance, + const cls_rgw_obj_key& start_obj, const string& filter_prefix, uint32_t num_entries, rgw_bucket_dir *dir, bool *is_truncated) { @@ -74,7 +72,6 @@ int cls_rgw_list_op(IoCtx& io_ctx, const string& oid, call.start_obj = start_obj; call.filter_prefix = filter_prefix; call.num_entries = num_entries; - call.start_instance = start_instance; ::encode(call, in); int r = io_ctx.exec(oid, "rgw", "bucket_list", in, out); if (r < 0) diff --git a/src/cls/rgw/cls_rgw_client.h b/src/cls/rgw/cls_rgw_client.h index 7f8136ef9ceff..c7f31d8eb411c 100644 --- a/src/cls/rgw/cls_rgw_client.h +++ b/src/cls/rgw/cls_rgw_client.h @@ -18,16 +18,16 @@ void cls_rgw_bucket_init(librados::ObjectWriteOperation& o); void cls_rgw_bucket_set_tag_timeout(librados::ObjectWriteOperation& o, uint64_t tag_timeout); void cls_rgw_bucket_prepare_op(librados::ObjectWriteOperation& o, RGWModifyOp op, string& tag, - const string& name, const string& instance, const string& locator, bool log_op); + const cls_rgw_obj_key& key, const string& locator, bool log_op); void cls_rgw_bucket_complete_op(librados::ObjectWriteOperation& o, RGWModifyOp op, string& tag, rgw_bucket_entry_ver& ver, - const string& name, const string& instance, + const cls_rgw_obj_key& key, rgw_bucket_dir_entry_meta& dir_meta, - list *remove_objs, bool log_op); + list *remove_objs, bool log_op); int cls_rgw_list_op(librados::IoCtx& io_ctx, const string& oid, - const string& start_obj, const string& start_instance, + const cls_rgw_obj_key& start_obj, const string& filter_prefix, uint32_t num_entries, rgw_bucket_dir *dir, bool *is_truncated); diff --git a/src/cls/rgw/cls_rgw_types.h b/src/cls/rgw/cls_rgw_types.h index 39bb3e05afe01..a981e5fabb847 100644 --- a/src/cls/rgw/cls_rgw_types.h +++ b/src/cls/rgw/cls_rgw_types.h @@ -203,6 +203,9 @@ struct cls_rgw_obj_key { string name; string instance; + cls_rgw_obj_key() {} + cls_rgw_obj_key(const string& n, const string& i) : name(n), instance(i) {} + bool operator==(const cls_rgw_obj_key& k) const { return (name.compare(k.name) == 0) && (instance.compare(k.instance) == 0); diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 78dee77678aa3..ebf17f73d4790 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -259,16 +259,16 @@ int rgw_bucket_set_attrs(RGWRados *store, RGWBucketInfo& bucket_info, obj, attrs, rmattrs, objv_tracker); } -static void dump_mulipart_index_results(list& objs_to_unlink, +static void dump_mulipart_index_results(list& objs_to_unlink, Formatter *f) { // make sure that an appropiately titled header has been opened previously - list::iterator oiter = objs_to_unlink.begin(); + list::iterator oiter = objs_to_unlink.begin(); f->open_array_section("invalid_multipart_entries"); for ( ; oiter != objs_to_unlink.end(); ++oiter) { - f->dump_string("object", *oiter); + f->dump_string("object", oiter->name); } f->close_section(); @@ -626,7 +626,7 @@ static void dump_index_check(map existing_stats } int RGWBucket::check_bad_index_multipart(RGWBucketAdminOpState& op_state, - list& objs_to_unlink, std::string *err_msg) + list& objs_to_unlink, std::string *err_msg) { bool fix_index = op_state.will_fix_index(); rgw_bucket bucket = op_state.get_bucket(); @@ -641,7 +641,7 @@ int RGWBucket::check_bad_index_multipart(RGWBucketAdminOpState& op_state, bool is_truncated; map meta_objs; - map all_objs; + map all_objs; do { vector result; @@ -664,9 +664,12 @@ int RGWBucket::check_bad_index_multipart(RGWBucketAdminOpState& op_state, rgw_obj obj(bucket, ent.key); obj.set_ns(ns); - obj.get_index_key(&marker); + rgw_obj_key key; + obj.get_index_key(&key); - string oid = marker.name; + marker = key; + + string oid = key.name; int pos = oid.find_last_of('.'); if (pos < 0) @@ -678,13 +681,13 @@ int RGWBucket::check_bad_index_multipart(RGWBucketAdminOpState& op_state, if (suffix.compare("meta") == 0) { meta_objs[name] = true; } else { - all_objs[oid] = name; + all_objs[key] = name; } } } while (is_truncated); - map::iterator aiter; + map::iterator aiter; for (aiter = all_objs.begin(); aiter != all_objs.end(); ++aiter) { string& name = aiter->second; @@ -892,7 +895,7 @@ int RGWBucketAdminOp::check_index(RGWRados *store, RGWBucketAdminOpState& op_sta map result; map existing_stats; map calculated_stats; - list objs_to_unlink; + list objs_to_unlink; RGWBucket bucket; diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index 3bdd68c057d0d..4c4d52d9fdd2d 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -203,7 +203,7 @@ public: int init(RGWRados *storage, RGWBucketAdminOpState& op_state); int check_bad_index_multipart(RGWBucketAdminOpState& op_state, - list& objs_to_unlink, std::string *err_msg = NULL); + list& objs_to_unlink, std::string *err_msg = NULL); int check_object_index(RGWBucketAdminOpState& op_state, map result, std::string *err_msg = NULL); diff --git a/src/rgw/rgw_cache.h b/src/rgw/rgw_cache.h index c8015fef6c4e9..3aa2e88ee21e7 100644 --- a/src/rgw/rgw_cache.h +++ b/src/rgw/rgw_cache.h @@ -213,7 +213,7 @@ public: int put_obj_meta_impl(void *ctx, rgw_obj& obj, uint64_t size, time_t *mtime, map& attrs, RGWObjCategory category, int flags, map* rmattrs, const bufferlist *data, - RGWObjManifest *manifest, const string *ptag, list *remove_objs, + RGWObjManifest *manifest, const string *ptag, list *remove_objs, bool modify_version, RGWObjVersionTracker *objv_tracker, time_t set_mtime, const string& owner, const char *if_match = NULL, const char *if_nomatch = NULL); @@ -401,7 +401,7 @@ template int RGWCache::put_obj_meta_impl(void *ctx, rgw_obj& obj, uint64_t size, time_t *mtime, map& attrs, RGWObjCategory category, int flags, map* rmattrs, const bufferlist *data, - RGWObjManifest *manifest, const string *ptag, list *remove_objs, + RGWObjManifest *manifest, const string *ptag, list *remove_objs, bool modify_version, RGWObjVersionTracker *objv_tracker, time_t set_mtime, const string& owner, const char *if_match, const char *if_nomatch) diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index ef7c86fdd36c0..e1b2d3afb9423 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -33,6 +33,7 @@ #include "rgw_string.h" #include "cls/version/cls_version_types.h" #include "cls/user/cls_user_types.h" +#include "cls/rgw/cls_rgw_types.h" #include "include/rados/librados.hpp" using namespace std; @@ -946,6 +947,16 @@ struct rgw_obj_key { set(n, i); } + void set(const cls_rgw_obj_key& k) { + name = k.name; + instance = k.instance; + } + + void transform(cls_rgw_obj_key *k) { + k->name = name; + k->instance = instance; + } + void set(const string& n) { name = n; instance.clear(); diff --git a/src/rgw/rgw_gc.cc b/src/rgw/rgw_gc.cc index 15940f3cad254..c536fa96d1613 100644 --- a/src/rgw/rgw_gc.cc +++ b/src/rgw/rgw_gc.cc @@ -195,15 +195,19 @@ int RGWGC::process(int index, int max_secs) } ctx->locator_set_key(obj.loc); - dout(0) << "gc::process: removing " << obj.pool << ":" << obj.oid << dendl; + rgw_obj key_obj; + key_obj.set_obj(obj.key.name); + key_obj.set_instance(obj.key.instance); + + dout(0) << "gc::process: removing " << obj.pool << ":" << key_obj.get_object() << dendl; ObjectWriteOperation op; cls_refcount_put(op, info.tag, true); - ret = ctx->operate(obj.oid, &op); + ret = ctx->operate(key_obj.get_object(), &op); if (ret == -ENOENT) ret = 0; if (ret < 0) { remove_tag = false; - dout(0) << "failed to remove " << obj.pool << ":" << obj.oid << "@" << obj.loc << dendl; + dout(0) << "failed to remove " << obj.pool << ":" << key_obj.get_object() << "@" << obj.loc << dendl; } if (going_down()) // leave early, even if tag isn't removed, it's ok diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 0ff5fb89a8a59..41c291e1b712d 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2783,7 +2783,7 @@ void RGWCompleteMultipart::execute() uint64_t min_part_size = s->cct->_conf->rgw_multipart_min_part_size; - list remove_objs; /* objects to be removed from index listing */ + list remove_objs; /* objects to be removed from index listing */ iter = parts->parts.begin(); @@ -2849,7 +2849,10 @@ void RGWCompleteMultipart::execute() manifest.append(obj_part.manifest); } - remove_objs.push_back(src_obj.get_index_key_name()); + rgw_obj_key remove_key; + src_obj.get_index_key(&remove_key); + + remove_objs.push_back(remove_key); ofs += obj_part.size; } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index b9f37a9974aad..ed024c9c90f5e 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2223,9 +2223,9 @@ int RGWRados::list_objects(rgw_bucket& bucket, int max, string& prefix, string& result.clear(); rgw_obj marker_obj, prefix_obj; + marker_obj.set_instance(marker.instance); marker_obj.set_ns(ns); marker_obj.set_obj(marker.name); -#warning missing marker_ver rgw_obj_key cur_marker; marker_obj.get_index_key(&cur_marker); @@ -2842,7 +2842,7 @@ int RGWRados::put_obj_meta_impl(void *ctx, rgw_obj& obj, uint64_t size, const bufferlist *data, RGWObjManifest *manifest, const string *ptag, - list *remove_objs, + list *remove_objs, bool modify_version, RGWObjVersionTracker *objv_tracker, time_t set_mtime, @@ -3752,10 +3752,11 @@ int RGWRados::complete_atomic_overwrite(RGWRadosCtx *rctx, RGWObjState *state, r const rgw_obj& mobj = iter.get_location(); if (mobj == obj) continue; - string oid, key; + string oid, loc; rgw_bucket bucket; - get_obj_bucket_and_oid_key(mobj, bucket, oid, key); - chain.push_obj(bucket.data_pool, oid, key); + get_obj_bucket_and_oid_key(mobj, bucket, oid, loc); + cls_rgw_obj_key key(obj.get_index_key_name(), obj.get_instance()); + chain.push_obj(bucket.data_pool, key, loc); } string tag = state->obj_tag.c_str(); @@ -4553,7 +4554,7 @@ int RGWRados::prepare_update_index(RGWObjState *state, rgw_bucket& bucket, int RGWRados::complete_update_index(rgw_bucket& bucket, rgw_obj& obj, string& tag, int64_t poolid, uint64_t epoch, uint64_t size, utime_t& ut, string& etag, string& content_type, bufferlist *acl_bl, RGWObjCategory category, - list *remove_objs) + list *remove_objs) { if (bucket_is_system(bucket)) return 0; @@ -6078,7 +6079,8 @@ int RGWRados::cls_obj_prepare_op(rgw_bucket& bucket, RGWModifyOp op, string& tag return r; ObjectWriteOperation o; - cls_rgw_bucket_prepare_op(o, op, tag, obj.get_index_key_name(), obj.get_instance(), obj.get_loc(), zone_public_config.log_data); + cls_rgw_obj_key key(obj.get_index_key_name(), obj.get_instance()); + cls_rgw_bucket_prepare_op(o, op, tag, key, obj.get_loc(), zone_public_config.log_data); r = index_ctx.operate(oid, &o); return r; } @@ -6086,7 +6088,7 @@ int RGWRados::cls_obj_prepare_op(rgw_bucket& bucket, RGWModifyOp op, string& tag int RGWRados::cls_obj_complete_op(rgw_bucket& bucket, RGWModifyOp op, string& tag, int64_t pool, uint64_t epoch, RGWObjEnt& ent, RGWObjCategory category, - list *remove_objs) + list *remove_objs) { librados::IoCtx index_ctx; string oid; @@ -6095,6 +6097,18 @@ int RGWRados::cls_obj_complete_op(rgw_bucket& bucket, RGWModifyOp op, string& ta if (r < 0) return r; + list *pro = NULL; + list ro; + + if (remove_objs) { + for (list::iterator iter = remove_objs->begin(); iter != remove_objs->end(); ++iter) { + cls_rgw_obj_key k; + iter->transform(&k); + ro.push_back(k); + } + pro = &ro; + } + ObjectWriteOperation o; rgw_bucket_dir_entry_meta dir_meta; dir_meta.size = ent.size; @@ -6109,8 +6123,9 @@ int RGWRados::cls_obj_complete_op(rgw_bucket& bucket, RGWModifyOp op, string& ta rgw_bucket_entry_ver ver; ver.pool = pool; ver.epoch = epoch; - cls_rgw_bucket_complete_op(o, op, tag, ver, ent.key.name, ent.key.instance, - dir_meta, remove_objs, zone_public_config.log_data); + cls_rgw_obj_key key(ent.key.name, ent.key.instance); + cls_rgw_bucket_complete_op(o, op, tag, ver, key, dir_meta, pro, + zone_public_config.log_data); AioCompletion *c = librados::Rados::aio_create_completion(NULL, NULL, NULL); r = index_ctx.aio_operate(oid, c, &o); @@ -6121,7 +6136,7 @@ int RGWRados::cls_obj_complete_op(rgw_bucket& bucket, RGWModifyOp op, string& ta int RGWRados::cls_obj_complete_add(rgw_bucket& bucket, string& tag, int64_t pool, uint64_t epoch, RGWObjEnt& ent, RGWObjCategory category, - list *remove_objs) + list *remove_objs) { return cls_obj_complete_op(bucket, CLS_RGW_OP_ADD, tag, pool, epoch, ent, category, remove_objs); } @@ -6173,18 +6188,19 @@ int RGWRados::cls_bucket_list(rgw_bucket& bucket, rgw_obj_key& start, const stri return r; struct rgw_bucket_dir dir; - r = cls_rgw_list_op(index_ctx, oid, start.name, start.instance, prefix, num, &dir, is_truncated); + cls_rgw_obj_key start_key(start.name, start.instance); + r = cls_rgw_list_op(index_ctx, oid, start_key, prefix, num, &dir, is_truncated); if (r < 0) return r; - map::iterator miter; + map::iterator miter; bufferlist updates; for (miter = dir.m.begin(); miter != dir.m.end(); ++miter) { RGWObjEnt e; rgw_bucket_dir_entry& dirent = miter->second; // fill it in with initial values; we may correct later - e.key.set(dirent.name, dirent.instance); + e.key.set(dirent.key.name, dirent.key.instance); e.size = dirent.meta.size; e.mtime = dirent.meta.mtime; e.etag = dirent.meta.etag; @@ -6199,7 +6215,7 @@ int RGWRados::cls_bucket_list(rgw_bucket& bucket, rgw_obj_key& start, const stri continue; } - bool force_check = force_check_filter && force_check_filter(dirent.name); + bool force_check = force_check_filter && force_check_filter(dirent.key.name); if (!dirent.exists || !dirent.pending_map.empty() || force_check) { /* there are uncommitted ops. We need to check the current state, @@ -6219,7 +6235,7 @@ int RGWRados::cls_bucket_list(rgw_bucket& bucket, rgw_obj_key& start, const stri } if (dir.m.size()) { - *last_entry = dir.m.rbegin()->first; + last_entry->set(dir.m.rbegin()->first); } if (updates.length()) { @@ -6292,7 +6308,7 @@ int RGWRados::cls_obj_usage_log_trim(string& oid, string& user, uint64_t start_e return r; } -int RGWRados::remove_objs_from_index(rgw_bucket& bucket, list& oid_list) +int RGWRados::remove_objs_from_index(rgw_bucket& bucket, list& oid_list) { librados::IoCtx index_ctx; string dir_oid; @@ -6303,14 +6319,14 @@ int RGWRados::remove_objs_from_index(rgw_bucket& bucket, list& oid_list) bufferlist updates; - list::iterator iter; + list::iterator iter; for (iter = oid_list.begin(); iter != oid_list.end(); ++iter) { - string& oid = *iter; - dout(2) << "RGWRados::remove_objs_from_index bucket=" << bucket << " oid=" << oid << dendl; + rgw_obj_key& key = *iter; + dout(2) << "RGWRados::remove_objs_from_index bucket=" << bucket << " obj=" << key.name << ":" << key.instance << dendl; rgw_bucket_dir_entry entry; entry.ver.epoch = (uint64_t)-1; // ULLONG_MAX, needed to that objclass doesn't skip out request - entry.name = oid; + key.transform(&entry.key); updates.append(CEPH_RGW_REMOVE); ::encode(entry, updates); } @@ -6329,16 +6345,18 @@ int RGWRados::check_disk_state(librados::IoCtx io_ctx, bufferlist& suggested_updates) { rgw_obj obj; - std::string oid, instance, key, ns; - oid = list_state.name; + std::string oid, instance, loc, ns; + rgw_obj_key key; + key.set(list_state.key); + oid = key.name; if (!rgw_obj::strip_namespace_from_object(oid, ns, instance)) { // well crap assert(0 == "got bad object name off disk"); } obj.init(bucket, oid, list_state.locator, ns); - obj.set_instance(instance); - get_obj_bucket_and_oid_key(obj, bucket, oid, key); - io_ctx.locator_set_key(key); + obj.set_instance(key.instance); + get_obj_bucket_and_oid_key(obj, bucket, oid, loc); + io_ctx.locator_set_key(loc); RGWObjState *astate = NULL; RGWRadosCtx rctx(this); diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 557c98fd506ad..e86b88756d95c 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -1512,7 +1512,7 @@ public: const string *ptag; const char *if_match; const char *if_nomatch; - list *remove_objs; + list *remove_objs; bool modify_version; RGWObjVersionTracker *objv_tracker; time_t set_mtime; @@ -1529,7 +1529,7 @@ public: virtual int put_obj_meta_impl(void *ctx, rgw_obj& obj, uint64_t size, time_t *mtime, map& attrs, RGWObjCategory category, int flags, map* rmattrs, const bufferlist *data, - RGWObjManifest *manifest, const string *ptag, list *remove_objs, + RGWObjManifest *manifest, const string *ptag, list *remove_objs, bool modify_version, RGWObjVersionTracker *objv_tracker, time_t set_mtime /* 0 for don't set */, const string& owner, @@ -1843,8 +1843,8 @@ public: int cls_obj_prepare_op(rgw_bucket& bucket, RGWModifyOp op, string& tag, rgw_obj& obj); int cls_obj_complete_op(rgw_bucket& bucket, RGWModifyOp op, string& tag, int64_t pool, uint64_t epoch, - RGWObjEnt& ent, RGWObjCategory category, list *remove_objs); - int cls_obj_complete_add(rgw_bucket& bucket, string& tag, int64_t pool, uint64_t epoch, RGWObjEnt& ent, RGWObjCategory category, list *remove_objs); + RGWObjEnt& ent, RGWObjCategory category, list *remove_objs); + int cls_obj_complete_add(rgw_bucket& bucket, string& tag, int64_t pool, uint64_t epoch, RGWObjEnt& ent, RGWObjCategory category, list *remove_objs); int cls_obj_complete_del(rgw_bucket& bucket, string& tag, int64_t pool, uint64_t epoch, rgw_obj& obj); int cls_obj_complete_cancel(rgw_bucket& bucket, string& tag, rgw_obj& obj); int cls_obj_set_bucket_tag_timeout(rgw_bucket& bucket, uint64_t timeout); @@ -1857,7 +1857,7 @@ public: RGWModifyOp op, rgw_obj& oid, string& tag); int complete_update_index(rgw_bucket& bucket, rgw_obj& obj, string& tag, int64_t poolid, uint64_t epoch, uint64_t size, utime_t& ut, string& etag, string& content_type, bufferlist *acl_bl, RGWObjCategory category, - list *remove_objs); + list *remove_objs); int complete_update_index_del(rgw_bucket& bucket, rgw_obj& obj, string& tag, int64_t pool, uint64_t epoch) { if (bucket_is_system(bucket)) return 0; @@ -1907,7 +1907,7 @@ public: map *existing_stats, map *calculated_stats); int bucket_rebuild_index(rgw_bucket& bucket); - int remove_objs_from_index(rgw_bucket& bucket, list& oid_list); + int remove_objs_from_index(rgw_bucket& bucket, list& oid_list); int cls_user_get_header(const string& user_id, cls_user_header *header); int cls_user_get_header_async(const string& user_id, RGWGetUserHeader_CB *ctx); -- 2.39.5