]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: don't wakeup cap waiters twice when mds recovered
authorYan, Zheng <zyan@redhat.com>
Thu, 6 Dec 2018 09:16:49 +0000 (17:16 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 5 Feb 2019 09:53:09 +0000 (17:53 +0800)
Both kick_maxsize_requests() and wake_inode_waiters() wake up cap
waiters

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 5993a93e606d23ef311831863444294d7c64cc04)

 Conflicts:
src/client/Client.cc
src/client/Client.h

src/client/Client.cc
src/client/Client.h

index 000ed48ca0d3dac1d4d275a9f102baa9cab4bf70..a87246449f72e1f6e8cddb362ac670f86f9c334b 100644 (file)
@@ -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<Context*>& ls)
   }
 }
 
-void Client::wake_inode_waiters(MetaSession *s)
+void Client::wake_up_session_caps(MetaSession *s, bool reconnect)
 {
   xlist<Cap*>::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<Cap*>::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<snapid_t> snaps;
index dd9e70ace2c52c6e353c9306dc36e6c2b9fb4e5f..645e369cfb60f8bc7e64318f3e7db5a0f29007c8 100644 (file)
@@ -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<Context*>& ls);
   void signal_context_list(list<Context*>& 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);