]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw/sysobj: read() can query size/mtime
authorCasey Bodley <cbodley@redhat.com>
Tue, 7 Mar 2023 22:28:54 +0000 (17:28 -0500)
committerCasey Bodley <cbodley@redhat.com>
Sat, 11 Mar 2023 20:13:00 +0000 (15:13 -0500)
rgw_get_system_obj() stopped calling stat() before read() in
90aec61298fc378e1733bc76f0d3f95ce8ec135a, which left the optional
'real_time *pmtime' argument uninitialized

when requested, read() will add a stat op to initialize size/mtime

Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit 20ab42758c8ba0cef867752be3b215064d44a6f2)

src/rgw/services/svc_sys_obj.cc
src/rgw/services/svc_sys_obj_cache.cc
src/rgw/services/svc_sys_obj_cache.h
src/rgw/services/svc_sys_obj_core.cc
src/rgw/services/svc_sys_obj_core.h

index d352fb9f4dffb6cc3d581edd5657b8f0a27a0aa9..310e60514d2ca3e15e977767a7d24067a14edeb9 100644 (file)
@@ -40,6 +40,7 @@ int RGWSI_SysObj::Obj::ROp::read(const DoutPrefixProvider *dpp,
   return svc->read(dpp, *state,
                    objv_tracker,
                    obj, bl, ofs, end,
+                   lastmod, obj_size,
                    attrs,
                   raw_attrs,
                    cache_info,
index f704e7b1d745347ced732be67a3ec7534d681840..d1b7a3dbb3e730d2d6542c1592e77bc7f3dd2bf7 100644 (file)
@@ -111,6 +111,7 @@ int RGWSI_SysObj_Cache::read(const DoutPrefixProvider *dpp,
                              RGWObjVersionTracker *objv_tracker,
                              const rgw_raw_obj& obj,
                              bufferlist *obl, off_t ofs, off_t end,
+                             ceph::real_time* pmtime, uint64_t* psize,
                              map<string, bufferlist> *attrs,
                             bool raw_attrs,
                              rgw_cache_entry_info *cache_info,
@@ -120,8 +121,8 @@ int RGWSI_SysObj_Cache::read(const DoutPrefixProvider *dpp,
   rgw_pool pool;
   string oid;
   if (ofs != 0) {
-    return RGWSI_SysObj_Core::read(dpp, read_state, objv_tracker,
-                                   obj, obl, ofs, end, attrs, raw_attrs,
+    return RGWSI_SysObj_Core::read(dpp, read_state, objv_tracker, obj, obl,
+                                   ofs, end, pmtime, psize, attrs, raw_attrs,
                                    cache_info, refresh_version, y);
   }
 
@@ -133,6 +134,8 @@ int RGWSI_SysObj_Cache::read(const DoutPrefixProvider *dpp,
   uint32_t flags = (end != 0 ? CACHE_FLAG_DATA : 0);
   if (objv_tracker)
     flags |= CACHE_FLAG_OBJV;
+  if (pmtime || psize)
+    flags |= CACHE_FLAG_META;
   if (attrs)
     flags |= CACHE_FLAG_XATTRS;
   
@@ -151,6 +154,12 @@ int RGWSI_SysObj_Cache::read(const DoutPrefixProvider *dpp,
     i.copy_all(*obl);
     if (objv_tracker)
       objv_tracker->read_version = info.version;
+    if (pmtime) {
+      *pmtime = info.meta.mtime;
+    }
+    if (psize) {
+      *psize = info.meta.size;
+    }
     if (attrs) {
       if (raw_attrs) {
        *attrs = info.xattrs;
@@ -163,9 +172,23 @@ int RGWSI_SysObj_Cache::read(const DoutPrefixProvider *dpp,
   if(r == -ENODATA)
     return -ENOENT;
 
+  // if we only ask for one of mtime or size, ask for the other too so we can
+  // satisfy CACHE_FLAG_META
+  uint64_t size = 0;
+  real_time mtime;
+  if (pmtime) {
+    if (!psize) {
+      psize = &size;
+    }
+  } else if (psize) {
+    if (!pmtime) {
+      pmtime = &mtime;
+    }
+  }
+
   map<string, bufferlist> unfiltered_attrset;
   r = RGWSI_SysObj_Core::read(dpp, read_state, objv_tracker,
-                         obj, obl, ofs, end,
+                         obj, obl, ofs, end, pmtime, psize,
                         (attrs ? &unfiltered_attrset : nullptr),
                         true, /* cache unfiltered attrs */
                         cache_info,
@@ -194,6 +217,12 @@ int RGWSI_SysObj_Cache::read(const DoutPrefixProvider *dpp,
   if (objv_tracker) {
     info.version = objv_tracker->read_version;
   }
+  if (pmtime) {
+    info.meta.mtime = *pmtime;
+  }
+  if (psize) {
+    info.meta.size = *psize;
+  }
   if (attrs) {
     info.xattrs = std::move(unfiltered_attrset);
     if (raw_attrs) {
index e1fa9f997b910f1cc72e9c2d90864fbe9319f257..f7950843fa928a247e634e3d461a8a0252c86ad3 100644 (file)
@@ -48,6 +48,7 @@ protected:
            RGWObjVersionTracker *objv_tracker,
            const rgw_raw_obj& obj,
            bufferlist *bl, off_t ofs, off_t end,
+           ceph::real_time* pmtime, uint64_t* psize,
            std::map<std::string, bufferlist> *attrs,
           bool raw_attrs,
            rgw_cache_entry_info *cache_info,
index c57fbb4eed4864c6ae0f13a80fde106bc6eaf74b..30308969131d9231dd19164e66ae08037b7161a8 100644 (file)
@@ -134,6 +134,7 @@ int RGWSI_SysObj_Core::read(const DoutPrefixProvider *dpp,
                             RGWObjVersionTracker *objv_tracker,
                             const rgw_raw_obj& obj,
                             bufferlist *bl, off_t ofs, off_t end,
+                            ceph::real_time* pmtime, uint64_t* psize,
                             map<string, bufferlist> *attrs,
                            bool raw_attrs,
                             rgw_cache_entry_info *cache_info,
@@ -143,6 +144,7 @@ int RGWSI_SysObj_Core::read(const DoutPrefixProvider *dpp,
   auto& read_state = static_cast<GetObjState&>(_read_state);
 
   uint64_t len;
+  struct timespec mtime_ts;
   librados::ObjectReadOperation op;
 
   if (end < 0)
@@ -153,6 +155,9 @@ int RGWSI_SysObj_Core::read(const DoutPrefixProvider *dpp,
   if (objv_tracker) {
     objv_tracker->prepare_op_for_read(&op);
   }
+  if (psize || pmtime) {
+    op.stat2(psize, &mtime_ts, nullptr);
+  }
 
   ldpp_dout(dpp, 20) << "rados->read ofs=" << ofs << " len=" << len << dendl;
   op.read(ofs, len, bl, nullptr);
@@ -188,6 +193,9 @@ int RGWSI_SysObj_Core::read(const DoutPrefixProvider *dpp,
     return -ECANCELED;
   }
 
+  if (pmtime) {
+    *pmtime = ceph::real_clock::from_timespec(mtime_ts);
+  }
   if (attrs && !raw_attrs) {
     rgw_filter_attrset(unfiltered_attrset, RGW_ATTR_PREFIX, attrs);
   }
index 56b1b6d82e2863a623e46c837727f2c3da728e3f..d02a37eee8af9f8f45444768826dbd6cbfe7e546 100644 (file)
@@ -44,6 +44,7 @@ protected:
                    RGWObjVersionTracker *objv_tracker,
                    const rgw_raw_obj& obj,
                    bufferlist *bl, off_t ofs, off_t end,
+                   ceph::real_time* pmtime, uint64_t* psize,
                    std::map<std::string, bufferlist> *attrs,
                   bool raw_attrs,
                    rgw_cache_entry_info *cache_info,