Skip to content

Commit

Permalink
client: Inode::hold_caps_until is time from monotonic clock now.
Browse files Browse the repository at this point in the history
Inode::hold_caps_until storing time from ceph::coarse_mono_clock now.

Fixes: https://tracker.ceph.com/issues/52982
Signed-off-by: Neeraj Pratap Singh <[email protected]>
  • Loading branch information
neesingh-rh committed May 27, 2022
1 parent 7abc382 commit 983b105
Show file tree
Hide file tree
Showing 10 changed files with 38 additions and 22 deletions.
35 changes: 26 additions & 9 deletions src/client/Client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,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;

Expand Down Expand Up @@ -1889,6 +1895,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();
Expand Down Expand Up @@ -3657,8 +3664,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);
}

Expand Down Expand Up @@ -6069,7 +6076,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;
Expand Down Expand Up @@ -6690,8 +6697,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();
Expand All @@ -6702,15 +6709,15 @@ 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
*/
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;
Expand Down Expand Up @@ -6744,7 +6751,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
Expand Down Expand Up @@ -6903,7 +6910,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;
Expand Down Expand Up @@ -15938,6 +15945,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;
Expand Down Expand Up @@ -15975,6 +15984,14 @@ void Client::handle_conf_change(const ConfigProxy& conf,
_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");
}
}

void intrusive_ptr_add_ref(Inode *in)
Expand Down
6 changes: 3 additions & 3 deletions src/client/Client.h
Original file line number Diff line number Diff line change
Expand Up @@ -1496,7 +1496,7 @@ class Client : public Dispatcher, public md_config_obs_t {
Finisher async_ino_releasor;
Finisher objecter_finisher;

utime_t last_cap_renew;
ceph::coarse_mono_time last_cap_renew;

CommandHook m_command_hook;

Expand Down Expand Up @@ -1557,8 +1557,8 @@ class Client : public Dispatcher, public md_config_obs_t {
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
std::ofstream traceout;

Expand Down
2 changes: 1 addition & 1 deletion src/client/Inode.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 --
Expand Down Expand Up @@ -215,7 +216,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;
Expand Down
1 change: 1 addition & 0 deletions src/client/MetaRequest.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ struct MetaRequest {
Dentry *_old_dentry = NULL; //associated with path2
int abort_rc = 0;
public:
ceph::coarse_mono_time created = ceph::coarse_mono_clock::zero();
uint64_t tid = 0;
utime_t op_stamp;
ceph_mds_request_head head;
Expand Down
6 changes: 2 additions & 4 deletions src/common/options/mds-client.yaml.in
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,13 @@ options:
- mds_client
with_legacy: true
- name: client_mount_timeout
type: float
type: secs
level: advanced
desc: timeout for mounting CephFS (seconds)
fmt_desc: Set the timeout for CephFS mount in seconds.
default: 5_min
services:
- mds_client
with_legacy: true
- name: client_tick_interval
type: secs
level: dev
Expand Down Expand Up @@ -144,7 +143,7 @@ options:
- mds_client
with_legacy: true
- name: client_caps_release_delay
type: int
type: secs
level: dev
default: 5
services:
Expand All @@ -153,7 +152,6 @@ options:
sets how many seconds a client waits to release capabilities that it no
longer needs in case the capabilities are needed for another user space
operation.
with_legacy: true
- name: client_quota_df
type: bool
level: advanced
Expand Down
2 changes: 1 addition & 1 deletion src/librados/RadosClient.cc
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,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();
Expand Down
2 changes: 1 addition & 1 deletion src/mon/MonClient.cc
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,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;
Expand Down
2 changes: 1 addition & 1 deletion src/mon/MonClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion src/neorados/RADOSImpl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
Expand Down
2 changes: 1 addition & 1 deletion src/tools/cephfs_mirror/Mirror.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 983b105

Please sign in to comment.