From b4f6867f801f6482a1cfe99ea42214d5e1501469 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 22 Nov 2016 10:33:12 -0800 Subject: [PATCH] rgw: fix ECANCELED handling in rgw_get_system_obj() Fixes: http://tracker.ceph.com/issues/17996 Signed-off-by: Yehuda Sadeh (cherry picked from commit e67a3b5b5c63ee3a34f06bdbe91d3256c6660a89) Conflicts: src/rgw/rgw_rados.cc: used ctx.invalidate(obj) instead of ctx.raw.invalidate(obj) in RGWRados::SystemObject::invalidate_state() --- src/cls/version/cls_version_types.h | 5 +++++ src/rgw/rgw_rados.cc | 5 +++++ src/rgw/rgw_rados.h | 2 ++ src/rgw/rgw_tools.cc | 13 +++++++++++++ 4 files changed, 25 insertions(+) diff --git a/src/cls/version/cls_version_types.h b/src/cls/version/cls_version_types.h index 4b77e5dd26d3c..22ae0779ea308 100644 --- a/src/cls/version/cls_version_types.h +++ b/src/cls/version/cls_version_types.h @@ -31,6 +31,11 @@ struct obj_version { ver++; } + void clear() { + ver = 0; + tag.clear(); + } + bool empty() { return tag.empty(); } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 686e72f501bfc..2220e42ec3bed 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -8550,6 +8550,11 @@ void RGWRados::Object::invalidate_state() ctx.invalidate(obj); } +void RGWRados::SystemObject::invalidate_state() +{ + ctx.invalidate(obj); +} + int RGWRados::Object::prepare_atomic_modification(ObjectWriteOperation& op, bool reset_obj, const string *ptag, const char *if_match, const char *if_nomatch, bool removal_op) { diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 0c659c32f7b02..b8cac75d22dee 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2164,6 +2164,8 @@ public: public: SystemObject(RGWRados *_store, RGWObjectCtx& _ctx, rgw_obj& _obj) : store(_store), ctx(_ctx), obj(_obj), state(NULL) {} + void invalidate_state(); + RGWRados *get_store() { return store; } rgw_obj& get_obj() { return obj; } RGWObjectCtx& get_ctx() { return ctx; } diff --git a/src/rgw/rgw_tools.cc b/src/rgw/rgw_tools.cc index 857e3a4b4b6e9..3b2620e5820fd 100644 --- a/src/rgw/rgw_tools.cc +++ b/src/rgw/rgw_tools.cc @@ -47,6 +47,11 @@ int rgw_get_system_obj(RGWRados *rgwstore, RGWObjectCtx& obj_ctx, rgw_bucket& bu int request_len = READ_CHUNK_LEN; rgw_obj obj(bucket, key); + obj_version original_readv; + if (objv_tracker && !objv_tracker->read_version.empty()) { + original_readv = objv_tracker->read_version; + } + do { RGWRados::SystemObject source(rgwstore, obj_ctx, obj); RGWRados::SystemObject::Read rop(&source); @@ -64,6 +69,14 @@ int rgw_get_system_obj(RGWRados *rgwstore, RGWObjectCtx& obj_ctx, rgw_bucket& bu ret = rop.read(0, request_len - 1, bl, objv_tracker, refresh_version); if (ret == -ECANCELED) { /* raced, restart */ + if (!original_readv.empty()) { + /* we were asked to read a specific obj_version, failed */ + return ret; + } + if (objv_tracker) { + objv_tracker->read_version.clear(); + } + source.invalidate_state(); continue; } if (ret < 0) -- 2.39.5