From: Casey Bodley Date: Tue, 13 Oct 2020 13:54:56 +0000 (-0400) Subject: rgw: system objects can set exclusive on set_attrs() X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=de2c3af04333c6a821c1ee73dc20ca1f0880edef;p=ceph.git rgw: system objects can set exclusive on set_attrs() Signed-off-by: Casey Bodley --- diff --git a/src/rgw/services/svc_sys_obj.cc b/src/rgw/services/svc_sys_obj.cc index 771a0169ac289..5330f435d234f 100644 --- a/src/rgw/services/svc_sys_obj.cc +++ b/src/rgw/services/svc_sys_obj.cc @@ -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 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 cb) diff --git a/src/rgw/services/svc_sys_obj_cache.cc b/src/rgw/services/svc_sys_obj_cache.cc index 3453f43e16ad1..b64a6a9a491fb 100644 --- a/src/rgw/services/svc_sys_obj_cache.cc +++ b/src/rgw/services/svc_sys_obj_cache.cc @@ -248,7 +248,7 @@ int RGWSI_SysObj_Cache::set_attrs(const DoutPrefixProvider *dpp, map& attrs, map *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) { diff --git a/src/rgw/services/svc_sys_obj_cache.h b/src/rgw/services/svc_sys_obj_cache.h index 3999d514da003..2bd89d45e2ab8 100644 --- a/src/rgw/services/svc_sys_obj_cache.h +++ b/src/rgw/services/svc_sys_obj_cache.h @@ -62,7 +62,7 @@ protected: std::map& attrs, std::map *rmattrs, RGWObjVersionTracker *objv_tracker, - optional_yield y); + bool exclusive, optional_yield y) override; int remove(const DoutPrefixProvider *dpp, RGWSysObjectCtxBase& obj_ctx, diff --git a/src/rgw/services/svc_sys_obj_core.cc b/src/rgw/services/svc_sys_obj_core.cc index e673fdb86f9aa..e0b38dc03c041 100644 --- a/src/rgw/services/svc_sys_obj_core.cc +++ b/src/rgw/services/svc_sys_obj_core.cc @@ -305,7 +305,7 @@ int RGWSI_SysObj_Core::set_attrs(const DoutPrefixProvider *dpp, map& attrs, map *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); } diff --git a/src/rgw/services/svc_sys_obj_core.h b/src/rgw/services/svc_sys_obj_core.h index 7a6ffce0e028a..179e31633748c 100644 --- a/src/rgw/services/svc_sys_obj_core.h +++ b/src/rgw/services/svc_sys_obj_core.h @@ -82,7 +82,7 @@ protected: std::map& attrs, std::map *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 *m, optional_yield y);