]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: Inode::hold_caps_until is time from monotonic clock now.
authorNeeraj Pratap Singh <neesingh@redhat.com>
Wed, 8 Dec 2021 08:42:59 +0000 (14:12 +0530)
committerNeeraj Pratap Singh <neesingh@redhat.com>
Tue, 28 Jun 2022 19:33:45 +0000 (01:03 +0530)
Inode::hold_caps_until storing time from ceph::coarse_mono_clock now.

This upstream code of this PR i.e. the parent PR contains the file
`src/common/options/mds-client.yaml.in` which intends to fix a part
of this PR whereas this file didn't exist in pacific branch.So, those
changes of `src/common/options/mds-client.yaml.in` are incorporated in
the below mentioned files in Conlicts.
Fixes: https://tracker.ceph.com/issues/52982
Signed-off-by: Neeraj Pratap Singh <neesingh@redhat.com>
(cherry picked from commit 983b10506dc8466a0e47ff0d320d480dd09999ec)

Conflicts:`/src/common/legacy_config_opts.h`
          `/src/common/options.cc`

src/client/Client.cc
src/client/Client.h
src/client/Inode.h
src/client/MetaRequest.h
src/common/legacy_config_opts.h
src/common/options.cc
src/librados/RadosClient.cc
src/mon/MonClient.cc
src/mon/MonClient.h
src/neorados/RADOSImpl.cc
src/tools/cephfs_mirror/Mirror.cc

index f1bebd6158d8dd1dd80c55436ccdbd598a3e100e..df5021af17129f77cbfe911960b47263e7b57771 100644 (file)
@@ -349,6 +349,12 @@ Client::Client(Messenger *m, MonClient *mc, Objecter *objecter_)
   _collect_and_send_global_metrics = cct->_conf.get_val<bool>(
     "client_collect_and_send_global_metrics");
 
+  mount_timeout = cct->_conf.get_val<std::chrono::seconds>(
+    "client_mount_timeout");
+
+  caps_release_delay = cct->_conf.get_val<std::chrono::seconds>(
+    "client_caps_release_delay");
+
   if (cct->_conf->client_acl_type == "posix_acl")
     acl_type = POSIX_ACL;
 
@@ -1787,6 +1793,7 @@ int Client::make_request(MetaRequest *request,
 
   // and timestamp
   request->op_stamp = ceph_clock_now();
+  request->created = ceph::coarse_mono_clock::now();
 
   // make note
   mds_requests[tid] = request->get();
@@ -3520,8 +3527,8 @@ int Client::get_caps_used(Inode *in)
 void Client::cap_delay_requeue(Inode *in)
 {
   ldout(cct, 10) << __func__ << " on " << *in << dendl;
-  in->hold_caps_until = ceph_clock_now();
-  in->hold_caps_until += cct->_conf->client_caps_release_delay;
+
+  in->hold_caps_until = ceph::coarse_mono_clock::now() + caps_release_delay;
   delayed_list.push_back(&in->delay_cap_item);
 }
 
@@ -5962,7 +5969,7 @@ int Client::authenticate()
   }
 
   client_lock.unlock();
