From 46d6eb3aca659249788d181bf5836ab55c2e17fa Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 15 Nov 2018 18:26:14 -0800 Subject: [PATCH] rgw: store data in cache even if short read Also, don't set DATA flag if zero bytes are being read. This caused an issue now that we don't read attrs directly (but go through unfiltered_attrs first). Since we returned early in case we read the exact amount we requested, *attrs wasn't populated. Signed-off-by: Yehuda Sadeh --- src/rgw/services/svc_sys_obj_cache.cc | 17 +++++++++-------- src/rgw/services/svc_sys_obj_core.cc | 14 +++++++------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/rgw/services/svc_sys_obj_cache.cc b/src/rgw/services/svc_sys_obj_cache.cc index db1f4f731e1..7c2817fed91 100644 --- a/src/rgw/services/svc_sys_obj_cache.cc +++ b/src/rgw/services/svc_sys_obj_cache.cc @@ -99,7 +99,7 @@ int RGWSI_SysObj_Cache::read(RGWSysObjectCtxBase& obj_ctx, string oid; if (ofs != 0) { return RGWSI_SysObj_Core::read(obj_ctx, read_state, objv_tracker, - obj, obl, ofs, end, attrs, true, + obj, obl, ofs, end, attrs, raw_attrs, cache_info, refresh_version); } @@ -108,7 +108,7 @@ int RGWSI_SysObj_Cache::read(RGWSysObjectCtxBase& obj_ctx, ObjectCacheInfo info; - uint32_t flags = CACHE_FLAG_DATA; + uint32_t flags = (end != 0 ? CACHE_FLAG_DATA : 0); if (objv_tracker) flags |= CACHE_FLAG_OBJV; if (attrs) @@ -155,14 +155,15 @@ int RGWSI_SysObj_Cache::read(RGWSysObjectCtxBase& obj_ctx, if (obl->length() == end + 1) { /* in this case, most likely object contains more data, we can't cache it */ - return r; + flags &= ~CACHE_FLAG_DATA; + } else { + bufferptr p(r); + bufferlist& bl = info.data; + bl.clear(); + bufferlist::iterator o = obl->begin(); + o.copy_all(bl); } - bufferptr p(r); - bufferlist& bl = info.data; - bl.clear(); - bufferlist::iterator o = obl->begin(); - o.copy_all(bl); info.status = 0; info.flags = flags; if (objv_tracker) { diff --git a/src/rgw/services/svc_sys_obj_core.cc b/src/rgw/services/svc_sys_obj_core.cc index 847f3dd79d8..c3683ae6bd7 100644 --- a/src/rgw/services/svc_sys_obj_core.cc +++ b/src/rgw/services/svc_sys_obj_core.cc @@ -206,7 +206,11 @@ int RGWSI_SysObj_Core::read(RGWSysObjectCtxBase& obj_ctx, map unfiltered_attrset; if (attrs) { - op.getxattrs(&unfiltered_attrset, nullptr); + if (raw_attrs) { + op.getxattrs(attrs, nullptr); + } else { + op.getxattrs(&unfiltered_attrset, nullptr); + } } RGWSI_RADOS::Obj rados_obj; @@ -230,12 +234,8 @@ int RGWSI_SysObj_Core::read(RGWSysObjectCtxBase& obj_ctx, return -ECANCELED; } - if (attrs) { - if (raw_attrs) { - attrs->swap(unfiltered_attrset); - } else { - rgw_filter_attrset(unfiltered_attrset, RGW_ATTR_PREFIX, attrs); - } + if (attrs && !raw_attrs) { + rgw_filter_attrset(unfiltered_attrset, RGW_ATTR_PREFIX, attrs); } read_state.last_ver = op_ver; -- 2.47.3