]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: make rgw_sync_pipe_params::user optional
authorSeena Fallah <seenafallah@gmail.com>
Tue, 1 Apr 2025 15:28:10 +0000 (17:28 +0200)
committerSeena Fallah <seenafallah@gmail.com>
Mon, 28 Apr 2025 16:56:06 +0000 (18:56 +0200)
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 <seenafallah@gmail.com>
src/rgw/driver/rados/rgw_cr_rados.cc
src/rgw/radosgw-admin/radosgw-admin.cc
src/rgw/rgw_sync_policy.cc
src/rgw/rgw_sync_policy.h

index 6e00e02721c3b5eadf160e3421b58397d9ff2561..7c65b59d3a91ca65d167fce5e3a0d058752c75df 100644 (file)
@@ -950,21 +950,21 @@ int RGWAsyncRemoveObj::_send_request(const DoutPrefixProvider *dpp)
     std::optional<RGWUserPermHandler> 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;
     }
 
index e86a79cfdc662073994490bb58f1053fbf05aeff..553ab371c89dc1f77e5e36a5e3e28118756fa3dd 100644 (file)
@@ -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;
     }
index 129d11a1f8fc6a153990348809c40c8bb56fbd8b..f40ba83d170e2ed026b787cdfd63b46b2e146946 100644 (file)
@@ -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)
index 78b4eb31ea4b41d13f9e49b70a0ba3fb97a90eb9..76eed9f1896d33044105fb4f7951167a96a34987 100644 (file)
@@ -342,7 +342,7 @@ struct rgw_sync_pipe_params {
     MODE_USER = 1,
   } mode{MODE_SYSTEM};
   int32_t priority{0};
-  rgw_user user;
+  std::optional<rgw_user> 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);
   }