From: Adam C. Emerson Date: Fri, 2 Dec 2022 04:25:54 +0000 (-0500) Subject: rgw: Distentangle `rgw_rados_ref` from `RGWSI_RADOS` X-Git-Tag: v19.0.0~21^2~10 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=750680b2d1889d37c46ec14911a2dd6b3f3338bb;p=ceph-ci.git rgw: Distentangle `rgw_rados_ref` from `RGWSI_RADOS` `RGWSI_RADOS` has no reason to exist. `rgw_rados_ref`, on the other hand, is fairly useful. Move `rgw_rados_ref` to `store/rados/rgw_tools.h` along with a function to create one. Then clean up the fallout. Signed-off-by: Adam C. Emerson --- diff --git a/src/rgw/driver/rados/rgw_cr_rados.cc b/src/rgw/driver/rados/rgw_cr_rados.cc index e7174908dd7..d73827bea14 100644 --- a/src/rgw/driver/rados/rgw_cr_rados.cc +++ b/src/rgw/driver/rados/rgw_cr_rados.cc @@ -152,7 +152,7 @@ int RGWSimpleRadosReadAttrsCR::send_request(const DoutPrefixProvider *dpp) } cn = stack->create_completion_notifier(); - return ref.pool.ioctx().aio_operate(ref.obj.oid, cn->completion(), &op, + return ref.ioctx.aio_operate(ref.obj.oid, cn->completion(), &op, nullptr); } @@ -234,7 +234,7 @@ int RGWAsyncLockSystemObj::_send_request(const DoutPrefixProvider *dpp) l.set_cookie(cookie); l.set_may_renew(true); - return l.lock_exclusive(&ref.pool.ioctx(), ref.obj.oid); + return l.lock_exclusive(&ref.ioctx, ref.obj.oid); } RGWAsyncLockSystemObj::RGWAsyncLockSystemObj(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, rgw::sal::RadosStore* _store, @@ -260,7 +260,7 @@ int RGWAsyncUnlockSystemObj::_send_request(const DoutPrefixProvider *dpp) l.set_cookie(cookie); - return l.unlock(&ref.pool.ioctx(), ref.obj.oid); + return l.unlock(&ref.ioctx, ref.obj.oid); } RGWAsyncUnlockSystemObj::RGWAsyncUnlockSystemObj(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, rgw::sal::RadosStore* _store, @@ -303,7 +303,7 @@ int RGWRadosSetOmapKeysCR::send_request(const DoutPrefixProvider *dpp) op.omap_set(entries); cn = stack->create_completion_notifier(); - return ref.pool.ioctx().aio_operate(ref.obj.oid, cn->completion(), &op); + return ref.ioctx.aio_operate(ref.obj.oid, cn->completion(), &op); } int RGWRadosSetOmapKeysCR::request_complete() @@ -341,7 +341,7 @@ int RGWRadosGetOmapKeysCR::send_request(const DoutPrefixProvider *dpp) { op.omap_get_keys2(marker, max_entries, &result->entries, &result->more, nullptr); cn = stack->create_completion_notifier(result); - return result->ref.pool.ioctx().aio_operate(result->ref.obj.oid, cn->completion(), &op, NULL); + return result->ref.ioctx.aio_operate(result->ref.obj.oid, cn->completion(), &op, NULL); } int RGWRadosGetOmapKeysCR::request_complete() @@ -379,7 +379,7 @@ int RGWRadosGetOmapValsCR::send_request(const DoutPrefixProvider *dpp) { op.omap_get_vals2(marker, max_entries, &result->entries, &result->more, nullptr); cn = stack->create_completion_notifier(result); - return result->ref.pool.ioctx().aio_operate(result->ref.obj.oid, cn->completion(), &op, NULL); + return result->ref.ioctx.aio_operate(result->ref.obj.oid, cn->completion(), &op, NULL); } int RGWRadosGetOmapValsCR::request_complete() @@ -414,7 +414,7 @@ int RGWRadosRemoveOmapKeysCR::send_request(const DoutPrefixProvider *dpp) { op.omap_rm_keys(keys); cn = stack->create_completion_notifier(); - return ref.pool.ioctx().aio_operate(ref.obj.oid, cn->completion(), &op); + return ref.ioctx.aio_operate(ref.obj.oid, cn->completion(), &op); } int RGWRadosRemoveOmapKeysCR::request_complete() @@ -1131,7 +1131,7 @@ int RGWRadosNotifyCR::send_request(const DoutPrefixProvider *dpp) set_status() << "sending request"; cn = stack->create_completion_notifier(); - return ref.pool.ioctx().aio_notify(ref.obj.oid, cn->completion(), request, + return ref.ioctx.aio_notify(ref.obj.oid, cn->completion(), request, timeout_ms, response); } diff --git a/src/rgw/driver/rados/rgw_cr_rados.h b/src/rgw/driver/rados/rgw_cr_rados.h index 676fd3d3cae..b9c45f30cf6 100644 --- a/src/rgw/driver/rados/rgw_cr_rados.h +++ b/src/rgw/driver/rados/rgw_cr_rados.h @@ -446,8 +446,7 @@ public: op.read(0, -1, &bl, nullptr); cn = stack->create_completion_notifier(); - return ref.pool.ioctx().aio_operate(ref.obj.oid, cn->completion(), &op, - nullptr); + return ref.ioctx.aio_operate(ref.obj.oid, cn->completion(), &op, nullptr); } int request_complete() { @@ -557,7 +556,7 @@ public: op.write_full(bl); cn = stack->create_completion_notifier(); - return ref.pool.ioctx().aio_operate(ref.obj.oid, cn->completion(), &op); + return ref.ioctx.aio_operate(ref.obj.oid, cn->completion(), &op); } int request_complete() override { @@ -624,7 +623,7 @@ public: return 0; } - return ref.pool.ioctx().aio_operate(ref.obj.oid, cn->completion(), &op); + return ref.ioctx.aio_operate(ref.obj.oid, cn->completion(), &op); } int request_complete() override { diff --git a/src/rgw/driver/rados/rgw_object_expirer_core.cc b/src/rgw/driver/rados/rgw_object_expirer_core.cc index 72c21c1d262..3f20ce26ba8 100644 --- a/src/rgw/driver/rados/rgw_object_expirer_core.cc +++ b/src/rgw/driver/rados/rgw_object_expirer_core.cc @@ -163,7 +163,7 @@ static int cls_timeindex_trim_repeat(const DoutPrefixProvider *dpp, do { librados::ObjectWriteOperation op; cls_timeindex_trim(op, from_time, to_time, from_marker, to_marker); - int r = rgw_rados_operate(dpp, ref.pool.ioctx(), oid, &op, null_yield); + int r = rgw_rados_operate(dpp, ref.ioctx, oid, &op, null_yield); if (r == -ENODATA) done = true; else if (r < 0) @@ -180,15 +180,17 @@ int RGWObjExpStore::objexp_hint_trim(const DoutPrefixProvider *dpp, const string& from_marker, const string& to_marker, optional_yield y) { - auto obj = rados_svc->obj(rgw_raw_obj(driver->svc()->zone->get_zone_params().log_pool, oid)); - int r = obj.open(dpp); - if (r < 0) { - ldpp_dout(dpp, 0) << "ERROR: " << __func__ << "(): failed to open obj=" << obj << " (r=" << r << ")" << dendl; - return r; + rgw_rados_ref ref; + auto ret = rgw_get_rados_ref(dpp, driver->getRados()->get_rados_handle(), + {driver->svc()->zone->get_zone_params().log_pool, oid}, + &ref); + if (ret < 0) { + ldpp_dout(dpp, 0) << "ERROR: " << __func__ << "(): failed to open oid=" + << oid << " (r=" << ret << ")" << dendl; + return ret; } - auto& ref = obj.get_ref(); - int ret = cls_timeindex_trim_repeat(dpp, ref, oid, utime_t(start_time), utime_t(end_time), - from_marker, to_marker, y); + ret = cls_timeindex_trim_repeat(dpp, ref, oid, utime_t(start_time), utime_t(end_time), + from_marker, to_marker, y); if ((ret < 0 ) && (ret != -ENOENT)) { return ret; } diff --git a/src/rgw/driver/rados/rgw_putobj_processor.cc b/src/rgw/driver/rados/rgw_putobj_processor.cc index 091adb9830c..14661935a77 100644 --- a/src/rgw/driver/rados/rgw_putobj_processor.cc +++ b/src/rgw/driver/rados/rgw_putobj_processor.cc @@ -553,7 +553,7 @@ int MultipartObjectProcessor::complete(size_t accounted_size, librados::ObjectWriteOperation op; cls_rgw_mp_upload_part_info_update(op, p, info); - r = rgw_rados_operate(rctx.dpp, meta_obj_ref.pool.ioctx(), meta_obj_ref.obj.oid, &op, rctx.y); + r = rgw_rados_operate(rctx.dpp, meta_obj_ref.ioctx, meta_obj_ref.obj.oid, &op, rctx.y); ldpp_dout(rctx.dpp, 20) << "Update meta: " << meta_obj_ref.obj.oid << " part " << p << " prefix " << info.manifest.get_prefix() << " return " << r << dendl; if (r == -EOPNOTSUPP) { @@ -567,7 +567,7 @@ int MultipartObjectProcessor::complete(size_t accounted_size, op = librados::ObjectWriteOperation{}; op.assert_exists(); // detect races with abort op.omap_set(m); - r = rgw_rados_operate(rctx.dpp, meta_obj_ref.pool.ioctx(), meta_obj_ref.obj.oid, &op, rctx.y); + r = rgw_rados_operate(rctx.dpp, meta_obj_ref.ioctx, meta_obj_ref.obj.oid, &op, rctx.y); } if (r < 0) { return r == -ENOENT ? -ERR_NO_SUCH_UPLOAD : r; diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index f9b7dfb65cb..d12d479be26 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -2422,25 +2422,19 @@ int RGWRados::get_obj_head_ref(const DoutPrefixProvider *dpp, const rgw_obj& obj, rgw_rados_ref *ref) { - get_obj_bucket_and_oid_loc(obj, ref->obj.oid, ref->obj.loc); - - rgw_pool pool; - if (!get_obj_data_pool(target_placement_rule, obj, &pool)) { - ldpp_dout(dpp, 0) << "ERROR: cannot get data pool for obj=" << obj << ", probably misconfiguration" << dendl; + rgw_raw_obj raw; + get_obj_bucket_and_oid_loc(obj, raw.oid, raw.loc); + if (!get_obj_data_pool(target_placement_rule, obj, &raw.pool)) { + ldpp_dout(dpp, 0) << "ERROR: cannot get data pool for obj=" << obj + << ", probably misconfiguration" << dendl; return -EIO; } - - ref->pool = svc.rados->pool(pool); - - int r = ref->pool.open(dpp, RGWSI_RADOS::OpenParams() - .set_mostly_omap(false)); + auto r = rgw_get_rados_ref(dpp, get_rados_handle(), raw, ref); if (r < 0) { - ldpp_dout(dpp, 0) << "ERROR: failed opening data pool (pool=" << pool << "); r=" << r << dendl; + ldpp_dout(dpp, 0) << "ERROR: failed opening data pool (pool=" + << raw.pool << "); r=" << r << dendl; return r; } - - ref->pool.ioctx().locator_set_key(ref->obj.loc); - return 0; } @@ -2452,24 +2446,18 @@ int RGWRados::get_obj_head_ref(const DoutPrefixProvider *dpp, return get_obj_head_ref(dpp, bucket_info.placement_rule, obj, ref); } -int RGWRados::get_raw_obj_ref(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj, rgw_rados_ref *ref) +int RGWRados::get_raw_obj_ref(const DoutPrefixProvider *dpp, rgw_raw_obj obj, rgw_rados_ref* ref) { - ref->obj = obj; - - if (ref->obj.oid.empty()) { - ref->obj.oid = obj.pool.to_str(); - ref->obj.pool = svc.zone->get_zone_params().domain_root; + if (obj.oid.empty()) { + obj.oid = obj.pool.to_str(); + obj.pool = svc.zone->get_zone_params().domain_root; } - ref->pool = svc.rados->pool(obj.pool); - int r = ref->pool.open(dpp, RGWSI_RADOS::OpenParams() - .set_mostly_omap(false)); + int r = rgw_get_rados_ref(dpp, get_rados_handle(), std::move(obj), ref); if (r < 0) { ldpp_dout(dpp, 0) << "ERROR: failed opening pool (pool=" << obj.pool << "); r=" << r << dendl; return r; } - ref->pool.ioctx().locator_set_key(ref->obj.loc); - return 0; } @@ -2678,10 +2666,10 @@ int RGWRados::fix_tail_obj_locator(const DoutPrefixProvider *dpp, continue; } - auto& ioctx = ref.pool.ioctx(); + auto& ioctx = ref.ioctx; get_obj_bucket_and_oid_loc(loc, oid, locator); - ref.pool.ioctx().locator_set_key(locator); + ref.ioctx.locator_set_key(locator); ldpp_dout(dpp, 20) << __func__ << ": key=" << key << " oid=" << oid << " locator=" << locator << dendl; @@ -3215,10 +3203,10 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si return r; } - auto& ioctx = ref.pool.ioctx(); + auto& ioctx = ref.ioctx; tracepoint(rgw_rados, operate_enter, req_id.c_str()); - r = rgw_rados_operate(rctx.dpp, ref.pool.ioctx(), ref.obj.oid, &op, rctx.y); + r = rgw_rados_operate(rctx.dpp, ref.ioctx, ref.obj.oid, &op, rctx.y); tracepoint(rgw_rados, operate_exit, req_id.c_str()); if (r < 0) { /* we can expect to get -ECANCELED if object was replaced under, or -ENOENT if was removed, or -EEXIST if it did not exist @@ -5740,7 +5728,7 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi store->remove_rgw_head_obj(op); - auto& ioctx = ref.pool.ioctx(); + auto& ioctx = ref.ioctx; r = rgw_rados_operate(dpp, ioctx, ref.obj.oid, &op, y); /* raced with another operation, object state is indeterminate */ @@ -5812,7 +5800,7 @@ int RGWRados::delete_raw_obj(const DoutPrefixProvider *dpp, const rgw_raw_obj& o ObjectWriteOperation op; op.remove(); - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, y); + r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y); if (r < 0) return r; @@ -6469,7 +6457,7 @@ int RGWRados::set_attrs(const DoutPrefixProvider *dpp, RGWObjectCtx* octx, RGWBu } struct timespec mtime_ts = real_clock::to_timespec(mtime); op.mtime2(&mtime_ts); - auto& ioctx = ref.pool.ioctx(); + auto& ioctx = ref.ioctx; r = rgw_rados_operate(dpp, ioctx, ref.obj.oid, &op, y); if (state) { if (r >= 0) { @@ -7282,7 +7270,7 @@ int RGWRados::obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bu return r; } - return rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, op, y); + return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, op, y); } int RGWRados::obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, ObjectReadOperation *op, optional_yield y) @@ -7295,7 +7283,7 @@ int RGWRados::obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bu bufferlist outbl; - return rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, op, &outbl, y); + return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, op, &outbl, y); } void RGWRados::olh_cancel_modification(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, @@ -7320,7 +7308,7 @@ void RGWRados::olh_cancel_modification(const DoutPrefixProvider *dpp, const RGWB ObjectWriteOperation op; bucket_index_guard_olh_op(dpp, state, op); op.rmxattr(attr_name.c_str()); - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, y); + r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y); if (r < 0) { if (r != -ENOENT && r != -ECANCELED) { ldpp_dout(dpp, 0) << __func__ << " target_obj=" << olh_obj << " rmxattr rgw_rados_operate() returned " << r << dendl; @@ -7336,7 +7324,7 @@ void RGWRados::olh_cancel_modification(const DoutPrefixProvider *dpp, const RGWB rm_op.cmpxattr(RGW_ATTR_OLH_INFO, CEPH_OSD_CMPXATTR_OP_EQ, bufferlist()); cls_obj_check_prefix_exist(rm_op, RGW_ATTR_OLH_PENDING_PREFIX, true); rm_op.remove(); - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &rm_op, y); + r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &rm_op, y); } if (r < 0 && (r != -ENOENT && r != -ECANCELED)) { ldpp_dout(dpp, 0) << __func__ << " target_obj=" << olh_obj << " olh rm rgw_rados_operate() returned " << r << dendl; @@ -7855,7 +7843,7 @@ int RGWRados::repair_olh(const DoutPrefixProvider *dpp, RGWObjState* state, cons if (r < 0) { return r; } - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, y); + r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y); if (r < 0) { ldpp_dout(dpp, 0) << "repair_olh failed to write olh attributes with " << cpp_strerror(r) << dendl; @@ -8076,7 +8064,7 @@ int RGWRados::apply_olh_log(const DoutPrefixProvider *dpp, } /* update olh object */ - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, y); + r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y); if (r < 0) { ldpp_dout(dpp, 0) << "ERROR: " << __func__ << ": could not apply olh update to oid \"" << ref.obj.oid << "\", r=" << r << dendl; return r; @@ -8154,7 +8142,7 @@ int RGWRados::clear_olh(const DoutPrefixProvider *dpp, cls_obj_check_prefix_exist(rm_op, RGW_ATTR_OLH_PENDING_PREFIX, true); /* fail if found one of these, pending modification */ rm_op.remove(); - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &rm_op, y); + r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &rm_op, y); if (r == -ECANCELED) { return r; /* someone else made a modification in the meantime */ } @@ -8442,7 +8430,7 @@ int RGWRados::remove_olh_pending_entries(const DoutPrefixProvider *dpp, const RG op.rmxattr(i->first.c_str()); } - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, y); + r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y); if (r == -ENOENT || r == -ECANCELED) { /* raced with some other change, shouldn't sweat about it */ return 0; @@ -8538,10 +8526,10 @@ int RGWRados::raw_obj_stat(const DoutPrefixProvider *dpp, op.read(0, cct->_conf->rgw_max_chunk_size, first_chunk, NULL); } bufferlist outbl; - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, &outbl, y); + r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, &outbl, y); if (epoch) { - *epoch = ref.pool.ioctx().get_last_version(); + *epoch = ref.ioctx.get_last_version(); } if (r < 0) @@ -8773,7 +8761,7 @@ int RGWRados::append_async(const DoutPrefixProvider *dpp, rgw_raw_obj& obj, size librados::Rados *rad = get_rados_handle(); librados::AioCompletion *completion = rad->aio_create_completion(nullptr, nullptr); - r = ref.pool.ioctx().aio_append(ref.obj.oid, completion, bl, size); + r = ref.ioctx.aio_append(ref.obj.oid, completion, bl, size); completion->release(); return r; } @@ -9847,7 +9835,7 @@ int RGWRados::cls_obj_usage_log_add(const DoutPrefixProvider *dpp, const string& ObjectWriteOperation op; cls_rgw_usage_log_add(op, info); - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, y); + r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y); return r; } @@ -9866,7 +9854,7 @@ int RGWRados::cls_obj_usage_log_read(const DoutPrefixProvider *dpp, const string *is_truncated = false; - r = cls_rgw_usage_log_read(ref.pool.ioctx(), ref.obj.oid, user, bucket, start_epoch, end_epoch, + r = cls_rgw_usage_log_read(ref.ioctx, ref.obj.oid, user, bucket, start_epoch, end_epoch, max_entries, read_iter, usage, is_truncated); return r; @@ -9878,7 +9866,7 @@ static int cls_rgw_usage_log_trim_repeat(const DoutPrefixProvider *dpp, rgw_rado do { librados::ObjectWriteOperation op; cls_rgw_usage_log_trim(op, user, bucket, start_epoch, end_epoch); - int r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, y); + int r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y); if (r == -ENODATA) done = true; else if (r < 0) @@ -9914,7 +9902,7 @@ int RGWRados::cls_obj_usage_log_clear(const DoutPrefixProvider *dpp, string& oid } librados::ObjectWriteOperation op; cls_rgw_usage_log_clear(op); - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, y); + r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y); return r; } @@ -10338,7 +10326,7 @@ int RGWRados::delete_raw_obj_aio(const DoutPrefixProvider *dpp, const rgw_raw_ob cls_rgw_remove_obj(op, prefixes); AioCompletion *c = librados::Rados::aio_create_completion(nullptr, nullptr); - ret = ref.pool.ioctx().aio_operate(ref.obj.oid, c, &op); + ret = ref.ioctx.aio_operate(ref.obj.oid, c, &op); if (ret < 0) { ldpp_dout(dpp, -1) << "ERROR: AioOperate failed with ret=" << ret << dendl; c->release(); @@ -10378,7 +10366,7 @@ int RGWRados::delete_obj_aio(const DoutPrefixProvider *dpp, const rgw_obj& obj, cls_rgw_remove_obj(op, prefixes); AioCompletion *c = librados::Rados::aio_create_completion(nullptr, nullptr); - ret = ref.pool.ioctx().aio_operate(ref.obj.oid, c, &op); + ret = ref.ioctx.aio_operate(ref.obj.oid, c, &op); if (ret < 0) { ldpp_dout(dpp, -1) << "ERROR: AioOperate failed with ret=" << ret << dendl; c->release(); diff --git a/src/rgw/driver/rados/rgw_rados.h b/src/rgw/driver/rados/rgw_rados.h index 183a5dbd272..938bc161a7e 100644 --- a/src/rgw/driver/rados/rgw_rados.h +++ b/src/rgw/driver/rados/rgw_rados.h @@ -576,7 +576,7 @@ public: } - int get_raw_obj_ref(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj, rgw_rados_ref *ref); + int get_raw_obj_ref(const DoutPrefixProvider *dpp, rgw_raw_obj obj, rgw_rados_ref *ref); int list_raw_objects_init(const DoutPrefixProvider *dpp, const rgw_pool& pool, const std::string& marker, RGWListRawObjsCtx *ctx); int list_raw_objects_next(const DoutPrefixProvider *dpp, const std::string& prefix_filter, int max, diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index c74fcb5b388..327980f4de6 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -1591,7 +1591,7 @@ int RadosObject::get_torrent_info(const DoutPrefixProvider* dpp, librados::ObjectReadOperation op; op.omap_get_vals_by_keys(keys, &result, nullptr); - ret = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, nullptr, y); + ret = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, nullptr, y); if (ret < 0) { return ret; } diff --git a/src/rgw/driver/rados/rgw_tools.cc b/src/rgw/driver/rados/rgw_tools.cc index 635e5ce887d..ec373ca6095 100644 --- a/src/rgw/driver/rados/rgw_tools.cc +++ b/src/rgw/driver/rados/rgw_tools.cc @@ -95,6 +95,24 @@ int rgw_init_ioctx(const DoutPrefixProvider *dpp, return 0; } +int rgw_get_rados_ref(const DoutPrefixProvider* dpp, librados::Rados* rados, + rgw_raw_obj obj, rgw_rados_ref* ref) +{ + ref->obj = std::move(obj); + + int r = rgw_init_ioctx(dpp, rados, ref->obj.pool, + ref->ioctx, true, false); + if (r < 0) { + ldpp_dout(dpp, 0) << "ERROR: creating ioctx (pool=" << ref->obj.pool + << "); r=" << r << dendl; + return r; + } + + ref->ioctx.locator_set_key(ref->obj.loc); + return 0; +} + + map* no_change_attrs() { static map no_change; return &no_change; diff --git a/src/rgw/driver/rados/rgw_tools.h b/src/rgw/driver/rados/rgw_tools.h index 607b064b177..32cc029d758 100644 --- a/src/rgw/driver/rados/rgw_tools.h +++ b/src/rgw/driver/rados/rgw_tools.h @@ -21,6 +21,12 @@ class optional_yield; struct obj_version; +struct rgw_rados_ref { + librados::IoCtx ioctx; + rgw_raw_obj obj; +}; +int rgw_get_rados_ref(const DoutPrefixProvider* dpp, librados::Rados* rados, + rgw_raw_obj obj, rgw_rados_ref* ref); int rgw_init_ioctx(const DoutPrefixProvider *dpp, librados::Rados *rados, const rgw_pool& pool, @@ -100,9 +106,31 @@ int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, con int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, const std::string& oid, librados::ObjectWriteOperation *op, optional_yield y, int flags = 0); +inline int rgw_rados_operate(const DoutPrefixProvider *dpp, + rgw_rados_ref& ref, + librados::ObjectReadOperation *op, bufferlist *pbl, + optional_yield y, int flags = 0) +{ + return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, op, pbl, y, flags); +} + +inline int rgw_rados_operate(const DoutPrefixProvider *dpp, + rgw_rados_ref& ref, + librados::ObjectWriteOperation *op, + optional_yield y, int flags = 0) +{ + return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, op, y, flags); +} + int rgw_rados_notify(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, const std::string& oid, bufferlist& bl, uint64_t timeout_ms, bufferlist* pbl, optional_yield y); +inline int rgw_rados_notify(const DoutPrefixProvider *dpp, rgw_rados_ref& ref, + bufferlist& bl, uint64_t timeout_ms, + bufferlist* pbl, optional_yield y) +{ + return rgw_rados_notify(dpp, ref.ioctx, ref.obj.oid, bl, timeout_ms, pbl, y); +} int rgw_tools_init(const DoutPrefixProvider *dpp, CephContext *cct); void rgw_tools_cleanup(); diff --git a/src/rgw/driver/rados/rgw_trim_bilog.cc b/src/rgw/driver/rados/rgw_trim_bilog.cc index 16ced4c2ac5..be6d990d962 100644 --- a/src/rgw/driver/rados/rgw_trim_bilog.cc +++ b/src/rgw/driver/rados/rgw_trim_bilog.cc @@ -270,18 +270,18 @@ class BucketTrimWatcher : public librados::WatchCtx2 { } // register a watch on the realm's control object - r = ref.pool.ioctx().watch2(ref.obj.oid, &handle, this); + r = ref.ioctx.watch2(ref.obj.oid, &handle, this); if (r == -ENOENT) { constexpr bool exclusive = true; - r = ref.pool.ioctx().create(ref.obj.oid, exclusive); + r = ref.ioctx.create(ref.obj.oid, exclusive); if (r == -EEXIST || r == 0) { - r = ref.pool.ioctx().watch2(ref.obj.oid, &handle, this); + r = ref.ioctx.watch2(ref.obj.oid, &handle, this); } } if (r < 0) { ldpp_dout(dpp, -1) << "Failed to watch " << ref.obj << " with " << cpp_strerror(-r) << dendl; - ref.pool.ioctx().close(); + ref.ioctx.close(); return r; } @@ -290,24 +290,24 @@ class BucketTrimWatcher : public librados::WatchCtx2 { } int restart() { - int r = ref.pool.ioctx().unwatch2(handle); + int r = ref.ioctx.unwatch2(handle); if (r < 0) { lderr(store->ctx()) << "Failed to unwatch on " << ref.obj << " with " << cpp_strerror(-r) << dendl; } - r = ref.pool.ioctx().watch2(ref.obj.oid, &handle, this); + r = ref.ioctx.watch2(ref.obj.oid, &handle, this); if (r < 0) { lderr(store->ctx()) << "Failed to restart watch on " << ref.obj << " with " << cpp_strerror(-r) << dendl; - ref.pool.ioctx().close(); + ref.ioctx.close(); } return r; } void stop() { if (handle) { - ref.pool.ioctx().unwatch2(handle); - ref.pool.ioctx().close(); + ref.ioctx.unwatch2(handle); + ref.ioctx.close(); } } @@ -332,7 +332,7 @@ class BucketTrimWatcher : public librados::WatchCtx2 { } catch (const buffer::error& e) { lderr(store->ctx()) << "Failed to decode notification: " << e.what() << dendl; } - ref.pool.ioctx().notify_ack(ref.obj.oid, notify_id, cookie, reply); + ref.ioctx.notify_ack(ref.obj.oid, notify_id, cookie, reply); } /// reestablish the watch if it gets disconnected diff --git a/src/rgw/driver/rados/sync_fairness.cc b/src/rgw/driver/rados/sync_fairness.cc index ded1cf56a71..1ac27f4bacc 100644 --- a/src/rgw/driver/rados/sync_fairness.cc +++ b/src/rgw/driver/rados/sync_fairness.cc @@ -144,18 +144,18 @@ class Watcher : public librados::WatchCtx2 { } // register a watch on the control object - r = ref.pool.ioctx().watch2(ref.obj.oid, &handle, this); + r = ref.ioctx.watch2(ref.obj.oid, &handle, this); if (r == -ENOENT) { constexpr bool exclusive = true; - r = ref.pool.ioctx().create(ref.obj.oid, exclusive); + r = ref.ioctx.create(ref.obj.oid, exclusive); if (r == -EEXIST || r == 0) { - r = ref.pool.ioctx().watch2(ref.obj.oid, &handle, this); + r = ref.ioctx.watch2(ref.obj.oid, &handle, this); } } if (r < 0) { ldpp_dout(dpp, -1) << "Failed to watch " << ref.obj << " with " << cpp_strerror(-r) << dendl; - ref.pool.ioctx().close(); + ref.ioctx.close(); return r; } @@ -165,16 +165,16 @@ class Watcher : public librados::WatchCtx2 { int restart() { - int r = ref.pool.ioctx().unwatch2(handle); + int r = ref.ioctx.unwatch2(handle); if (r < 0) { ldpp_dout(dpp, -1) << "Failed to unwatch on " << ref.obj << " with " << cpp_strerror(-r) << dendl; } - r = ref.pool.ioctx().watch2(ref.obj.oid, &handle, this); + r = ref.ioctx.watch2(ref.obj.oid, &handle, this); if (r < 0) { ldpp_dout(dpp, -1) << "Failed to restart watch on " << ref.obj << " with " << cpp_strerror(-r) << dendl; - ref.pool.ioctx().close(); + ref.ioctx.close(); } return r; } @@ -182,8 +182,8 @@ class Watcher : public librados::WatchCtx2 { void stop() { if (handle) { - ref.pool.ioctx().unwatch2(handle); - ref.pool.ioctx().close(); + ref.ioctx.unwatch2(handle); + ref.ioctx.close(); } } @@ -210,7 +210,7 @@ class Watcher : public librados::WatchCtx2 { bufferlist reply; encode(response, reply); - ref.pool.ioctx().notify_ack(ref.obj.oid, notify_id, cookie, reply); + ref.ioctx.notify_ack(ref.obj.oid, notify_id, cookie, reply); } // reestablish the watch if it gets disconnected @@ -289,7 +289,7 @@ class RadosBidManager : public BidManager, public Server, public DoutPrefix { my_bids = this->my_bids; } - bool is_highest_bidder(std::size_t index) + bool is_highest_bidder(std::size_t index) override { auto lock = std::scoped_lock{mutex}; const bid_value my_bid = my_bids.at(index); // may throw @@ -303,7 +303,7 @@ class RadosBidManager : public BidManager, public Server, public DoutPrefix { return true; } - RGWCoroutine* notify_cr() + RGWCoroutine* notify_cr() override { auto lock = std::scoped_lock{mutex}; return new NotifyCR(store, this, obj, my_bids); diff --git a/src/rgw/services/svc_cls.cc b/src/rgw/services/svc_cls.cc index 342146bfefa..44788940330 100644 --- a/src/rgw/services/svc_cls.cc +++ b/src/rgw/services/svc_cls.cc @@ -47,12 +47,15 @@ int RGWSI_Cls::MFA::get_mfa_obj(const DoutPrefixProvider *dpp, const rgw_user& u int RGWSI_Cls::MFA::get_mfa_ref(const DoutPrefixProvider *dpp, const rgw_user& user, rgw_rados_ref *ref) { - std::optional obj; - int r = get_mfa_obj(dpp, user, &obj); + string oid = get_mfa_oid(user); + rgw_raw_obj o(zone_svc->get_zone_params().otp_pool, oid); + + auto r = rgw_get_rados_ref(dpp, rados_svc->get_rados_handle(), o, ref); if (r < 0) { + ldpp_dout(dpp, 4) << "failed to open rados context for " << o << dendl; return r; } - *ref = obj->get_ref(); + return 0; } @@ -66,7 +69,7 @@ int RGWSI_Cls::MFA::check_mfa(const DoutPrefixProvider *dpp, const rgw_user& use rados::cls::otp::otp_check_t result; - r = rados::cls::otp::OTP::check(cct, ref.pool.ioctx(), ref.obj.oid, otp_id, pin, &result); + r = rados::cls::otp::OTP::check(cct, ref.ioctx, ref.obj.oid, otp_id, pin, &result); if (r < 0) return r; @@ -154,7 +157,7 @@ int RGWSI_Cls::MFA::get_mfa(const DoutPrefixProvider *dpp, const rgw_user& user, return r; } - r = rados::cls::otp::OTP::get(nullptr, ref.pool.ioctx(), ref.obj.oid, id, result); + r = rados::cls::otp::OTP::get(nullptr, ref.ioctx, ref.obj.oid, id, result); if (r < 0) { return r; } @@ -172,7 +175,7 @@ int RGWSI_Cls::MFA::list_mfa(const DoutPrefixProvider *dpp, const rgw_user& user return r; } - r = rados::cls::otp::OTP::get_all(nullptr, ref.pool.ioctx(), ref.obj.oid, result); + r = rados::cls::otp::OTP::get_all(nullptr, ref.ioctx, ref.obj.oid, result); if (r < 0) { return r; } @@ -190,7 +193,7 @@ int RGWSI_Cls::MFA::otp_get_current_time(const DoutPrefixProvider *dpp, const rg return r; } - r = rados::cls::otp::OTP::get_current_time(ref.pool.ioctx(), ref.obj.oid, result); + r = rados::cls::otp::OTP::get_current_time(ref.ioctx, ref.obj.oid, result); if (r < 0) { return r; } diff --git a/src/rgw/services/svc_cls.h b/src/rgw/services/svc_cls.h index d1d1d659be8..08d7cfffec6 100644 --- a/src/rgw/services/svc_cls.h +++ b/src/rgw/services/svc_cls.h @@ -23,6 +23,8 @@ #include "svc_rados.h" +#include "driver/rados/rgw_tools.h" + class RGWSI_Cls : public RGWServiceInstance { diff --git a/src/rgw/services/svc_rados.h b/src/rgw/services/svc_rados.h index ede029aa897..4e7cf672c7a 100644 --- a/src/rgw/services/svc_rados.h +++ b/src/rgw/services/svc_rados.h @@ -245,8 +245,6 @@ public: friend Pool::List; }; -using rgw_rados_ref = RGWSI_RADOS::rados_ref; - inline std::ostream& operator<<(std::ostream& out, const RGWSI_RADOS::Obj& obj) { return out << obj.get_raw_obj(); }