From: Yan, Zheng Date: Thu, 6 Dec 2018 09:16:49 +0000 (+0800) Subject: client: don't wakeup cap waiters twice when mds recovered X-Git-Tag: v12.2.12~111^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a84765bee6412e00d3a7240af74c858e79492720;p=ceph.git client: don't wakeup cap waiters twice when mds recovered Both kick_maxsize_requests() and wake_inode_waiters() wake up cap waiters Signed-off-by: "Yan, Zheng" (cherry picked from commit 5993a93e606d23ef311831863444294d7c64cc04) Conflicts: src/client/Client.cc src/client/Client.h --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 000ed48ca0d..a87246449f7 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2089,7 +2089,7 @@ void Client::handle_client_session(MClientSession *m) if (session->cap_renew_seq == m->get_seq()) { session->cap_ttl = session->last_cap_renew_request + mdsmap->get_session_timeout(); - wake_inode_waiters(session); + wake_up_session_caps(session, false); } break; @@ -2703,8 +2703,7 @@ void Client::handle_mds_map(MMDSMap* m) kick_requests(session); kick_flushing_caps(session); signal_context_list(session->waiting_for_open); - kick_maxsize_requests(session); - wake_inode_waiters(session); + wake_up_session_caps(session, true); } connect_mds_targets(mds); } else if (newstate == MDSMap::STATE_NULL && @@ -3749,12 +3748,17 @@ void Client::signal_context_list(list& ls) } } -void Client::wake_inode_waiters(MetaSession *s) +void Client::wake_up_session_caps(MetaSession *s, bool reconnect) { xlist::iterator iter = s->caps.begin(); while (!iter.end()){ - signal_cond_list((*iter)->inode->waitfor_caps); + auto in = (*iter)->inode; ++iter; + if (reconnect) { + in->requested_max_size = 0; + in->wanted_max_size = 0; + } + signal_cond_list(in->waitfor_caps); } } @@ -4431,17 +4435,6 @@ void Client::early_kick_flushing_caps(MetaSession *session) } } -void Client::kick_maxsize_requests(MetaSession *session) -{ - xlist::iterator iter = session->caps.begin(); - while (!iter.end()){ - (*iter)->inode->requested_max_size = 0; - (*iter)->inode->wanted_max_size = 0; - signal_cond_list((*iter)->inode->waitfor_caps); - ++iter; - } -} - void SnapRealm::build_snap_context() { set snaps; diff --git a/src/client/Client.h b/src/client/Client.h index dd9e70ace2c..645e369cfb6 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -483,7 +483,7 @@ protected: Mutex client_lock; // helpers - void wake_inode_waiters(MetaSession *s); + void wake_up_session_caps(MetaSession *s, bool reconnect); void wait_on_context_list(list& ls); void signal_context_list(list& ls); @@ -641,7 +641,6 @@ protected: void flush_caps(Inode *in, MetaSession *session, bool sync=false); void kick_flushing_caps(MetaSession *session); void early_kick_flushing_caps(MetaSession *session); - void kick_maxsize_requests(MetaSession *session); int get_caps(Inode *in, int need, int want, int *have, loff_t endoff); int get_caps_used(Inode *in);