]> 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>
Thu, 4 Feb 2021 21:11:30 +0000 (16:11 -0500)
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 b03f339ff7b54bd542fd182ffbad8a561902f12f..e1772a25df33afed258789f862b11f9cdc1689a9 100644 (file)
@@ -96,7 +96,7 @@ int RGWSI_SysObj::Obj::WOp::write_attrs(optional_yield y)
   RGWSI_SysObj_Core *svc = source.core_svc;
   rgw_raw_obj& obj = source.get_obj();
 
-  return svc->set_attrs(obj, attrs, nullptr, objv_tracker, y);
+  return svc->set_attrs(obj, attrs, nullptr, objv_tracker, exclusive, y);
 }
 
 int RGWSI_SysObj::Obj::WOp::write_attr(const char *name, bufferlist& bl,
@@ -108,7 +108,7 @@ int RGWSI_SysObj::Obj::WOp::write_attr(const char *name, bufferlist& bl,
   map<string, bufferlist> m;
   m[name] = bl;
 
-  return svc->set_attrs(obj, m, nullptr, objv_tracker, y);
+  return svc->set_attrs(obj, m, nullptr, objv_tracker, exclusive, y);
 }
 
 int RGWSI_SysObj::Pool::list_prefixed_objs(const string& prefix, std::function<void(const string&)> cb)
index ad67f29e0318c196b509b0fc31dfe27c5d4c2516..3e1280bce2e6960ba7b8ac8444e3405589ef00bc 100644 (file)
@@ -241,7 +241,7 @@ int RGWSI_SysObj_Cache::set_attrs(const rgw_raw_obj& obj,
                                   map<string, bufferlist>& attrs,
                                   map<string, bufferlist> *rmattrs,
                                   RGWObjVersionTracker *objv_tracker,
-                                  optional_yield y)
+                                  bool exclusive, optional_yield y)
 {
   rgw_pool pool;
   string oid;
@@ -253,7 +253,7 @@ int RGWSI_SysObj_Cache::set_attrs(const rgw_raw_obj& obj,
   }
   info.status = 0;
   info.flags = CACHE_FLAG_MODIFY_XATTRS;
-  int ret = RGWSI_SysObj_Core::set_attrs(obj, attrs, rmattrs, objv_tracker, y);
+  int ret = RGWSI_SysObj_Core::set_attrs(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 a0184e89df2bdb294a150c9b4def9aec03a75936..f8fee1806ecf4445d5e8dfb593c430e0b102f8ab 100644 (file)
@@ -59,7 +59,7 @@ protected:
                 map<string, bufferlist>& attrs,
                 map<string, bufferlist> *rmattrs,
                 RGWObjVersionTracker *objv_tracker,
-                optional_yield y);
+                bool exclusive, optional_yield y) override;
 
   int remove(RGWSysObjectCtxBase& obj_ctx,
              RGWObjVersionTracker *objv_tracker,
index dee172b5f42bb582108f6fbc348efe2dc5de8113..a20ee53fc227ca9f3c55944354c0a7e3ac8e0fd6 100644 (file)
@@ -298,7 +298,7 @@ int RGWSI_SysObj_Core::set_attrs(const rgw_raw_obj& obj,
                                  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(zone_svc, obj, &rados_obj);
@@ -309,6 +309,9 @@ int RGWSI_SysObj_Core::set_attrs(const rgw_raw_obj& obj,
 
   librados::ObjectWriteOperation op;
 
+  if (exclusive) {
+    op.create(true); // exclusive create
+  }
   if (objv_tracker) {
     objv_tracker->prepare_op_for_write(&op);
   }
index 39a4f34a5518c2627650cbc483e0313a7a504840..b227ee9ecfe7d250d0f8a6377cc5e69af396901f 100644 (file)
@@ -76,7 +76,7 @@ protected:
                         map<string, bufferlist>& attrs,
                         map<string, bufferlist> *rmattrs,
                         RGWObjVersionTracker *objv_tracker,
-                        optional_yield y);
+                        bool exclusive, optional_yield y);
 
   virtual int omap_get_all(const rgw_raw_obj& obj, std::map<string, bufferlist> *m,
                            optional_yield y);