From e20987c8e35e41b66aa7f770e18d1365ea45580e Mon Sep 17 00:00:00 2001 From: fang yuxiang Date: Thu, 11 Jan 2018 15:27:25 +0800 Subject: [PATCH] rgw: multipart abort if upload meta object doesn't exist Signed-off-by: fang yuxiang fang.yuxiang@eisoo.com --- src/rgw/rgw_op.cc | 5 ++--- src/rgw/rgw_rados.cc | 19 ++++++++++++------- src/rgw/rgw_rados.h | 4 ++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 04d7e31d223..73a588dd18e 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -3129,9 +3129,8 @@ int RGWPutObjProcessor_Multipart::do_complete(size_t accounted_size, rgw_raw_obj raw_meta_obj; store->obj_to_raw(s->bucket_info.placement_rule, meta_obj, &raw_meta_obj); - - r = store->omap_set(raw_meta_obj, p, bl); - + const bool must_exist = true;// detect races with abort + r = store->omap_set(raw_meta_obj, p, bl, must_exist); return r; } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index a6274691ff9..b51ba0c60b6 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -12169,7 +12169,7 @@ int RGWRados::omap_get_all(rgw_raw_obj& obj, bufferlist& header, return 0; } -int RGWRados::omap_set(rgw_raw_obj& obj, const std::string& key, bufferlist& bl) +int RGWRados::omap_set(rgw_raw_obj& obj, const std::string& key, bufferlist& bl, bool must_exist) { rgw_rados_ref ref; int r = get_raw_obj_ref(obj, &ref); @@ -12180,13 +12180,15 @@ int RGWRados::omap_set(rgw_raw_obj& obj, const std::string& key, bufferlist& bl) map m; m[key] = bl; - - r = ref.ioctx.omap_set(ref.oid, m); - + ObjectWriteOperation op; + if (must_exist) + op.assert_exists(); + op.omap_set(m); + r = ref.ioctx.operate(ref.oid, &op); return r; } -int RGWRados::omap_set(rgw_raw_obj& obj, std::map& m) +int RGWRados::omap_set(rgw_raw_obj& obj, std::map& m, bool must_exist) { rgw_rados_ref ref; int r = get_raw_obj_ref(obj, &ref); @@ -12194,8 +12196,11 @@ int RGWRados::omap_set(rgw_raw_obj& obj, std::map& m) return r; } - r = ref.ioctx.omap_set(ref.oid, m); - + ObjectWriteOperation op; + if (must_exist) + op.assert_exists(); + op.omap_set(m); + r = ref.ioctx.operate(ref.oid, &op); return r; } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 2b9b9c468ca..515fe1c955d 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -3364,8 +3364,8 @@ public: int omap_get_vals(rgw_raw_obj& obj, bufferlist& header, const std::string& marker, uint64_t count, std::map& m); int omap_get_all(rgw_raw_obj& obj, bufferlist& header, std::map& m); - int omap_set(rgw_raw_obj& obj, const std::string& key, bufferlist& bl); - int omap_set(rgw_raw_obj& obj, map& m); + int omap_set(rgw_raw_obj& obj, const std::string& key, bufferlist& bl, bool must_exist = false); + int omap_set(rgw_raw_obj& obj, map& m, bool must_exist = false); int omap_del(rgw_raw_obj& obj, const std::string& key); int update_containers_stats(map& m); int append_async(rgw_raw_obj& obj, size_t size, bufferlist& bl); -- 2.39.5