diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-12 23:08:25 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-12 23:08:25 -0700 |
commit | 0b491e9a6de57cd2557bd1b9ee16c58c98b2729e (patch) | |
tree | c6c82fdecb5359e9fe4ce065c2b45386f53a67c5 | |
parent | bcdd4755f37a14c8aa71876509f35af044d112b2 (diff) | |
download | ceph-0b491e9a6de57cd2557bd1b9ee16c58c98b2729e.tar.gz |
rgw: separate req_state from object put processors
At least, for most of them. We'll move this code to rgw_rados.cc,
and we don't want it to have req_state.
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_op.cc | 79 | ||||
-rw-r--r-- | src/rgw/rgw_op.h | 8 |
2 files changed, 48 insertions, 39 deletions
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 67fd3db98e0..e8c29987e47 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1035,40 +1035,40 @@ RGWPutObjProcessor::~RGWPutObjProcessor() if (is_complete) return; - if (!s) - return; - list<rgw_obj>::iterator iter; for (iter = objs.begin(); iter != objs.end(); ++iter) { rgw_obj& obj = *iter; - int r = store->delete_obj(s->obj_ctx, obj); + int r = store->delete_obj(obj_ctx, obj); if (r < 0 && r != -ENOENT) { - ldout(s->cct, 0) << "WARNING: failed to remove obj (" << obj << "), leaked" << dendl; + ldout(store->ctx(), 0) << "WARNING: failed to remove obj (" << obj << "), leaked" << dendl; } } } class RGWPutObjProcessor_Plain : public RGWPutObjProcessor { + rgw_bucket bucket; + string obj_str; + bufferlist data; rgw_obj obj; off_t ofs; protected: - int prepare(RGWRados *store, struct req_state *s); + int prepare(RGWRados *store, void *obj_ctx); int handle_data(bufferlist& bl, off_t ofs, void **phandle); int throttle_data(void *handle) { return 0; } int do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs); public: - RGWPutObjProcessor_Plain() : ofs(0) {} + RGWPutObjProcessor_Plain(rgw_bucket& b, const string& o) : bucket(b), obj_str(o), ofs(0) {} }; -int RGWPutObjProcessor_Plain::prepare(RGWRados *store,struct req_state *s) +int RGWPutObjProcessor_Plain::prepare(RGWRados *store, void *obj_ctx) { - RGWPutObjProcessor::prepare(store, s); + RGWPutObjProcessor::prepare(store, obj_ctx); - obj.init(s->bucket, s->object_str); + obj.init(bucket, obj_str); return 0; }; @@ -1086,7 +1086,7 @@ int RGWPutObjProcessor_Plain::handle_data(bufferlist& bl, off_t _ofs, void **pha int RGWPutObjProcessor_Plain::do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs) { - int r = store->put_obj_meta(s->obj_ctx, obj, data.length(), mtime, attrs, + int r = store->put_obj_meta(obj_ctx, obj, data.length(), mtime, attrs, RGW_OBJ_CATEGORY_MAIN, PUT_OBJ_CREATE, &data); return r; @@ -1200,6 +1200,11 @@ class RGWPutObjProcessor_Atomic : public RGWPutObjProcessor_Aio off_t next_part_ofs; int cur_part_id; protected: + rgw_bucket bucket; + string obj_str; + + string unique_tag; + string oid_prefix; rgw_obj head_obj; rgw_obj cur_obj; @@ -1207,7 +1212,7 @@ protected: virtual bool immutable_head() { return false; } - int prepare(RGWRados *store, struct req_state *s); + int prepare(RGWRados *store, void *obj_ctx); virtual int do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs); void prepare_next_part(off_t ofs); @@ -1215,10 +1220,13 @@ protected: public: ~RGWPutObjProcessor_Atomic() {} - RGWPutObjProcessor_Atomic(uint64_t _p) : part_size(_p), + RGWPutObjProcessor_Atomic(rgw_bucket& _b, const string& _o, uint64_t _p, const string& _t) : part_size(_p), cur_part_ofs(0), next_part_ofs(_p), - cur_part_id(0) {} + cur_part_id(0), + bucket(_b), + obj_str(_o), + unique_tag(_t) {} int handle_data(bufferlist& bl, off_t ofs, void **phandle) { if (!ofs && !immutable_head()) { first_chunk.claim(bl); @@ -1235,14 +1243,14 @@ public: } }; -int RGWPutObjProcessor_Atomic::prepare(RGWRados *store, struct req_state *s) +int RGWPutObjProcessor_Atomic::prepare(RGWRados *store, void *obj_ctx) { - RGWPutObjProcessor::prepare(store, s); + RGWPutObjProcessor::prepare(store, obj_ctx); - head_obj.init(s->bucket, s->object_str); + head_obj.init(bucket, obj_str); char buf[33]; - gen_rand_alphanumeric(s->cct, buf, sizeof(buf) - 1); + gen_rand_alphanumeric(store->ctx(), buf, sizeof(buf) - 1); oid_prefix.append("_"); oid_prefix.append(buf); oid_prefix.append("_"); @@ -1278,7 +1286,7 @@ void RGWPutObjProcessor_Atomic::prepare_next_part(off_t ofs) { snprintf(buf, sizeof(buf), "%d", cur_part_id); string cur_oid = oid_prefix; cur_oid.append(buf); - cur_obj.init_ns(s->bucket, cur_oid, shadow_ns); + cur_obj.init_ns(bucket, cur_oid, shadow_ns); add_obj(cur_obj); }; @@ -1293,16 +1301,16 @@ int RGWPutObjProcessor_Atomic::do_complete(string& etag, time_t *mtime, map<stri { complete_parts(); - store->set_atomic(s->obj_ctx, head_obj); + store->set_atomic(obj_ctx, head_obj); RGWRados::PutObjMetaExtraParams extra_params; extra_params.data = &first_chunk; extra_params.manifest = &manifest; - extra_params.ptag = &s->req_id; /* use req_id as operation tag */ + extra_params.ptag = &unique_tag; /* use req_id as operation tag */ extra_params.mtime = mtime; - int r = store->put_obj_meta(s->obj_ctx, head_obj, obj_len, attrs, + int r = store->put_obj_meta(obj_ctx, head_obj, obj_len, attrs, RGW_OBJ_CATEGORY_MAIN, PUT_OBJ_CREATE, extra_params); return r; @@ -1312,21 +1320,22 @@ class RGWPutObjProcessor_Multipart : public RGWPutObjProcessor_Atomic { string part_num; RGWMPObj mp; + req_state *s; protected: bool immutable_head() { return true; } - int prepare(RGWRados *store, struct req_state *s); + int prepare(RGWRados *store, void *obj_ctx); int do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs); public: - RGWPutObjProcessor_Multipart(uint64_t _p) : RGWPutObjProcessor_Atomic(_p) {} + RGWPutObjProcessor_Multipart(uint64_t _p, req_state *_s) : RGWPutObjProcessor_Atomic(s->bucket, s->object_str, _p, s->req_id), s(_s) {} }; -int RGWPutObjProcessor_Multipart::prepare(RGWRados *store, struct req_state *s) +int RGWPutObjProcessor_Multipart::prepare(RGWRados *store, void *obj_ctx) { - RGWPutObjProcessor::prepare(store, s); + RGWPutObjProcessor::prepare(store, obj_ctx); - string oid = s->object_str; + string oid = obj_str; string upload_id; upload_id = s->info.args.get("uploadId"); mp.init(oid, upload_id); @@ -1338,7 +1347,7 @@ int RGWPutObjProcessor_Multipart::prepare(RGWRados *store, struct req_state *s) oid = mp.get_part(part_num); - head_obj.init_ns(s->bucket, oid, mp_ns); + head_obj.init_ns(bucket, oid, mp_ns); oid_prefix = oid; oid_prefix.append("_"); cur_obj = head_obj; @@ -1350,7 +1359,7 @@ int RGWPutObjProcessor_Multipart::do_complete(string& etag, time_t *mtime, map<s { complete_parts(); - int r = store->put_obj_meta(s->obj_ctx, head_obj, s->obj_size, mtime, attrs, RGW_OBJ_CATEGORY_MAIN, 0); + int r = store->put_obj_meta(obj_ctx, head_obj, s->obj_size, mtime, attrs, RGW_OBJ_CATEGORY_MAIN, 0); if (r < 0) return r; @@ -1361,14 +1370,14 @@ int RGWPutObjProcessor_Multipart::do_complete(string& etag, time_t *mtime, map<s info.num = atoi(part_num.c_str()); info.etag = etag; info.size = s->obj_size; - info.modified = ceph_clock_now(s->cct); + info.modified = ceph_clock_now(store->ctx()); info.manifest = manifest; ::encode(info, bl); string multipart_meta_obj = mp.get_meta(); rgw_obj meta_obj; - meta_obj.init_ns(s->bucket, multipart_meta_obj, mp_ns); + meta_obj.init_ns(bucket, multipart_meta_obj, mp_ns); r = store->omap_set(meta_obj, p, bl); @@ -1385,9 +1394,9 @@ RGWPutObjProcessor *RGWPutObj::select_processor() uint64_t part_size = s->cct->_conf->rgw_obj_stripe_size; if (!multipart) { - processor = new RGWPutObjProcessor_Atomic(part_size); + processor = new RGWPutObjProcessor_Atomic(s->bucket, s->object_str, part_size, s->req_id); } else { - processor = new RGWPutObjProcessor_Multipart(part_size); + processor = new RGWPutObjProcessor_Multipart(part_size, s); } return processor; @@ -1532,9 +1541,9 @@ RGWPutObjProcessor *RGWPostObj::select_processor() uint64_t part_size = s->cct->_conf->rgw_obj_stripe_size; if (s->content_length <= RGW_MAX_CHUNK_SIZE) - processor = new RGWPutObjProcessor_Plain(); + processor = new RGWPutObjProcessor_Plain(s->bucket, s->object_str); else - processor = new RGWPutObjProcessor_Atomic(part_size); + processor = new RGWPutObjProcessor_Atomic(s->bucket, s->object_str, part_size, s->req_id); return processor; } diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 09238778cff..3c2e2a4c062 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -271,7 +271,7 @@ class RGWPutObjProcessor { protected: RGWRados *store; - struct req_state *s; + void *obj_ctx; bool is_complete; virtual int do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs) = 0; @@ -282,11 +282,11 @@ protected: objs.push_back(obj); } public: - RGWPutObjProcessor() : store(NULL), s(NULL), is_complete(false) {} + RGWPutObjProcessor() : store(NULL), obj_ctx(NULL), is_complete(false) {} virtual ~RGWPutObjProcessor(); - virtual int prepare(RGWRados *_store, struct req_state *_s) { + virtual int prepare(RGWRados *_store, void *_o) { store = _store; - s = _s; + obj_ctx = _o; return 0; }; virtual int handle_data(bufferlist& bl, off_t ofs, void **phandle) = 0; |