return write_attrs(dpp, y);
}
-int POSIXBucket::read_stats(const DoutPrefixProvider *dpp,
+int POSIXBucket::read_stats(const DoutPrefixProvider *dpp, optional_yield y,
const bucket_index_layout_generation& idx_layout,
int shard_id, std::string* bucket_ver, std::string* master_ver,
std::map<RGWObjCategory, RGWStorageStats>& stats,
auto& main = stats[RGWObjCategory::Main];
// TODO: bucket stats shouldn't have to list all objects
- return dir->for_each(dpp, [this, dpp, &main] (const char* name) {
+ return dir->for_each(dpp, [this, dpp, y, &main] (const char* name) {
if (name[0] == '.') {
/* Skip dotfiles */
return 0;
}
std::unique_ptr<FSEnt> dent;
- int ret = dir->get_ent(dpp, null_yield, name, std::string(), dent);
+ int ret = dir->get_ent(dpp, y, name, std::string(), dent);
if (ret < 0) {
ret = errno;
ldpp_dout(dpp, 0) << "ERROR: could not get ent for object " << name << ": "
return 0;
}
-int POSIXBucket::check_index(const DoutPrefixProvider *dpp, std::map<RGWObjCategory, RGWStorageStats>& existing_stats, std::map<RGWObjCategory, RGWStorageStats>& calculated_stats)
+int POSIXBucket::check_index(const DoutPrefixProvider *dpp, optional_yield y,
+ std::map<RGWObjCategory, RGWStorageStats>& existing_stats,
+ std::map<RGWObjCategory, RGWStorageStats>& calculated_stats)
{
return 0;
}
-int POSIXBucket::rebuild_index(const DoutPrefixProvider *dpp)
+int POSIXBucket::rebuild_index(const DoutPrefixProvider *dpp, optional_yield y)
{
return 0;
}
-int POSIXBucket::set_tag_timeout(const DoutPrefixProvider *dpp, uint64_t timeout)
+int POSIXBucket::set_tag_timeout(const DoutPrefixProvider *dpp, optional_yield y, uint64_t timeout)
{
return 0;
}
return -EOPNOTSUPP;
}
+bool POSIXObject::is_sync_completed(const DoutPrefixProvider* dpp, optional_yield y,
+ const ceph::real_time& obj_mtime)
+{
+ return false;
+}
+
int POSIXObject::load_obj_state(const DoutPrefixProvider* dpp, optional_yield y, bool follow_olh)
{
int ret = stat(dpp);
virtual RGWAccessControlPolicy& get_acl(void) override { return acls; }
virtual int set_acl(const DoutPrefixProvider* dpp, RGWAccessControlPolicy& acl,
optional_yield y) override;
- virtual int read_stats(const DoutPrefixProvider *dpp,
+ virtual int read_stats(const DoutPrefixProvider *dpp, optional_yield y,
const bucket_index_layout_generation& idx_layout,
int shard_id, std::string* bucket_ver, std::string* master_ver,
std::map<RGWObjCategory, RGWStorageStats>& stats,
RGWUsageIter& usage_iter, std::map<rgw_user_bucket, rgw_usage_log_entry>& usage) override;
virtual int trim_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch, optional_yield y) override;
virtual int remove_objs_from_index(const DoutPrefixProvider *dpp, std::list<rgw_obj_index_key>& objs_to_unlink) override;
- virtual int check_index(const DoutPrefixProvider *dpp, std::map<RGWObjCategory, RGWStorageStats>& existing_stats, std::map<RGWObjCategory, RGWStorageStats>& calculated_stats) override;
- virtual int rebuild_index(const DoutPrefixProvider *dpp) override;
- virtual int set_tag_timeout(const DoutPrefixProvider *dpp, uint64_t timeout) override;
+ virtual int check_index(const DoutPrefixProvider *dpp, optional_yield y,
+ std::map<RGWObjCategory, RGWStorageStats>& existing_stats,
+ std::map<RGWObjCategory, RGWStorageStats>& calculated_stats) override;
+ virtual int rebuild_index(const DoutPrefixProvider *dpp, optional_yield y) override;
+ virtual int set_tag_timeout(const DoutPrefixProvider *dpp, optional_yield y, uint64_t timeout) override;
virtual int purge_instance(const DoutPrefixProvider* dpp, optional_yield y) override;
virtual std::unique_ptr<Bucket> clone() override {
bool* truncated, list_parts_each_t each_func,
optional_yield y) override;
+ bool is_sync_completed(const DoutPrefixProvider* dpp, optional_yield y,
+ const ceph::real_time& obj_mtime) override;
virtual int load_obj_state(const DoutPrefixProvider* dpp, optional_yield y, bool follow_olh = true) override;
virtual int set_obj_attrs(const DoutPrefixProvider* dpp, Attrs* setattrs,
Attrs* delattrs, optional_yield y, uint32_t flags) override;
}
// use a quicker/shorter tag timeout during this process
- bucket->set_tag_timeout(dpp, BUCKET_TAG_QUICK_TIMEOUT);
+ bucket->set_tag_timeout(dpp, y, BUCKET_TAG_QUICK_TIMEOUT);
rgw::sal::Bucket::ListResults results;
results.is_truncated = true;
formatter->close_section();
// restore normal tag timeout for bucket
- bucket->set_tag_timeout(dpp, 0);
+ bucket->set_tag_timeout(dpp, y, 0);
return 0;
}
return 0;
}
-int RGWBucket::check_index(const DoutPrefixProvider *dpp,
+int RGWBucket::check_index(const DoutPrefixProvider *dpp, optional_yield y,
RGWBucketAdminOpState& op_state,
map<RGWObjCategory, RGWStorageStats>& existing_stats,
map<RGWObjCategory, RGWStorageStats>& calculated_stats,
{
bool fix_index = op_state.will_fix_index();
- int r = bucket->check_index(dpp, existing_stats, calculated_stats);
+ int r = bucket->check_index(dpp, y, existing_stats, calculated_stats);
if (r < 0) {
set_err_msg(err_msg, "failed to check index error=" + cpp_strerror(-r));
return r;
}
if (fix_index) {
- r = bucket->rebuild_index(dpp);
+ r = bucket->rebuild_index(dpp, y);
if (r < 0) {
set_err_msg(err_msg, "failed to rebuild index err=" + cpp_strerror(-r));
return r;
}
}
- ret = bucket.check_index(dpp, op_state, existing_stats, calculated_stats);
+ ret = bucket.check_index(dpp, y, op_state, existing_stats, calculated_stats);
if (ret < 0) {
return ret;
}
std::string bucket_ver, master_ver;
std::string max_marker;
- ret = bucket->read_stats(dpp, index, RGW_NO_SHARD, &bucket_ver, &master_ver, stats, &max_marker);
+ ret = bucket->read_stats(dpp, y, index, RGW_NO_SHARD, &bucket_ver, &master_ver, stats, &max_marker);
if (ret < 0) {
cerr << "error getting bucket stats bucket=" << bucket->get_name() << " ret=" << ret << std::endl;
return ret;
/* need stats for num_entries */
string bucket_ver, master_ver;
std::map<RGWObjCategory, RGWStorageStats> stats;
- ret = bucket->read_stats(dpp, index, RGW_NO_SHARD, &bucket_ver, &master_ver, stats, nullptr);
+ ret = bucket->read_stats(dpp, y, index, RGW_NO_SHARD, &bucket_ver, &master_ver, stats, nullptr);
if (ret < 0)
continue;
const std::optional<RGWBucketCompleteInfo>& old_bci,
RGWObjVersionTracker& objv_tracker)
{
- int ret = svc_bi->init_index(dpp, bci.info, bci.info.layout.current_index);
+ int ret = svc_bi->init_index(dpp, y, bci.info, bci.info.layout.current_index);
if (ret < 0) {
return ret;
}
int check_index_unlinked(rgw::sal::RadosStore* rados_store, const DoutPrefixProvider *dpp, RGWBucketAdminOpState& op_state,
RGWFormatterFlusher& flusher);
- int check_index(const DoutPrefixProvider *dpp,
+ int check_index(const DoutPrefixProvider *dpp, optional_yield y,
RGWBucketAdminOpState& op_state,
std::map<RGWObjCategory, RGWStorageStats>& existing_stats,
std::map<RGWObjCategory, RGWStorageStats>& calculated_stats,
}
if (zone_placement) {
- ret = svc.bi->init_index(dpp, info, info.layout.current_index);
+ ret = svc.bi->init_index(dpp, y, info, info.layout.current_index);
if (ret < 0) {
return ret;
}
/* only remove it if it's a different bucket instance */
if (orig_info.bucket.bucket_id != bucket.bucket_id) {
if (zone_placement) {
- r = svc.bi->clean_index(dpp, info, info.layout.current_index);
+ r = svc.bi->clean_index(dpp, y, info, info.layout.current_index);
if (r < 0) {
ldpp_dout(dpp, 0) << "WARNING: could not remove bucket index (r=" << r << ")" << dendl;
}
}
}
-int RGWRados::bucket_check_index(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info,
+int RGWRados::bucket_check_index(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info,
map<RGWObjCategory, RGWStorageStats> *existing_stats,
map<RGWObjCategory, RGWStorageStats> *calculated_stats)
{
return 0;
}
-int RGWRados::bucket_rebuild_index(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info)
+int RGWRados::bucket_rebuild_index(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info)
{
librados::IoCtx index_pool;
map<int, string> bucket_objs;
return 0;
}
-int RGWRados::get_bucket_stats(const DoutPrefixProvider *dpp,
+int RGWRados::get_bucket_stats(const DoutPrefixProvider *dpp, optional_yield y,
RGWBucketInfo& bucket_info,
const rgw::bucket_index_layout_generation& idx_layout,
int shard_id, string *bucket_ver, string *master_ver,
rctx->set_compressed(obj);
}
int decode_policy(const DoutPrefixProvider *dpp, bufferlist& bl, ACLOwner *owner);
- int get_bucket_stats(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, const rgw::bucket_index_layout_generation& idx_layout, int shard_id, std::string *bucket_ver, std::string *master_ver,
+ int get_bucket_stats(const DoutPrefixProvider *dpp, optional_yield y,
+ RGWBucketInfo& bucket_info, const rgw::bucket_index_layout_generation& idx_layout, int shard_id, std::string *bucket_ver, std::string *master_ver,
std::map<RGWObjCategory, RGWStorageStats>& stats, std::string *max_marker, bool* syncstopped = NULL);
int get_bucket_stats_async(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, const rgw::bucket_index_layout_generation& idx_layout, int shard_id, boost::intrusive_ptr<rgw::sal::ReadStatsCB> cb);
int process_lc(const std::unique_ptr<rgw::sal::Bucket>& optional_bucket);
- int bucket_check_index(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info,
+ int bucket_check_index(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info,
std::map<RGWObjCategory, RGWStorageStats> *existing_stats,
std::map<RGWObjCategory, RGWStorageStats> *calculated_stats);
- int bucket_rebuild_index(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info);
+ int bucket_rebuild_index(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info);
// Search the bucket for encrypted multipart uploads, and increase their mtime
// slightly to generate a bilog entry to trigger a resync to repair any
}
// delete its shard objects (ignore errors)
- store->svc()->bi->clean_index(dpp, info, info.layout.current_index);
+ store->svc()->bi->clean_index(dpp, y, info, info.layout.current_index);
// delete the bucket instance metadata
return store->ctl()->bucket->remove_bucket_instance_info(bucket, info, y, dpp);
}
const rgw::bucket_index_layout_generation& index,
ReshardFaultInjector& fault,
bool& support_logrecord,
- const DoutPrefixProvider* dpp)
+ const DoutPrefixProvider* dpp, optional_yield y)
{
int ret = 0;
if (ret = fault.check("init_index");
ret == 0) { // no fault injected, initialize index
- ret = store->svc()->bi->init_index(dpp, bucket_info, index, true);
+ ret = store->svc()->bi->init_index(dpp, y, bucket_info, index, true);
}
if (ret == -EOPNOTSUPP) {
ldpp_dout(dpp, 0) << "WARNING: " << "init_index() does not supported logrecord, "
<< "falling back to block reshard mode." << dendl;
support_logrecord = false;
- ret = store->svc()->bi->init_index(dpp, bucket_info, index, false);
+ ret = store->svc()->bi->init_index(dpp, y, bucket_info, index, false);
} else if (ret < 0) {
ldpp_dout(dpp, 0) << "ERROR: " << __func__ << " failed to initialize "
"target index shard objects: " << cpp_strerror(ret) << dendl;
if (!bucket_info.datasync_flag_enabled()) {
// if bucket sync is disabled, disable it on each of the new shards too
auto log = rgw::log_layout_from_index(0, index);
- ret = store->svc()->bilog_rados->log_stop(dpp, bucket_info, log, -1);
+ ret = store->svc()->bilog_rados->log_stop(dpp, y, bucket_info, log, -1);
if (ret < 0) {
ldpp_dout(dpp, 0) << "ERROR: " << __func__ << " failed to disable "
"bucket sync on the target index shard objects: "
<< cpp_strerror(ret) << dendl;
- store->svc()->bi->clean_index(dpp, bucket_info, index);
+ store->svc()->bi->clean_index(dpp, y, bucket_info, index);
return ret;
}
}
ldpp_dout(dpp, 10) << __func__ << " removing existing target index "
"objects from a previous reshard attempt" << dendl;
// delete its existing shard objects (ignore errors)
- store->svc()->bi->clean_index(dpp, bucket_info, *bucket_info.layout.target_index);
+ store->svc()->bi->clean_index(dpp, y, bucket_info, *bucket_info.layout.target_index);
// don't reuse this same generation in the new target layout, in case
// something is still trying to operate on its shard objects
target.gen = bucket_info.layout.target_index->gen + 1;
}
// create the index shard objects
- int ret = init_target_index(store, bucket_info, target, fault, support_logrecord, dpp);
+ int ret = init_target_index(store, bucket_info, target, fault, support_logrecord, dpp, y);
if (ret < 0) {
return ret;
}
bucket_info.layout = std::move(prev); // restore in-memory layout
// delete the target shard objects (ignore errors)
- store->svc()->bi->clean_index(dpp, bucket_info, target);
+ store->svc()->bi->clean_index(dpp, y, bucket_info, target);
return ret;
}
auto prev = bucket_info.layout; // make a copy for cleanup
// remove target index shard objects
- int ret = store->svc()->bi->clean_index(dpp, bucket_info, *prev.target_index);
+ int ret = store->svc()->bi->clean_index(dpp, y, bucket_info, *prev.target_index);
if (ret < 0) {
ldpp_dout(dpp, 1) << "WARNING: " << __func__ << " failed to remove "
"target index with: " << cpp_strerror(ret) << dendl;
if (ret = fault.check("logrecord_writes");
ret == 0) { // no fault injected, record log with writing to the current index shards
ret = store->svc()->bi_rados->set_reshard_status(
- dpp, bucket_info, cls_rgw_reshard_status::IN_LOGRECORD);
+ dpp, y, bucket_info, cls_rgw_reshard_status::IN_LOGRECORD);
}
} else {
ret = store->svc()->bi_rados->set_reshard_status(
- dpp, bucket_info, cls_rgw_reshard_status::IN_PROGRESS);
+ dpp, y, bucket_info, cls_rgw_reshard_status::IN_PROGRESS);
}
if (ret < 0) {
ldpp_dout(dpp, 0) << "ERROR: " << __func__ << " failed to pause "
// unblock writes to the current index shard objects
int ret2 = store->svc()->bi_rados->set_reshard_status(
- dpp, bucket_info, cls_rgw_reshard_status::NOT_RESHARDING);
+ dpp, y, bucket_info, cls_rgw_reshard_status::NOT_RESHARDING);
if (ret2 < 0) {
ldpp_dout(dpp, 1) << "WARNING: " << __func__ << " failed to unblock "
"writes to current index objects: " << cpp_strerror(ret2) << dendl;
if (ret = fault.check("block_writes");
ret == 0) { // no fault injected, block writes to the current index shards
ret = store->svc()->bi_rados->set_reshard_status(
- dpp, bucket_info, cls_rgw_reshard_status::IN_PROGRESS);
+ dpp, y, bucket_info, cls_rgw_reshard_status::IN_PROGRESS);
}
if (ret < 0) {
{
// unblock writes to the current index shard objects
int ret = store->svc()->bi_rados->set_reshard_status(
- dpp, bucket_info, cls_rgw_reshard_status::NOT_RESHARDING);
+ dpp, y, bucket_info, cls_rgw_reshard_status::NOT_RESHARDING);
if (ret < 0) {
ldpp_dout(dpp, 1) << "WARNING: " << __func__ << " failed to unblock "
"writes to current index objects: " << cpp_strerror(ret) << dendl;
// unblock writes to the current index shard objects
int ret2 = store->svc()->bi_rados->set_reshard_status(
- dpp, bucket_info, cls_rgw_reshard_status::NOT_RESHARDING);
+ dpp, y, bucket_info, cls_rgw_reshard_status::NOT_RESHARDING);
if (ret2 < 0) {
ldpp_dout(dpp, 1) << "WARNING: " << __func__ << " failed to unblock "
"writes to current index objects: " << cpp_strerror(ret2) << dendl;
});
if (log == logs.end()) {
// delete the index objects (ignore errors)
- store->svc()->bi->clean_index(dpp, bucket_info, prev.current_index);
+ store->svc()->bi->clean_index(dpp, y, bucket_info, prev.current_index);
}
return 0;
} // commit_reshard
return 0;
} // RGWBucketReshard::do_reshard
-int RGWBucketReshard::get_status(const DoutPrefixProvider *dpp, list<cls_rgw_bucket_instance_entry> *status)
+int RGWBucketReshard::get_status(const DoutPrefixProvider *dpp, optional_yield y,
+ list<cls_rgw_bucket_instance_entry> *status)
{
- return store->svc()->bi_rados->get_reshard_status(dpp, bucket_info, status);
+ return store->svc()->bi_rados->get_reshard_status(dpp, y, bucket_info, status);
}
int RGWBucketReshard::execute(int num_shards,
// determine how many entries there are in the bucket index
std::map<RGWObjCategory, RGWStorageStats> stats;
- ret = store->getRados()->get_bucket_stats(dpp, bucket_info,
+ ret = store->getRados()->get_bucket_stats(dpp, y, bucket_info,
bucket_info.layout.current_index,
-1, nullptr, nullptr, stats, nullptr, nullptr);
if (ret < 0) {
bool verbose = false, std::ostream *out = nullptr,
ceph::Formatter *formatter = nullptr,
RGWReshard *reshard_log = nullptr);
- int get_status(const DoutPrefixProvider *dpp, std::list<cls_rgw_bucket_instance_entry> *status);
+ int get_status(const DoutPrefixProvider *dpp, optional_yield y,
+ std::list<cls_rgw_bucket_instance_entry> *status);
int cancel(const DoutPrefixProvider* dpp, optional_yield y);
int renew_lock_if_needed(const DoutPrefixProvider *dpp);
send_response();
do {
list<rgw_bi_log_entry> entries;
- int ret = static_cast<rgw::sal::RadosStore*>(driver)->svc()->bilog_rados->log_list(s, bucket->get_info(), log_layout, shard_id,
+ int ret = static_cast<rgw::sal::RadosStore*>(driver)->svc()->bilog_rados->log_list(s, y, bucket->get_info(), log_layout, shard_id,
marker, max_entries - count,
entries, &truncated);
if (ret < 0) {
map<RGWObjCategory, RGWStorageStats> stats;
const auto& index = log_to_index_layout(logs.back());
- int ret = bucket->read_stats(s, index, shard_id, &bucket_ver, &master_ver, stats, &max_marker, &syncstopped);
+ int ret = bucket->read_stats(s, y, index, shard_id, &bucket_ver, &master_ver, stats, &max_marker, &syncstopped);
if (ret < 0 && ret != -ENOENT) {
op_ret = ret;
return;
return;
}
- op_ret = bilog_trim(this, static_cast<rgw::sal::RadosStore*>(driver),
+ op_ret = bilog_trim(this, y, static_cast<rgw::sal::RadosStore*>(driver),
bucket->get_info(), gen, shard_id,
start_marker, end_marker);
if (op_ret < 0) {
return ret;
const auto& index = info.get_current_index();
- ret = read_stats(dpp, index, RGW_NO_SHARD, &bucket_ver, &master_ver, stats, NULL);
+ ret = read_stats(dpp, y, index, RGW_NO_SHARD, &bucket_ver, &master_ver, stats, NULL);
if (ret < 0)
return ret;
return ret;
}
-int RadosBucket::read_stats(const DoutPrefixProvider *dpp,
+int RadosBucket::read_stats(const DoutPrefixProvider *dpp, optional_yield y,
const bucket_index_layout_generation& idx_layout,
int shard_id, std::string* bucket_ver, std::string* master_ver,
std::map<RGWObjCategory, RGWStorageStats>& stats,
std::string* max_marker, bool* syncstopped)
{
- return store->getRados()->get_bucket_stats(dpp, info, idx_layout, shard_id, bucket_ver, master_ver, stats, max_marker, syncstopped);
+ return store->getRados()->get_bucket_stats(dpp, y, info, idx_layout, shard_id, bucket_ver, master_ver, stats, max_marker, syncstopped);
}
int RadosBucket::read_stats_async(const DoutPrefixProvider *dpp,
return store->getRados()->remove_objs_from_index(dpp, info, objs_to_unlink);
}
-int RadosBucket::check_index(const DoutPrefixProvider *dpp, std::map<RGWObjCategory, RGWStorageStats>& existing_stats, std::map<RGWObjCategory, RGWStorageStats>& calculated_stats)
+int RadosBucket::check_index(const DoutPrefixProvider *dpp, optional_yield y,
+ std::map<RGWObjCategory, RGWStorageStats>& existing_stats,
+ std::map<RGWObjCategory, RGWStorageStats>& calculated_stats)
{
- return store->getRados()->bucket_check_index(dpp, info, &existing_stats, &calculated_stats);
+ return store->getRados()->bucket_check_index(dpp, y, info, &existing_stats, &calculated_stats);
}
-int RadosBucket::rebuild_index(const DoutPrefixProvider *dpp)
+int RadosBucket::rebuild_index(const DoutPrefixProvider *dpp, optional_yield y)
{
- return store->getRados()->bucket_rebuild_index(dpp, info);
+ return store->getRados()->bucket_rebuild_index(dpp, y, info);
}
-int RadosBucket::set_tag_timeout(const DoutPrefixProvider *dpp, uint64_t timeout)
+int RadosBucket::set_tag_timeout(const DoutPrefixProvider *dpp, optional_yield y, uint64_t timeout)
{
return store->getRados()->cls_obj_set_bucket_tag_timeout(dpp, info, timeout);
}
}
bool RadosObject::is_sync_completed(const DoutPrefixProvider* dpp,
- const ceph::real_time& obj_mtime)
+ optional_yield y,
+ const ceph::real_time& obj_mtime)
{
const auto& bucket_info = get_bucket()->get_info();
if (bucket_info.is_indexless()) {
const int shard_id = RGWSI_BucketIndex_RADOS::bucket_shard_index(get_key(), shard_count);
- int ret = store->svc()->bilog_rados->log_list(dpp, bucket_info, log_layout, shard_id,
+ int ret = store->svc()->bilog_rados->log_list(dpp, y, bucket_info, log_layout, shard_id,
marker, 1, entries, &truncated);
if (ret < 0) {
StoreObject::set_compressed();
}
- virtual bool is_sync_completed(const DoutPrefixProvider* dpp,
- const ceph::real_time& obj_mtime) override;
+ bool is_sync_completed(const DoutPrefixProvider* dpp, optional_yield y,
+ const ceph::real_time& obj_mtime) override;
/* For rgw_admin.cc */
RGWObjState& get_state() { return state; }
virtual int load_obj_state(const DoutPrefixProvider* dpp, optional_yield y, bool follow_olh = true) override;
int create(const DoutPrefixProvider* dpp, const CreateParams& params,
optional_yield y) override;
virtual int load_bucket(const DoutPrefixProvider* dpp, optional_yield y) override;
- virtual int read_stats(const DoutPrefixProvider *dpp,
+ virtual int read_stats(const DoutPrefixProvider *dpp, optional_yield y,
const bucket_index_layout_generation& idx_layout,
int shard_id, std::string* bucket_ver, std::string* master_ver,
std::map<RGWObjCategory, RGWStorageStats>& stats,
std::map<rgw_user_bucket, rgw_usage_log_entry>& usage) override;
virtual int trim_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch, optional_yield y) override;
virtual int remove_objs_from_index(const DoutPrefixProvider *dpp, std::list<rgw_obj_index_key>& objs_to_unlink) override;
- virtual int check_index(const DoutPrefixProvider *dpp, std::map<RGWObjCategory, RGWStorageStats>& existing_stats, std::map<RGWObjCategory, RGWStorageStats>& calculated_stats) override;
- virtual int rebuild_index(const DoutPrefixProvider *dpp) override;
- virtual int set_tag_timeout(const DoutPrefixProvider *dpp, uint64_t timeout) override;
+ virtual int check_index(const DoutPrefixProvider *dpp, optional_yield y,
+ std::map<RGWObjCategory, RGWStorageStats>& existing_stats,
+ std::map<RGWObjCategory, RGWStorageStats>& calculated_stats) override;
+ virtual int rebuild_index(const DoutPrefixProvider *dpp, optional_yield y) override;
+ virtual int set_tag_timeout(const DoutPrefixProvider *dpp, optional_yield y, uint64_t timeout) override;
virtual int purge_instance(const DoutPrefixProvider* dpp, optional_yield y) override;
virtual std::unique_ptr<Bucket> clone() override {
return std::make_unique<RadosBucket>(*this);
} // namespace rgw
-int bilog_trim(const DoutPrefixProvider* p, rgw::sal::RadosStore* store,
+int bilog_trim(const DoutPrefixProvider* p, optional_yield y,
+ rgw::sal::RadosStore* store,
RGWBucketInfo& bucket_info, uint64_t gen, int shard_id,
std::string_view start_marker, std::string_view end_marker)
{
auto log_layout = *log;
- auto r = store->svc()->bilog_rados->log_trim(p, bucket_info, log_layout, shard_id, start_marker, end_marker);
+ auto r = store->svc()->bilog_rados->log_trim(p, y, bucket_info, log_layout, shard_id, start_marker, end_marker);
if (r < 0) {
ldpp_dout(p, 5) << __PRETTY_FUNCTION__ << ":" << __LINE__
<< "ERROR: bilog_rados->log_trim returned r=" << r << dendl;
#include "include/common_fwd.h"
#include "include/encoding.h"
+#include "common/async/yield_context.h"
#include "common/ceph_time.h"
#include "common/dout.h"
#include "rgw_common.h"
WRITE_CLASS_ENCODER(rgw::BucketTrimStatus);
-int bilog_trim(const DoutPrefixProvider* p, rgw::sal::RadosStore* store,
+int bilog_trim(const DoutPrefixProvider* p, optional_yield y,
+ rgw::sal::RadosStore* store,
RGWBucketInfo& bucket_info, uint64_t gen, int shard_id,
std::string_view start_marker, std::string_view end_marker);
bucket->get_info(), bucket->get_attrs(),
nullptr /* no callback */);
list<cls_rgw_bucket_instance_entry> status;
- int r = br.get_status(dpp(), &status);
+ int r = br.get_status(dpp(), null_yield, &status);
if (r < 0) {
cerr << "ERROR: could not get resharding status for bucket " <<
bucket_name << std::endl;
do {
list<rgw_bi_log_entry> entries;
- ret = static_cast<rgw::sal::RadosStore*>(driver)->svc()->bilog_rados->log_list(dpp(), bucket->get_info(), log_layout, shard_id, marker, max_entries - count, entries, &truncated);
+ ret = static_cast<rgw::sal::RadosStore*>(driver)->svc()->bilog_rados->log_list(dpp(), null_yield, bucket->get_info(), log_layout, shard_id, marker, max_entries - count, entries, &truncated);
if (ret < 0) {
cerr << "ERROR: list_bi_log_entries(): " << cpp_strerror(-ret) << std::endl;
return -ret;
if (!gen) {
gen = 0;
}
- ret = bilog_trim(dpp(), static_cast<rgw::sal::RadosStore*>(driver),
+ ret = bilog_trim(dpp(), null_yield, static_cast<rgw::sal::RadosStore*>(driver),
bucket->get_info(), *gen,
shard_id, start_marker, end_marker);
if (ret < 0) {
}
void handle_replication_status_header(
- const DoutPrefixProvider *dpp,
+ const DoutPrefixProvider *dpp, optional_yield y,
rgw::sal::Attrs& attrs,
req_state* s,
const ceph::real_time &obj_mtime) {
auto attr_iter = attrs.find(RGW_ATTR_OBJ_REPLICATION_STATUS);
if (attr_iter != attrs.end() && attr_iter->second.to_str() == "PENDING") {
- if (s->object->is_sync_completed(dpp, obj_mtime)) {
+ if (s->object->is_sync_completed(dpp, y, obj_mtime)) {
s->object->set_atomic();
rgw::sal::Attrs setattrs, rmattrs;
bufferlist bl;
bl.append("COMPLETED");
setattrs[RGW_ATTR_OBJ_REPLICATION_STATUS] = bl;
- int ret = s->object->set_obj_attrs(dpp, &setattrs, &rmattrs, s->yield, 0);
+ int ret = s->object->set_obj_attrs(dpp, &setattrs, &rmattrs, y, 0);
if (ret < 0) {
ldpp_dout(dpp, 0) << "ERROR: failed to set object replication status to COMPLETED ret=" << ret << dendl;
return;
filter = &*decompress;
}
- handle_replication_status_header(this, attrs, s, lastmod);
+ handle_replication_status_header(this, y, attrs, s, lastmod);
attr_iter = attrs.find(RGW_ATTR_OBJ_REPLICATION_TRACE);
if (attr_iter != attrs.end()) {
std::string bver, mver; // ignored
std::map<RGWObjCategory, RGWStorageStats> categories;
- int r = bucket.read_stats(dpp, index, -1, &bver, &mver, categories);
+ int r = bucket.read_stats(dpp, y, index, -1, &bver, &mver, categories);
if (r < 0) {
return r;
}
string master_ver;
map<RGWObjCategory, RGWStorageStats> bucket_stats;
- r = bucket->read_stats(dpp, index, RGW_NO_SHARD, &bucket_ver,
+ r = bucket->read_stats(dpp, y, index, RGW_NO_SHARD, &bucket_ver,
&master_ver, bucket_stats, nullptr);
if (r < 0) {
ldpp_dout(dpp, 0) << "could not get bucket stats for bucket="
/** Load this bucket from the backing store. Requires the key to be set, fills other fields. */
virtual int load_bucket(const DoutPrefixProvider* dpp, optional_yield y) = 0;
/** Read the bucket stats from the backing Store, synchronous */
- virtual int read_stats(const DoutPrefixProvider *dpp,
+ virtual int read_stats(const DoutPrefixProvider *dpp, optional_yield y,
const bucket_index_layout_generation& idx_layout,
int shard_id, std::string* bucket_ver, std::string* master_ver,
std::map<RGWObjCategory, RGWStorageStats>& stats,
/** Remove objects from the bucket index of this bucket. May be removed from API */
virtual int remove_objs_from_index(const DoutPrefixProvider *dpp, std::list<rgw_obj_index_key>& objs_to_unlink) = 0;
/** Check the state of the bucket index, and get stats from it. May be removed from API */
- virtual int check_index(const DoutPrefixProvider *dpp, std::map<RGWObjCategory, RGWStorageStats>& existing_stats, std::map<RGWObjCategory, RGWStorageStats>& calculated_stats) = 0;
+ virtual int check_index(const DoutPrefixProvider *dpp, optional_yield y,
+ std::map<RGWObjCategory, RGWStorageStats>& existing_stats,
+ std::map<RGWObjCategory, RGWStorageStats>& calculated_stats) = 0;
/** Rebuild the bucket index. May be removed from API */
- virtual int rebuild_index(const DoutPrefixProvider *dpp) = 0;
+ virtual int rebuild_index(const DoutPrefixProvider *dpp, optional_yield y) = 0;
/** Set a timeout on the check_index() call. May be removed from API */
- virtual int set_tag_timeout(const DoutPrefixProvider *dpp, uint64_t timeout) = 0;
+ virtual int set_tag_timeout(const DoutPrefixProvider *dpp, optional_yield y, uint64_t timeout) = 0;
/** Remove this specific bucket instance from the backing store. May be removed from API */
virtual int purge_instance(const DoutPrefixProvider* dpp, optional_yield y) = 0;
virtual bool is_compressed() = 0;
/** Check if object is synced */
virtual bool is_sync_completed(const DoutPrefixProvider* dpp,
- const ceph::real_time& obj_mtime) = 0;
+ optional_yield y,
+ const ceph::real_time& obj_mtime) = 0;
/** Invalidate cached info about this object, except atomic, prefetch, and
* compressed */
virtual void invalidate() = 0;
}
/* stats - Not for first pass */
- int DBBucket::read_stats(const DoutPrefixProvider *dpp,
+ int DBBucket::read_stats(const DoutPrefixProvider *dpp, optional_yield y,
const bucket_index_layout_generation& idx_layout,
int shard_id,
std::string *bucket_ver, std::string *master_ver,
return 0;
}
- int DBBucket::check_index(const DoutPrefixProvider *dpp, std::map<RGWObjCategory, RGWStorageStats>& existing_stats, std::map<RGWObjCategory, RGWStorageStats>& calculated_stats)
+ int DBBucket::check_index(const DoutPrefixProvider *dpp, optional_yield y,
+ std::map<RGWObjCategory, RGWStorageStats>& existing_stats,
+ std::map<RGWObjCategory, RGWStorageStats>& calculated_stats)
{
/* XXX: stats not supported yet */
return 0;
}
- int DBBucket::rebuild_index(const DoutPrefixProvider *dpp)
+ int DBBucket::rebuild_index(const DoutPrefixProvider *dpp, optional_yield y)
{
/* there is no index table in dbstore. Not applicable */
return 0;
}
- int DBBucket::set_tag_timeout(const DoutPrefixProvider *dpp, uint64_t timeout)
+ int DBBucket::set_tag_timeout(const DoutPrefixProvider *dpp, optional_yield y, uint64_t timeout)
{
/* XXX: CHECK: set tag timeout for all the bucket objects? */
return 0;
return -EOPNOTSUPP;
}
+ bool DBObject::is_sync_completed(const DoutPrefixProvider* dpp, optional_yield y,
+ const ceph::real_time& obj_mtime)
+ {
+ return false;
+ }
+
int DBObject::load_obj_state(const DoutPrefixProvider* dpp, optional_yield y, bool follow_olh)
{
RGWObjState* astate;
const CreateParams& params,
optional_yield y) override;
virtual int load_bucket(const DoutPrefixProvider *dpp, optional_yield y) override;
- virtual int read_stats(const DoutPrefixProvider *dpp,
+ virtual int read_stats(const DoutPrefixProvider *dpp, optional_yield y,
const bucket_index_layout_generation& idx_layout,
int shard_id,
std::string *bucket_ver, std::string *master_ver,
std::map<rgw_user_bucket, rgw_usage_log_entry>& usage) override;
virtual int trim_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch, optional_yield y) override;
virtual int remove_objs_from_index(const DoutPrefixProvider *dpp, std::list<rgw_obj_index_key>& objs_to_unlink) override;
- virtual int check_index(const DoutPrefixProvider *dpp, std::map<RGWObjCategory, RGWStorageStats>& existing_stats, std::map<RGWObjCategory, RGWStorageStats>& calculated_stats) override;
- virtual int rebuild_index(const DoutPrefixProvider *dpp) override;
- virtual int set_tag_timeout(const DoutPrefixProvider *dpp, uint64_t timeout) override;
+ virtual int check_index(const DoutPrefixProvider *dpp, optional_yield y,
+ std::map<RGWObjCategory, RGWStorageStats>& existing_stats,
+ std::map<RGWObjCategory, RGWStorageStats>& calculated_stats) override;
+ virtual int rebuild_index(const DoutPrefixProvider *dpp, optional_yield y) override;
+ virtual int set_tag_timeout(const DoutPrefixProvider *dpp, optional_yield y, uint64_t timeout) override;
virtual int purge_instance(const DoutPrefixProvider *dpp, optional_yield y) override;
virtual std::unique_ptr<Bucket> clone() override {
return std::make_unique<DBBucket>(*this);
bool* truncated, list_parts_each_t each_func,
optional_yield y) override;
+ bool is_sync_completed(const DoutPrefixProvider* dpp, optional_yield y,
+ const ceph::real_time& obj_mtime) override;
virtual int load_obj_state(const DoutPrefixProvider* dpp, optional_yield y, bool follow_olh = true) override;
virtual int get_obj_attrs(optional_yield y, const DoutPrefixProvider* dpp, rgw_obj* target_obj = NULL) override;
virtual int modify_obj_attrs(const char* attr_name, bufferlist& attr_val, optional_yield y, const DoutPrefixProvider* dpp,
return next->load_bucket(dpp, y);
}
-int FilterBucket::read_stats(const DoutPrefixProvider *dpp,
+int FilterBucket::read_stats(const DoutPrefixProvider *dpp, optional_yield y,
const bucket_index_layout_generation& idx_layout,
int shard_id, std::string* bucket_ver,
std::string* master_ver,
std::map<RGWObjCategory, RGWStorageStats>& stats,
std::string* max_marker, bool* syncstopped)
{
- return next->read_stats(dpp, idx_layout, shard_id, bucket_ver, master_ver,
+ return next->read_stats(dpp, y, idx_layout, shard_id, bucket_ver, master_ver,
stats, max_marker, syncstopped);
}
return next->remove_objs_from_index(dpp, objs_to_unlink);
}
-int FilterBucket::check_index(const DoutPrefixProvider *dpp,
+int FilterBucket::check_index(const DoutPrefixProvider *dpp, optional_yield y,
std::map<RGWObjCategory, RGWStorageStats>& existing_stats,
std::map<RGWObjCategory, RGWStorageStats>& calculated_stats)
{
- return next->check_index(dpp, existing_stats, calculated_stats);
+ return next->check_index(dpp, y, existing_stats, calculated_stats);
}
-int FilterBucket::rebuild_index(const DoutPrefixProvider *dpp)
+int FilterBucket::rebuild_index(const DoutPrefixProvider *dpp, optional_yield y)
{
- return next->rebuild_index(dpp);
+ return next->rebuild_index(dpp, y);
}
-int FilterBucket::set_tag_timeout(const DoutPrefixProvider *dpp, uint64_t timeout)
+int FilterBucket::set_tag_timeout(const DoutPrefixProvider *dpp, optional_yield y, uint64_t timeout)
{
- return next->set_tag_timeout(dpp, timeout);
+ return next->set_tag_timeout(dpp, y, timeout);
}
int FilterBucket::purge_instance(const DoutPrefixProvider* dpp, optional_yield y)
const CreateParams& params,
optional_yield y) override;
virtual int load_bucket(const DoutPrefixProvider* dpp, optional_yield y) override;
- virtual int read_stats(const DoutPrefixProvider *dpp,
+ virtual int read_stats(const DoutPrefixProvider *dpp, optional_yield y,
const bucket_index_layout_generation& idx_layout,
int shard_id, std::string* bucket_ver, std::string* master_ver,
std::map<RGWObjCategory, RGWStorageStats>& stats,
virtual int remove_objs_from_index(const DoutPrefixProvider *dpp,
std::list<rgw_obj_index_key>&
objs_to_unlink) override;
- virtual int check_index(const DoutPrefixProvider *dpp,
+ virtual int check_index(const DoutPrefixProvider *dpp, optional_yield y,
std::map<RGWObjCategory, RGWStorageStats>&
existing_stats,
std::map<RGWObjCategory, RGWStorageStats>&
calculated_stats) override;
- virtual int rebuild_index(const DoutPrefixProvider *dpp) override;
- virtual int set_tag_timeout(const DoutPrefixProvider *dpp, uint64_t timeout) override;
+ virtual int rebuild_index(const DoutPrefixProvider *dpp, optional_yield y) override;
+ virtual int set_tag_timeout(const DoutPrefixProvider *dpp, optional_yield y, uint64_t timeout) override;
virtual int purge_instance(const DoutPrefixProvider* dpp, optional_yield y) override;
virtual bool empty() const override { return next->empty(); }
virtual const std::string& get_name() const override { return next->get_name(); }
virtual bool is_prefetch_data() override { return next->is_prefetch_data(); }
virtual void set_compressed() override { return next->set_compressed(); }
virtual bool is_compressed() override { return next->is_compressed(); }
- virtual bool is_sync_completed(const DoutPrefixProvider* dpp,
- const ceph::real_time& obj_mtime) override { return next->is_sync_completed(dpp, obj_mtime); }
+ bool is_sync_completed(const DoutPrefixProvider* dpp, optional_yield y,
+ const ceph::real_time& obj_mtime) override {
+ return next->is_sync_completed(dpp, y, obj_mtime);
+ }
virtual void invalidate() override { return next->invalidate(); }
virtual bool empty() const override { return next->empty(); }
virtual const std::string &get_name() const override { return next->get_name(); }
virtual bool is_prefetch_data() override { return state.prefetch_data; }
virtual void set_compressed() override { state.compressed = true; }
virtual bool is_compressed() override { return state.compressed; }
- virtual bool is_sync_completed(const DoutPrefixProvider* dpp,
- const ceph::real_time& obj_mtime) override { return false; }
virtual void invalidate() override {
rgw_obj obj = state.obj;
bool is_atomic = state.is_atomic;
RGWSI_BucketIndex(CephContext *cct) : RGWServiceInstance(cct) {}
virtual ~RGWSI_BucketIndex() {}
- virtual int init_index(const DoutPrefixProvider *dpp,
+ virtual int init_index(const DoutPrefixProvider *dpp, optional_yield y,
const RGWBucketInfo& bucket_info,
const rgw::bucket_index_layout_generation& idx_layout,
bool judge_support_logrecord = false) = 0;
- virtual int clean_index(const DoutPrefixProvider *dpp,
+ virtual int clean_index(const DoutPrefixProvider *dpp, optional_yield y,
const RGWBucketInfo& bucket_info,
const rgw::bucket_index_layout_generation& idx_layout) = 0;
}
int RGWSI_BucketIndex_RADOS::init_index(const DoutPrefixProvider *dpp,
+ optional_yield y,
const RGWBucketInfo& bucket_info,
const rgw::bucket_index_layout_generation& idx_layout,
bool judge_support_logrecord)
}
}
-int RGWSI_BucketIndex_RADOS::clean_index(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info,
+int RGWSI_BucketIndex_RADOS::clean_index(const DoutPrefixProvider *dpp,
+ optional_yield y,
+ const RGWBucketInfo& bucket_info,
const rgw::bucket_index_layout_generation& idx_layout)
{
if (idx_layout.layout.type != rgw::BucketIndexType::Normal) {
return 0;
}
-int RGWSI_BucketIndex_RADOS::get_reshard_status(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, list<cls_rgw_bucket_instance_entry> *status)
+int RGWSI_BucketIndex_RADOS::get_reshard_status(const DoutPrefixProvider *dpp,
+ optional_yield y,
+ const RGWBucketInfo& bucket_info,
+ list<cls_rgw_bucket_instance_entry> *status)
{
map<int, string> bucket_objs;
}
int RGWSI_BucketIndex_RADOS::set_reshard_status(const DoutPrefixProvider *dpp,
+ optional_yield y,
const RGWBucketInfo& bucket_info,
cls_rgw_reshard_status status)
{
int ret;
if (!new_sync_enabled) {
- ret = svc.bilog->log_stop(dpp, info, bilog, -1);
+ ret = svc.bilog->log_stop(dpp, y, info, bilog, -1);
} else {
- ret = svc.bilog->log_start(dpp, info, bilog, -1);
+ ret = svc.bilog->log_start(dpp, y, info, bilog, -1);
}
if (ret < 0) {
ldpp_dout(dpp, -1) << "ERROR: failed writing bilog (bucket=" << info.bucket << "); ret=" << ret << dendl;
return bucket_shard_index(sharding_key, num_shards);
}
- int init_index(const DoutPrefixProvider *dpp,
+ int init_index(const DoutPrefixProvider *dpp, optional_yield y,
const RGWBucketInfo& bucket_info,
const rgw::bucket_index_layout_generation& idx_layout,
bool judge_support_logrecord = false) override;
- int clean_index(const DoutPrefixProvider *dpp,
+ int clean_index(const DoutPrefixProvider *dpp, optional_yield y,
const RGWBucketInfo& bucket_info,
const rgw::bucket_index_layout_generation& idx_layout) override;
RGWBucketEnt *stats,
optional_yield y) override;
- int get_reshard_status(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info,
+ int get_reshard_status(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info,
std::list<cls_rgw_bucket_instance_entry> *status);
- int set_reshard_status(const DoutPrefixProvider *dpp,
+ int set_reshard_status(const DoutPrefixProvider *dpp, optional_yield y,
const RGWBucketInfo& bucket_info,
cls_rgw_reshard_status status);
int trim_reshard_log(const DoutPrefixProvider* dpp, optional_yield,
svc.bi = bi_rados_svc;
}
-int RGWSI_BILog_RADOS::log_trim(const DoutPrefixProvider *dpp,
+int RGWSI_BILog_RADOS::log_trim(const DoutPrefixProvider *dpp, optional_yield y,
const RGWBucketInfo& bucket_info,
const rgw::bucket_log_layout_generation& log_layout,
int shard_id,
cct->_conf->rgw_bucket_index_max_aio)();
}
-int RGWSI_BILog_RADOS::log_start(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw::bucket_log_layout_generation& log_layout, int shard_id)
+int RGWSI_BILog_RADOS::log_start(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info,
+ const rgw::bucket_log_layout_generation& log_layout,
+ int shard_id)
{
librados::IoCtx index_pool;
map<int, string> bucket_objs;
return CLSRGWIssueResyncBucketBILog(index_pool, bucket_objs, cct->_conf->rgw_bucket_index_max_aio)();
}
-int RGWSI_BILog_RADOS::log_stop(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw::bucket_log_layout_generation& log_layout, int shard_id)
+int RGWSI_BILog_RADOS::log_stop(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info,
+ const rgw::bucket_log_layout_generation& log_layout,
+ int shard_id)
{
librados::IoCtx index_pool;
map<int, string> bucket_objs;
}
}
-int RGWSI_BILog_RADOS::log_list(const DoutPrefixProvider *dpp,
+int RGWSI_BILog_RADOS::log_list(const DoutPrefixProvider *dpp, optional_yield y,
const RGWBucketInfo& bucket_info,
const rgw::bucket_log_layout_generation& log_layout,
int shard_id, string& marker, uint32_t max,
void init(RGWSI_BucketIndex_RADOS *bi_rados_svc);
- int log_start(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw::bucket_log_layout_generation& log_layout, int shard_id);
- int log_stop(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw::bucket_log_layout_generation& log_layout, int shard_id);
+ int log_start(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info,
+ const rgw::bucket_log_layout_generation& log_layout,
+ int shard_id);
+ int log_stop(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info,
+ const rgw::bucket_log_layout_generation& log_layout,
+ int shard_id);
- int log_trim(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info,
+ int log_trim(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info,
const rgw::bucket_log_layout_generation& log_layout,
int shard_id,
std::string_view start_marker,
std::string_view end_marker);
- int log_list(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info,
+ int log_list(const DoutPrefixProvider *dpp, optional_yield y,
+ const RGWBucketInfo& bucket_info,
const rgw::bucket_log_layout_generation& log_layout,
int shard_id,
std::string& marker,