From: Yehuda Sadeh Date: Wed, 23 Dec 2015 19:43:22 +0000 (-0800) Subject: rgw: keep pg ver on obj state, and send it in HEAD request X-Git-Tag: v10.1.0~354^2~101 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b50b3bb9cf5526092cab89144e46654ee1d4e0ac;p=ceph.git rgw: keep pg ver on obj state, and send it in HEAD request send it in HEAD request if it was done by the system user Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 4da29aa148dc..145bbd588c80 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -7429,7 +7429,7 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, rgw_obj& obj, RGWObjState * s->has_manifest = true; s->size = s->manifest.get_obj_size(); } catch (buffer::error& err) { - ldout(cct, 20) << "ERROR: couldn't decode manifest" << dendl; + ldout(cct, 0) << "ERROR: couldn't decode manifest" << dendl; return -EIO; } ldout(cct, 10) << "manifest: total_size = " << s->manifest.get_obj_size() << dendl; @@ -7449,6 +7449,15 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, rgw_obj& obj, RGWObjState * s->fake_tag = true; } } + bufferlist pg_ver_bl = s->attrset[RGW_ATTR_PG_VER]; + if (pg_ver_bl.length()) { + bufferlist::iterator pgbl = pg_ver_bl.begin(); + try { + ::decode(s->pg_ver, pgbl); + } catch (buffer::error& err) { + ldout(cct, 0) << "ERROR: couldn't decode pg ver attr for object " << s->obj << ", non-critical error, ignoring" << dendl; + } + } if (s->obj_tag.length()) ldout(cct, 20) << "get_obj_state: setting s->obj_tag to " << string(s->obj_tag.c_str(), s->obj_tag.length()) << dendl; else diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index db9100b0696a..2d38066b3206 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -627,6 +627,7 @@ struct RGWObjState { bool keep_tail; bool is_olh; bufferlist olh_tag; + uint64_t pg_ver; /* important! don't forget to update copy constructor */ @@ -635,7 +636,8 @@ struct RGWObjState { map attrset; RGWObjState() : is_atomic(false), has_attrs(0), exists(false), size(0), mtime(0), epoch(0), fake_tag(false), has_manifest(false), - has_data(false), prefetch_data(false), keep_tail(false), is_olh(false) {} + has_data(false), prefetch_data(false), keep_tail(false), is_olh(false), + pg_ver(0) {} RGWObjState(const RGWObjState& rhs) : obj (rhs.obj) { is_atomic = rhs.is_atomic; has_attrs = rhs.has_attrs; @@ -661,6 +663,7 @@ struct RGWObjState { keep_tail = rhs.keep_tail; is_olh = rhs.is_olh; objv_tracker = rhs.objv_tracker; + pg_ver = rhs.pg_ver; } bool get_attr(string name, bufferlist& dest) { @@ -671,19 +674,6 @@ struct RGWObjState { } return false; } - - void clear() { - has_attrs = false; - exists = false; - fake_tag = false; - epoch = 0; - size = 0; - mtime = 0; - obj_tag.clear(); - shadow_obj.clear(); - attrset.clear(); - data.clear(); - } }; struct RGWPoolIterCtx { diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index aa4a1702f46a..b0c6d24d45a6 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -141,6 +141,18 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs, off_ if (s->system_request && lastmod) { /* we end up dumping mtime in two different methods, a bit redundant */ dump_epoch_header(s, "Rgwx-Mtime", lastmod); + uint64_t pg_ver = 0; + map::iterator iter = attrs.find(RGW_ATTR_PG_VER); + bufferlist& bl = iter->second; + if (bl.length() > 0) { + bufferlist::iterator bliter = bl.begin(); + try { + ::decode(pg_ver, bliter); + } catch (buffer::error& err) { + ldout(s->cct, 0) << "ERROR: failed to decode pg ver attr" << dendl; + } + } + s->cio->print("Rgwx-Obj-PG-Ver: %lld\r\n", (long long)pg_ver); } dump_content_length(s, total_len);