From 3f573eefe20265b5fc0bb5a3cc954859ccc67f3d Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Tue, 4 Sep 2018 16:50:22 -0400 Subject: [PATCH] rgw: RGWAsyncPutSystemObjAttrs does not access coroutine memory also exposes optional objv_tracker to RGWSimpleRadosWriteAttrsCR Signed-off-by: Casey Bodley (cherry picked from commit b01b3952db4c45feb98dbc7e224ca1982c224c72) --- src/rgw/rgw_cr_rados.cc | 8 ++++---- src/rgw/rgw_cr_rados.h | 32 +++++++++++++++++--------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/rgw/rgw_cr_rados.cc b/src/rgw/rgw_cr_rados.cc index 37cd1ea0c229..410cbfb48b1d 100644 --- a/src/rgw/rgw_cr_rados.cc +++ b/src/rgw/rgw_cr_rados.cc @@ -138,14 +138,14 @@ RGWAsyncPutSystemObj::RGWAsyncPutSystemObj(RGWCoroutine *caller, RGWAioCompletio int RGWAsyncPutSystemObjAttrs::_send_request() { - return store->system_obj_set_attrs(NULL, obj, *attrs, NULL, objv_tracker); + return store->system_obj_set_attrs(nullptr, obj, attrs, nullptr, &objv_tracker); } RGWAsyncPutSystemObjAttrs::RGWAsyncPutSystemObjAttrs(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, RGWRados *_store, RGWObjVersionTracker *_objv_tracker, const rgw_raw_obj& _obj, - map *_attrs) : RGWAsyncRadosRequest(caller, cn), store(_store), - objv_tracker(_objv_tracker), obj(_obj), - attrs(_attrs) + map _attrs) + : RGWAsyncRadosRequest(caller, cn), store(_store), + obj(_obj), attrs(std::move(_attrs)) { } diff --git a/src/rgw/rgw_cr_rados.h b/src/rgw/rgw_cr_rados.h index a588b86f64a6..f26d59881c71 100644 --- a/src/rgw/rgw_cr_rados.h +++ b/src/rgw/rgw_cr_rados.h @@ -138,16 +138,17 @@ public: class RGWAsyncPutSystemObjAttrs : public RGWAsyncRadosRequest { RGWRados *store; - RGWObjVersionTracker *objv_tracker; rgw_raw_obj obj; - map *attrs; + map attrs; protected: int _send_request() override; public: RGWAsyncPutSystemObjAttrs(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, RGWRados *_store, RGWObjVersionTracker *_objv_tracker, const rgw_raw_obj& _obj, - map *_attrs); + map _attrs); + + RGWObjVersionTracker objv_tracker; }; class RGWAsyncLockSystemObj : public RGWAsyncRadosRequest { @@ -333,21 +334,19 @@ public: class RGWSimpleRadosWriteAttrsCR : public RGWSimpleCoroutine { RGWAsyncRadosProcessor *async_rados; RGWRados *store; - + RGWObjVersionTracker *objv_tracker; rgw_raw_obj obj; - map attrs; - - RGWAsyncPutSystemObjAttrs *req; + RGWAsyncPutSystemObjAttrs *req = nullptr; public: - RGWSimpleRadosWriteAttrsCR(RGWAsyncRadosProcessor *_async_rados, RGWRados *_store, - const rgw_raw_obj& _obj, - map& _attrs) : RGWSimpleCoroutine(_store->ctx()), - async_rados(_async_rados), - store(_store), - obj(_obj), - attrs(_attrs), req(NULL) { + RGWSimpleRadosWriteAttrsCR(RGWAsyncRadosProcessor *_async_rados, + RGWRados *_store, const rgw_raw_obj& _obj, + map _attrs, + RGWObjVersionTracker *objv_tracker = nullptr) + : RGWSimpleCoroutine(_store->ctx()), async_rados(_async_rados), + store(_store), objv_tracker(objv_tracker), obj(_obj), + attrs(std::move(_attrs)) { } ~RGWSimpleRadosWriteAttrsCR() override { request_cleanup(); @@ -362,12 +361,15 @@ public: int send_request() override { req = new RGWAsyncPutSystemObjAttrs(this, stack->create_completion_notifier(), - store, NULL, obj, &attrs); + store, objv_tracker, obj, std::move(attrs)); async_rados->queue(req); return 0; } int request_complete() override { + if (objv_tracker) { // copy the updated version + *objv_tracker = req->objv_tracker; + } return req->get_ret_status(); } }; -- 2.47.3