]> 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, 15 Jan 2019 08:35:55 +0000 (16:35 +0800)
Both kick_maxsize_requests() and wake_inode_waiters() wake up cap
waiters

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/client/Client.cc
src/client/Client.h

index 35f60289148bdc9918c2be2a722070f4f1f4041b..33ab8f198e442931ccb4bb177c59e883ed0e20a0 100644 (file)
@@ -2129,7 +2129,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;
 
@@ -2734,8 +2734,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 &&
@@ -3781,10 +3780,15 @@ 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)
 {
   for (const auto &cap : s->caps) {
-    signal_cond_list(cap->inode.waitfor_caps);
+    auto &in = cap->inode;
+    if (reconnect) {
+      in.requested_max_size = 0;
+      in.wanted_max_size = 0;
+    }
+    signal_cond_list(in.waitfor_caps);
   }
 }
 
@@ -4452,16 +4456,6 @@ void Client::early_kick_flushing_caps(MetaSession *session)
   }
 }
 
-void Client::kick_maxsize_requests(MetaSession *session)
-{
-  for (const auto &cap : session->caps) {
-    auto &in = cap->inode;
-    in.requested_max_size = 0;
-    in.wanted_max_size = 0;
-    signal_cond_list(in.waitfor_caps);
-  }
-}
-
 void SnapRealm::build_snap_context()
 {
   set<snapid_t> snaps;
index cc9816689e8f5266aa4dacba3ed93ce9ab8c32ef..5c7e480e8490c72af8b2ba807ffe26da1845b597 100644 (file)
@@ -662,7 +662,6 @@ public:
   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);
 
@@ -865,7 +864,7 @@ protected:
   }
 
   // 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);