From 5403c85ae5fc2e8ffd8970a76a2dcd6d253460f3 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Tue, 13 Oct 2020 09:54:56 -0400 Subject: [PATCH] rgw: system objects can set exclusive on set_attrs() Signed-off-by: Casey Bodley --- src/rgw/services/svc_sys_obj.cc | 4 ++-- src/rgw/services/svc_sys_obj_cache.cc | 4 ++-- src/rgw/services/svc_sys_obj_cache.h | 2 +- src/rgw/services/svc_sys_obj_core.cc | 5 ++++- src/rgw/services/svc_sys_obj_core.h | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) 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); -- 2.39.5