From d646ffb3b53fee7a589570daaa18ffca3c2c8ada Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Mon, 19 Oct 2020 02:44:06 -0400 Subject: [PATCH] client: add _dentry_valid() helper support Fixes: https://tracker.ceph.com/issues/43423 Signed-off-by: Xiubo Li --- src/client/Client.cc | 55 ++++++++++++++++++++++---------------------- src/client/Client.h | 2 ++ 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 0c60a4af12760..c4c3fec2cf3a2 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -6588,6 +6588,25 @@ int Client::_do_lookup(Inode *dir, const string& name, int mask, return r; } +bool Client::_dentry_valid(const Dentry *dn) +{ + ceph_assert(ceph_mutex_is_locked_by_me(client_lock)); + + // is dn lease valid? + utime_t now = ceph_clock_now(); + if (dn->lease_mds >= 0 && dn->lease_ttl > now && + mds_sessions.count(dn->lease_mds)) { + MetaSession &s = mds_sessions.at(dn->lease_mds); + if (s.cap_ttl > now && s.cap_gen == dn->lease_gen) + return true; + + ldout(cct, 20) << " bad lease, cap_ttl " << s.cap_ttl << ", cap_gen " << s.cap_gen + << " vs lease_gen " << dn->lease_gen << dendl; + } + + return false; +} + int Client::_lookup(Inode *dir, const string& dname, int mask, InodeRef *target, const UserPerm& perms) { @@ -6647,21 +6666,11 @@ int Client::_lookup(Inode *dir, const string& dname, int mask, InodeRef *target, << dendl; if (!dn->inode || dn->inode->caps_issued_mask(mask, true)) { - // is dn lease valid? - utime_t now = ceph_clock_now(); - if (dn->lease_mds >= 0 && - dn->lease_ttl > now && - mds_sessions.count(dn->lease_mds)) { - MetaSession &s = mds_sessions.at(dn->lease_mds); - if (s.cap_ttl > now && - s.cap_gen == dn->lease_gen) { - // touch this mds's dir cap too, even though we don't _explicitly_ use it here, to - // make trim_caps() behave. - dir->try_touch_cap(dn->lease_mds); - goto hit_dn; - } - ldout(cct, 20) << " bad lease, cap_ttl " << s.cap_ttl << ", cap_gen " << s.cap_gen - << " vs lease_gen " << dn->lease_gen << dendl; + if (_dentry_valid(dn)) { + // touch this mds's dir cap too, even though we don't _explicitly_ use it here, to + // make trim_caps() behave. + dir->try_touch_cap(dn->lease_mds); + goto hit_dn; } // dir shared caps? if (dir->caps_issued_mask(CEPH_CAP_FILE_SHARED, true)) { @@ -6713,19 +6722,9 @@ int Client::get_or_create(Inode *dir, const char* name, dir->open_dir(); if (dir->dir->dentries.count(name)) { Dentry *dn = dir->dir->dentries[name]; - - // is dn lease valid? - utime_t now = ceph_clock_now(); - if (dn->inode && - dn->lease_mds >= 0 && - dn->lease_ttl > now && - mds_sessions.count(dn->lease_mds)) { - MetaSession &s = mds_sessions.at(dn->lease_mds); - if (s.cap_ttl > now && - s.cap_gen == dn->lease_gen) { - if (expect_null) - return -EEXIST; - } + if (_dentry_valid(dn)) { + if (expect_null) + return -EEXIST; } *pdn = dn; } else { diff --git a/src/client/Client.h b/src/client/Client.h index 7e91ac23111c8..4d50bf9b7adb0 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -1174,6 +1174,8 @@ private: int _read_sync(Fh *f, uint64_t off, uint64_t len, bufferlist *bl, bool *checkeof); int _read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl); + bool _dentry_valid(const Dentry *dn); + // internal interface // call these with client_lock held! int _do_lookup(Inode *dir, const string& name, int mask, InodeRef *target, -- 2.39.5