]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw_file: advance_mtime() should consider namespace expiration
authorMatt Benjamin <mbenjamin@redhat.com>
Tue, 18 Jun 2019 11:39:09 +0000 (07:39 -0400)
committerNathan Cutler <ncutler@suse.com>
Tue, 1 Oct 2019 12:18:31 +0000 (14:18 +0200)
Predictably, slow NFS operations like READDIR will overlap mtime
advance, so don't advance faster than the nfs namespace
expiration timer.

Fixes: http://tracker.ceph.com/issues/40415
Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
(cherry picked from commit fc14eeb6dbf7deaf11a70a3d3b48ce41998d4e39)

src/rgw/rgw_file.cc
src/rgw/rgw_file.h

index 3ab675682f0cd03a41aee3b45a9d27036bd9a871..4bd17a8e8774efe1c5fe47d81856ae775cdcd355 100644 (file)
@@ -1304,6 +1304,23 @@ namespace rgw {
     }
   }
 
+  void RGWFileHandle::advance_mtime() {
+    /* intended for use on directories, fast-forward mtime so as to
+     * ensure a new, higher value for the change attribute */
+    lock_guard guard(mtx);
+    /* advance mtime only if stored mtime is older than the
+     * configured namespace expiration */
+    auto now = real_clock::now();
+    auto cmptime = state.mtime;
+    cmptime.tv_sec +=
+      fs->get_context()->_conf->rgw_nfs_namespace_expire_secs;
+    if (cmptime < real_clock::to_timespec(now)) {
+      /* sets ctime as well as mtime, to avoid masking updates should
+       * ctime inexplicably hold a higher value */
+      set_times(now);
+    }
+  }
+
   void RGWFileHandle::invalidate() {
     RGWLibFS *fs = get_fs();
     if (fs->invalidate_cb) {
index eade60cff8f606aa74ada893a4201f2e7b357088..882d88f8561d1ef9a9ffe4df449546b1f179c4da 100644 (file)
@@ -236,15 +236,7 @@ namespace rgw {
     };
 
     void clear_state();
-
-    void advance_mtime() {
-      /* intended for use on directories, fast-forward mtime so as to
-       * ensure a new, higher value for the change attribute */
-      lock_guard guard(mtx);
-      /* sets ctime as well as mtime, to avoid masking updates should
-       * ctime inexplicably hold a higher value */
-      set_times(real_clock::now());
-    }
+    void advance_mtime();
 
     boost::variant<file, directory> variant_type;