From: Yan, Zheng Date: Tue, 7 Nov 2017 02:37:44 +0000 (+0800) Subject: mds: cleanup set/drop loner code X-Git-Tag: v12.2.3~16^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f354347debffec93910e0db0be4e165c00778d83;p=ceph.git mds: cleanup set/drop loner code integrate functionalities of try_drop_loner and try_set_loner into CInode::choose_ideal_loner Signed-off-by: "Yan, Zheng" (cherry picked from commit d4cbf3aeeada57a88b794d3d6d5fb1cd891e31cd) --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index b0a2bcf5f1d..fc640f841c0 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -2734,10 +2734,24 @@ client_t CInode::calc_ideal_loner() return loner; } -client_t CInode::choose_ideal_loner() +bool CInode::choose_ideal_loner() { want_loner_cap = calc_ideal_loner(); - return want_loner_cap; + int changed = false; + if (loner_cap >= 0 && loner_cap != want_loner_cap) { + if (!try_drop_loner()) + return false; + changed = true; + } + + if (want_loner_cap >= 0) { + if (loner_cap < 0) { + set_loner_cap(want_loner_cap); + changed = true; + } else + assert(loner_cap == want_loner_cap); + } + return changed; } bool CInode::try_set_loner() @@ -2805,9 +2819,8 @@ void CInode::choose_lock_state(SimpleLock *lock, int allissued) void CInode::choose_lock_states(int dirty_caps) { int issued = get_caps_issued() | dirty_caps; - if (is_auth() && (issued & (CEPH_CAP_ANY_EXCL|CEPH_CAP_ANY_WR)) && - choose_ideal_loner() >= 0) - try_set_loner(); + if (is_auth() && (issued & (CEPH_CAP_ANY_EXCL|CEPH_CAP_ANY_WR))) + choose_ideal_loner(); choose_lock_state(&filelock, issued); choose_lock_state(&nestlock, issued); choose_lock_state(&dirfragtreelock, issued); @@ -3297,12 +3310,8 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session, if (!no_caps && !cap) { // add a new cap cap = add_client_cap(client, session, realm); - if (is_auth()) { - if (choose_ideal_loner() >= 0) - try_set_loner(); - else if (get_wanted_loner() < 0) - try_drop_loner(); - } + if (is_auth()) + choose_ideal_loner(); } int issue = 0; diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 99f12de927f..675a6bc090a 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -918,9 +918,9 @@ public: } client_t calc_ideal_loner(); - client_t choose_ideal_loner(); - bool try_set_loner(); void set_loner_cap(client_t l); + bool choose_ideal_loner(); + bool try_set_loner(); bool try_drop_loner(); // choose new lock state during recovery, based on issued caps diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 9f72471ef45..dda87315df1 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1038,15 +1038,15 @@ bool Locker::eval(CInode *in, int mask, bool caps_imported) // choose loner? if (in->is_auth() && in->is_head()) { - if (in->choose_ideal_loner() >= 0) { - if (in->try_set_loner()) { - dout(10) << "eval set loner to client." << in->get_loner() << dendl; - need_issue = true; - mask = -1; - } else - dout(10) << "eval want loner client." << in->get_wanted_loner() << " but failed to set it" << dendl; - } else - dout(10) << "eval doesn't want loner" << dendl; + client_t orig_loner = in->get_loner(); + if (in->choose_ideal_loner()) { + dout(10) << "eval set loner: client." << orig_loner << " -> client." << in->get_loner() << dendl; + need_issue = true; + mask = -1; + } else if (in->get_wanted_loner() != in->get_loner()) { + dout(10) << "eval want loner: client." << in->get_wanted_loner() << " but failed to set it" << dendl; + mask = -1; + } } retry: @@ -1067,19 +1067,14 @@ bool Locker::eval(CInode *in, int mask, bool caps_imported) // drop loner? if (in->is_auth() && in->is_head() && in->get_wanted_loner() != in->get_loner()) { - dout(10) << " trying to drop loner" << dendl; if (in->try_drop_loner()) { - dout(10) << " dropped loner" << dendl; need_issue = true; - if (in->get_wanted_loner() >= 0) { - if (in->try_set_loner()) { - dout(10) << "eval end set loner to client." << in->get_loner() << dendl; - mask = -1; - goto retry; - } else { - dout(10) << "eval want loner client." << in->get_wanted_loner() << " but failed to set it" << dendl; - } + dout(10) << "eval end set loner to client." << in->get_loner() << dendl; + bool ok = in->try_set_loner(); + assert(ok); + mask = -1; + goto retry; } } }