]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: system objects can set exclusive on set_attrs()
authorCasey Bodley <cbodley@redhat.com>
Tue, 13 Oct 2020 13:54:56 +0000 (09:54 -0400)
committerCasey Bodley <cbodley@redhat.com>
Fri, 27 May 2022 19:47:31 +0000 (15:47 -0400)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/services/svc_sys_obj.cc
src/rgw/services/svc_sys_obj_cache.cc
src/rgw/services/svc_sys_obj_cache.h
src/rgw/services/svc_sys_obj_core.cc
src/rgw/services/svc_sys_obj_core.h

index 771a0169ac28999a7c13c5f48cee8e72b4b5e872..5330f435d234f53469b7e4b2a3eb48ab8404c261 100644 (file)
@@ -100,7 +100,7 @@ int RGWSI_SysObj::Obj::WOp::write_attrs(const DoutPrefixProvider *dpp, optional_
   RGWSI_SysObj_Core *svc = source.core_svc;
   rgw_raw_obj& obj = source.get_obj();
 
-  return svc->set_attrs(dpp, obj, attrs, nullptr, objv_tracker, y);
+  return svc->set_attrs(dpp, obj, attrs, nullptr, objv_tracker, exclusive, y);
 }
 
 int RGWSI_SysObj::Obj::WOp::write_attr(const DoutPrefixProvider *dpp, const char *name, bufferlist& bl,
@@ -112,7 +112,7 @@ int RGWSI_SysObj::Obj::WOp::write_attr(const DoutPrefixProvider *dpp, const char
   map<string, bufferlist> m;
   m[name] = bl;
 
-  return svc->set_attrs(dpp, obj, m, nullptr, objv_tracker, y);
+  return svc->set_attrs(dpp, obj, m, nullptr, objv_tracker, exclusive, y);
 }
 
 int RGWSI_SysObj::Pool::list_prefixed_objs(const DoutPrefixProvider *dpp, const string& prefix, std::function<void(const string&)> cb)
index 3453f43e16ad1b0c0e0be5f9d59cad63ead29012..b64a6a9a491fbcf8ff0967fc65c4fa015ece6573 100644 (file)
@@ -248,7 +248,7 @@ int RGWSI_SysObj_Cache::set_attrs(const DoutPrefixProvider *dpp,
                                   map<string, bufferlist>& attrs,
                                   map<string, bufferlist> *rmattrs,
                                   RGWObjVersionTracker *objv_tracker,
-                                  optional_yield y)
+                                  bool exclusive, optional_yield y)
 {
   rgw_pool pool;
   string oid;
@@ -260,7 +260,7 @@ int RGWSI_SysObj_Cache::set_attrs(const DoutPrefixProvider *dpp,
   }
   info.status = 0;
   info.flags = CACHE_FLAG_MODIFY_XATTRS;
-  int ret = RGWSI_SysObj_Core::set_attrs(dpp, obj, attrs, rmattrs, objv_tracker, y);
+  int ret = RGWSI_SysObj_Core::set_attrs(dpp, obj, attrs, rmattrs, objv_tracker, exclusive, y);
   string name = normal_name(pool, oid);
   if (ret >= 0) {
     if (objv_tracker && objv_tracker->read_version.ver) {
index 3999d514da0032029e93f2afe54917052a7143e0..2bd89d45e2ab870d127f99ef706dd77d4de5c2fb 100644 (file)
@@ -62,7 +62,7 @@ protected:
                 std::map<std::string, bufferlist>& attrs,
                 std::map<std::string, bufferlist> *rmattrs,
                 RGWObjVersionTracker *objv_tracker,
-                optional_yield y);
+                bool exclusive, optional_yield y) override;
 
   int remove(const DoutPrefixProvider *dpp, 
              RGWSysObjectCtxBase& obj_ctx,
index e673fdb86f9aa43b124f35527de746c4e0ada09f..e0b38dc03c04172d6aff79cc230ecc47441c41f8 100644 (file)
@@ -305,7 +305,7 @@ int RGWSI_SysObj_Core::set_attrs(const DoutPrefixProvider *dpp,
                                  map<string, bufferlist>& attrs,
                                  map<string, bufferlist> *rmattrs,
                                  RGWObjVersionTracker *objv_tracker,
-                                 optional_yield y)
+                                 bool exclusive, optional_yield y)
 {
   RGWSI_RADOS::Obj rados_obj;
   int r = get_rados_obj(dpp, zone_svc, obj, &rados_obj);
@@ -316,6 +316,9 @@ int RGWSI_SysObj_Core::set_attrs(const DoutPrefixProvider *dpp,
 
   librados::ObjectWriteOperation op;
 
+  if (exclusive) {
+    op.create(true); // exclusive create
+  }
   if (objv_tracker) {
     objv_tracker->prepare_op_for_write(&op);
   }
index 7a6ffce0e028ab742c35826e8d425a5e9920a0e6..179e31633748c183eb6566626869bd3fcdfc81f3 100644 (file)
@@ -82,7 +82,7 @@ protected:
                         std::map<std::string, bufferlist>& attrs,
                         std::map<std::string, bufferlist> *rmattrs,
                         RGWObjVersionTracker *objv_tracker,
-                        optional_yield y);
+                        bool exclusive, optional_yield y);
 
   virtual int omap_get_all(const DoutPrefixProvider *dpp, const rgw_raw_obj& obj, std::map<std::string, bufferlist> *m,
                            optional_yield y);