-  int r = monclient->authenticate(cct->_conf->client_mount_timeout);
+  int r = monclient->authenticate(std::chrono::duration<double>(mount_timeout).count());
   client_lock.lock();
   if (r < 0) {
     return r;
@@ -6573,8 +6580,8 @@ void Client::renew_and_flush_cap_releases()
 
   if (!mount_aborted && mdsmap->get_epoch()) {
     // renew caps?
-    utime_t el = ceph_clock_now() - last_cap_renew;
-    if (unlikely(el > mdsmap->get_session_timeout() / 3.0))
+    auto el = ceph::coarse_mono_clock::now() - last_cap_renew;
+    if (unlikely(utime_t(el) > mdsmap->get_session_timeout() / 3.0))
       renew_caps();
 
     flush_cap_releases();
@@ -6585,7 +6592,7 @@ void Client::tick()
 {
   ldout(cct, 20) << "tick" << dendl;
 
-  utime_t now = ceph_clock_now();
+  auto now = ceph::coarse_mono_clock::now();
 
   /*
    * If the mount() is not finished
@@ -6593,7 +6600,7 @@ void Client::tick()
   if (is_mounting() && !mds_requests.empty()) {
     MetaRequest *req = mds_requests.begin()->second;
 
-    if (req->op_stamp + cct->_conf->client_mount_timeout < now) {
+    if (req->created + mount_timeout < now) {
       req->abort(-CEPHFS_ETIMEDOUT);
       if (req->caller_cond) {
         req->kick = true;
@@ -6627,7 +6634,7 @@ void Client::tick()
   trim_cache(true);
 
   if (blocklisted && (is_mounted() || is_unmounting()) &&
-      last_auto_reconnect + 30 * 60 < now &&
+      last_auto_reconnect + std::chrono::seconds(30 * 60) < now &&
       cct->_conf.get_val<bool>("client_reconnect_stale")) {
     messenger->client_reset();
     fd_gen++; // invalidate open files
@@ -6779,7 +6786,7 @@ void Client::collect_and_send_global_metrics() {
 void Client::renew_caps()
 {
   ldout(cct, 10) << "renew_caps()" << dendl;
-  last_cap_renew = ceph_clock_now();
+  last_cap_renew = ceph::coarse_mono_clock::now();
 
   for (auto &p : mds_sessions) {
     ldout(cct, 15) << "renew_caps requesting from mds." << p.first << dendl;
@@ -15721,6 +15728,8 @@ const char** Client::get_tracked_conf_keys() const
     "client_oc_max_dirty",
     "client_oc_target_dirty",
     "client_oc_max_dirty_age",
+    "client_caps_release_delay",
+    "client_mount_timeout",
     NULL
   };
   return keys;
@@ -15757,6 +15766,14 @@ void Client::handle_conf_change(const ConfigProxy& conf,
   if (changed.count("client_collect_and_send_global_metrics")) {
     _collect_and_send_global_metrics = cct->_conf.get_val<bool>(
       "client_collect_and_send_global_metrics");
+  }    
+  if (changed.count("client_caps_release_delay")) {
+    caps_release_delay = cct->_conf.get_val<std::chrono::seconds>(
+      "client_caps_release_delay");
+  }
+  if (changed.count("client_mount_timeout")) {
+    mount_timeout = cct->_conf.get_val<std::chrono::seconds>(
+      "client_mount_timeout");
   }
 }
 
index 35ea561731d1a21995e3309fe7bfb4315f265d64..7ad9422ba697eebeda32f8a4feca7de017eba4a2 100644 (file)
@@ -1474,7 +1474,7 @@ private:
   Finisher async_ino_releasor;
   Finisher objecter_finisher;
 
-  utime_t last_cap_renew;
+  ceph::coarse_mono_time last_cap_renew;
 
   CommandHook m_command_hook;
 
@@ -1536,8 +1536,8 @@ private:
   ceph::unordered_map<inodeno_t,SnapRealm*> snap_realms;
   std::map<std::string, std::string> metadata;
 
-  utime_t last_auto_reconnect;
-
+  ceph::coarse_mono_time last_auto_reconnect;
+  std::chrono::seconds caps_release_delay, mount_timeout;
   // trace generation
   ofstream traceout;
 
index 86c08871ac4ce9febe05e0e2eb3c990e9ca52440..1cb6285ba47364cde6bfef333098308d17fbb091 100644 (file)
@@ -115,6 +115,7 @@ struct CapSnap {
 #define I_ERROR_FILELOCK       (1 << 5)
 
 struct Inode : RefCountedObject {
+  ceph::coarse_mono_time hold_caps_until;
   Client *client;
 
   // -- the actual inode --
@@ -211,7 +212,6 @@ struct Inode : RefCountedObject {
   int cache_gen = 0;
   int snap_caps = 0;
   int snap_cap_refs = 0;
-  utime_t hold_caps_until;
   xlist<Inode*>::item delay_cap_item, dirty_cap_item, flushing_cap_item;
 
   SnapRealm *snaprealm = 0;
index 695b902b64e877505c928c03abcc9b030831ae25..03eae6522fd035b4921e66387868b19478f808d3 100644 (file)
@@ -25,6 +25,7 @@ private:
   Dentry *_old_dentry; //associated with path2
   int abort_rc;
 public:
+  ceph::coarse_mono_time created = ceph::coarse_mono_clock::zero();
   uint64_t tid;
   utime_t  op_stamp;
   ceph_mds_request_head head;
index 3dbd1fe464a8359ba8f8c0788779cb022fe13d0c..1301b649eeed50d2c5777b57a866bd7798b10b42 100644 (file)
@@ -346,7 +346,6 @@ OPTION(mon_client_directed_command_retry, OPT_INT)
 OPTION(client_cache_size, OPT_INT)
 OPTION(client_cache_mid, OPT_FLOAT)
 OPTION(client_use_random_mds, OPT_BOOL)
-OPTION(client_mount_timeout, OPT_DOUBLE)
 OPTION(client_trace, OPT_STR)
 OPTION(client_readahead_min, OPT_LONGLONG)  // readahead at _least_ this much.
 OPTION(client_readahead_max_bytes, OPT_LONGLONG)  // default unlimited
@@ -356,7 +355,6 @@ OPTION(client_mount_uid, OPT_INT)
 OPTION(client_mount_gid, OPT_INT)
 OPTION(client_notify_timeout, OPT_INT) // in seconds
 OPTION(osd_client_watch_timeout, OPT_INT) // in seconds
-OPTION(client_caps_release_delay, OPT_INT) // in seconds
 OPTION(client_quota_df, OPT_BOOL) // use quota for df on subdir mounts
 OPTION(client_oc, OPT_BOOL)
 OPTION(client_oc_size, OPT_INT)    // MB * n
index efd03807a69111f516561ffdcf591fce785c2009..62df21038c6abf4a2880ee07a2961290d01fd7ef 100644 (file)
@@ -8954,8 +8954,8 @@ std::vector<Option> get_mds_client_options() {
     .set_default(false)
     .set_description("issue new requests to a random active MDS"),
 
-    Option("client_mount_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
-    .set_default(300.0)
+    Option("client_mount_timeout", Option::TYPE_SECS, Option::LEVEL_ADVANCED)
+    .set_default(300)
     .set_description("timeout for mounting CephFS (seconds)"),
 
     Option("client_tick_interval", Option::TYPE_SECS, Option::LEVEL_DEV)
@@ -9008,7 +9008,7 @@ std::vector<Option> get_mds_client_options() {
     .set_default(30)
     .set_description(""),
 
-    Option("client_caps_release_delay", Option::TYPE_INT, Option::LEVEL_DEV)
+    Option("client_caps_release_delay", Option::TYPE_SECS, Option::LEVEL_DEV)
     .set_default(5)
     .set_description(""),
 
index 47b928058c4f565786c81680a97fba68cc3636c6..04ea14f312570c5d2310f69265793317e83b2fa7 100644 (file)
@@ -278,7 +278,7 @@ int librados::RadosClient::connect()
     goto out;
   }
 
-  err = monclient.authenticate(conf->client_mount_timeout);
+  err = monclient.authenticate(std::chrono::duration<double>(conf.get_val<std::chrono::seconds>("client_mount_timeout")).count());
   if (err) {
     ldout(cct, 0) << conf->name << " authentication error " << cpp_strerror(-err) << dendl;
     shutdown();
index 0df0d7dbeab252a9692c7f2547816fea497bd655..9c637bf8a8e19038550816d8ef65aaccc342b09a 100644 (file)
@@ -155,7 +155,7 @@ int MonClient::get_monmap_and_config()
     if (r < 0) {
       return r;
     }
-    r = authenticate(cct->_conf->client_mount_timeout);
+    r = authenticate(std::chrono::duration<double>(cct->_conf.get_val<std::chrono::seconds>("client_mount_timeout")).count());
     if (r == -ETIMEDOUT) {
       shutdown();
       continue;
index c6ee6b8eb92fd3ced29ac01e0081eb0d81c59fef..6a7daa8143937e09c2e496d913be9113912fbad5 100644 (file)
@@ -158,7 +158,7 @@ struct MonClientPinger : public Dispatcher,
   int wait_for_reply(double timeout = 0.0) {
     std::unique_lock locker{lock};
     if (timeout <= 0) {
-      timeout = cct->_conf->client_mount_timeout;
+      timeout = std::chrono::duration<double>(cct->_conf.get_val<std::chrono::seconds>("client_mount_timeout")).count();
     }
     done = false;
     if (ping_recvd_cond.wait_for(locker,
index bddd62c2f8ba16e6f1172fdcd7d20f35ca19eb03..6c9c210a85cde02f391758e5920ebcc97a11e7c7 100644 (file)
@@ -59,7 +59,7 @@ RADOS::RADOS(boost::asio::io_context& ioctx,
   if (err) {
     throw boost::system::system_error(ceph::to_error_code(err));
   }
-  err = monclient.authenticate(cct->_conf->client_mount_timeout);
+  err = monclient.authenticate(std::chrono::duration<double>(cct->_conf.get_val<std::chrono::seconds>("client_mount_timeout")).count());
   if (err) {
     throw boost::system::system_error(ceph::to_error_code(err));
   }
index c20a1fc659b3aec75c188272cd865c1f65bf15db..890805764c048d86ecb26c817add6aaaf6e5d9af 100644 (file)
@@ -238,7 +238,7 @@ int Mirror::init_mon_client() {
     return r;
   }
 
-  r = m_monc->authenticate(m_cct->_conf->client_mount_timeout);
+  r = m_monc->authenticate(std::chrono::duration<double>(m_cct->_conf.get_val<std::chrono::seconds>("client_mount_timeout")).count());
   if (r < 0) {
     derr << ": failed to authenticate to monitor: " << cpp_strerror(r) << dendl;
     return r;