From: Seena Fallah Date: Tue, 1 Apr 2025 15:28:10 +0000 (+0200) Subject: rgw: make rgw_sync_pipe_params::user optional X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=c8aca216f7d186e4e8391a284d14948afd414957;p=ceph.git rgw: make rgw_sync_pipe_params::user optional In rgw_sync_pipe_params, the mode can be either system or user. When in system mode, no user is involved, but the current implementation holds an empty rgw_user, which can cause confusion in pipe_rules::find_basic_info_without_tags(). With this change, rgw_user is now optional, ensuring that when no user is involved, it is explicitly nullopt rather than an empty object. Signed-off-by: Seena Fallah --- diff --git a/src/rgw/driver/rados/rgw_cr_rados.cc b/src/rgw/driver/rados/rgw_cr_rados.cc index 6e00e02721c3b..7c65b59d3a91c 100644 --- a/src/rgw/driver/rados/rgw_cr_rados.cc +++ b/src/rgw/driver/rados/rgw_cr_rados.cc @@ -950,21 +950,21 @@ int RGWAsyncRemoveObj::_send_request(const DoutPrefixProvider *dpp) std::optional user_perms; RGWUserPermHandler::Bucket dest_bucket_perms; - if (params.user.empty()) { + if (!params.user.has_value()) { ldpp_dout(dpp, 20) << "ERROR: " << __func__ << ": user level sync but user param not set" << dendl; return -EPERM; } - user_perms.emplace(dpp, store, dpp->get_cct(), params.user); + user_perms.emplace(dpp, store, dpp->get_cct(), *params.user); ret = user_perms->init(); if (ret < 0) { - ldpp_dout(dpp, 0) << "ERROR: " << __func__ << ": failed to init user perms for uid=" << params.user << " ret=" << ret << dendl; + ldpp_dout(dpp, 0) << "ERROR: " << __func__ << ": failed to init user perms for uid=" << *params.user << " ret=" << ret << dendl; return ret; } ret = user_perms->init_bucket(sync_pipe.dest_bucket_info, sync_pipe.dest_bucket_attrs, &dest_bucket_perms); if (ret < 0) { - ldpp_dout(dpp, 0) << "ERROR: " << __func__ << ": failed to init bucket perms for uid=" << params.user << " bucket=" << bucket->get_key() << " ret=" << ret << dendl; + ldpp_dout(dpp, 0) << "ERROR: " << __func__ << ": failed to init bucket perms for uid=" << *params.user << " bucket=" << bucket->get_key() << " ret=" << ret << dendl; return ret; } diff --git a/src/rgw/radosgw-admin/radosgw-admin.cc b/src/rgw/radosgw-admin/radosgw-admin.cc index e86a79cfdc662..553ab371c89dc 100644 --- a/src/rgw/radosgw-admin/radosgw-admin.cc +++ b/src/rgw/radosgw-admin/radosgw-admin.cc @@ -10716,7 +10716,7 @@ next: if (!rgw::sal::User::empty(user)) { pipe->params.user = user->get_id(); } else if (pipe->params.mode == rgw_sync_pipe_params::MODE_USER && - pipe->params.user.empty()) { + !pipe->params.user.has_value()) { cerr << "ERROR: missing --uid for --mode=user" << std::endl; return EINVAL; } diff --git a/src/rgw/rgw_sync_policy.cc b/src/rgw/rgw_sync_policy.cc index 129d11a1f8fc6..f40ba83d170e2 100644 --- a/src/rgw/rgw_sync_policy.cc +++ b/src/rgw/rgw_sync_policy.cc @@ -635,7 +635,9 @@ void rgw_sync_pipe_params::dump(Formatter *f) const s = "user"; } encode_json("mode", s, f); - encode_json("user", user, f); + if (user) { + encode_json("user", *user, f); + } } void rgw_sync_pipe_params::decode_json(JSONObj *obj) diff --git a/src/rgw/rgw_sync_policy.h b/src/rgw/rgw_sync_policy.h index 78b4eb31ea4b4..76eed9f1896d3 100644 --- a/src/rgw/rgw_sync_policy.h +++ b/src/rgw/rgw_sync_policy.h @@ -342,7 +342,7 @@ struct rgw_sync_pipe_params { MODE_USER = 1, } mode{MODE_SYSTEM}; int32_t priority{0}; - rgw_user user; + std::optional user; void encode(bufferlist& bl) const { ENCODE_START(1, 1, bl); @@ -350,7 +350,7 @@ struct rgw_sync_pipe_params { encode(dest, bl); encode(priority, bl); encode((uint8_t)mode, bl); - encode(user, bl); + encode(user.value_or(rgw_user()), bl); ENCODE_FINISH(bl); } @@ -362,7 +362,13 @@ struct rgw_sync_pipe_params { uint8_t m; decode(m, bl); mode = (Mode)m; - decode(user, bl); + { // decode user + rgw_user _user; + decode(_user, bl); + if (!_user.empty()) { + user = _user; + } + } DECODE_FINISH(bl); }