]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: track cap flushing TIDs for each session
authorYan, Zheng <zyan@redhat.com>
Wed, 3 Jun 2015 10:05:29 +0000 (18:05 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 18 Aug 2015 08:49:50 +0000 (16:49 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/client/Client.cc
src/client/Client.h
src/client/MetaSession.h

index 0ba948128c30df967c31d5f2c839eb9d7b9b1442..d98e514f2ab2da5b99981b1532c6469d56dfa51e 100644 (file)
@@ -3483,7 +3483,7 @@ void Client::add_update_cap(Inode *in, MetaSession *mds_session, uint64_t cap_id
       if (in->auth_cap && in->flushing_cap_item.is_on_list()) {
        ldout(cct, 10) << "add_update_cap changing auth cap: "
                       << "add myself to new auth MDS' flushing caps list" << dendl;
-       mds_session->flushing_caps.push_back(&in->flushing_cap_item);
+       adjust_session_flushing_caps(in, in->auth_cap->session, mds_session);
       }
       in->auth_cap = cap;
     }
@@ -3591,6 +3591,7 @@ void Client::remove_session_caps(MetaSession *s)
       put_inode(in);
     }
   }
+  s->flushing_caps_tids.clear();
   sync_cond.Signal();
 }
 
@@ -3731,11 +3732,23 @@ int Client::mark_caps_flushing(Inode *in, ceph_tid_t* ptid)
  
 
   session->flushing_caps.push_back(&in->flushing_cap_item);
+  session->flushing_caps_tids.insert(flush_tid);
 
   *ptid = flush_tid;
   return flushing;
 }
 
+void Client::adjust_session_flushing_caps(Inode *in, MetaSession *old_s,  MetaSession *new_s)
+{
+  for (map<ceph_tid_t, int>::iterator it = in->flushing_cap_tids.begin();
+       it != in->flushing_cap_tids.end();
+       ++it) {
+    old_s->flushing_caps_tids.erase(it->first);
+    new_s->flushing_caps_tids.insert(it->first);
+  }
+  new_s->flushing_caps.push_back(&in->flushing_cap_item);
+}
+
 void Client::flush_caps()
 {
   ldout(cct, 10) << "flush_caps" << dendl;
@@ -4278,7 +4291,7 @@ void Client::handle_cap_export(MetaSession *session, Inode *in, MClientCaps *m)
          if (cap == in->auth_cap)
            in->auth_cap = tcap;
          if (in->auth_cap == tcap && in->flushing_cap_item.is_on_list())
-           tsession->flushing_caps.push_back(&in->flushing_cap_item);
+           adjust_session_flushing_caps(in, session, tsession);
        }
       } else {
        add_update_cap(in, tsession, m->peer.cap_id, cap->issued,
@@ -4325,6 +4338,7 @@ void Client::handle_cap_flush_ack(MetaSession *session, Inode *in, Cap *cap, MCl
     if (it->first == flush_ack_tid)
       cleaned = it->second;
     if (it->first <= flush_ack_tid) {
+      session->flushing_caps_tids.erase(it->first);
       in->flushing_cap_tids.erase(it++);
       ++flushed;
       continue;
index b6ea21ba7eb60c5f15fff08c4b6575db4fbec606..e6c74db5a4b136c43646f3753850537a4e2b6537 100644 (file)
@@ -536,6 +536,7 @@ protected:
   void remove_session_caps(MetaSession *session);
   void mark_caps_dirty(Inode *in, int caps);
   int mark_caps_flushing(Inode *in, ceph_tid_t *ptid);
+  void adjust_session_flushing_caps(Inode *in, MetaSession *old_s, MetaSession *new_s);
   void flush_caps();
   void flush_caps(Inode *in, MetaSession *session);
   void kick_flushing_caps(MetaSession *session);
index 36b5814c7c67bd188edb9c95e380560031a08553..e21be8351527470c705072de140922adb96aab62 100644 (file)
@@ -46,6 +46,7 @@ struct MetaSession {
   xlist<CapSnap*> flushing_capsnaps;
   xlist<MetaRequest*> requests;
   xlist<MetaRequest*> unsafe_requests;
+  std::set<ceph_tid_t> flushing_caps_tids;
 
   Cap *s_cap_iterator;