]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: make sure snapflush is sent before normal cap message
authorYan, Zheng <zyan@redhat.com>
Wed, 29 Jun 2016 12:49:40 +0000 (20:49 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 15 Jul 2016 01:11:49 +0000 (09:11 +0800)
MDS does null snapflush when it receives normal cap message. So client
must send snapflush first.

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

index 921f9d5cb396cb976d6fa549ccc9577703f13971..5ee8aedcce55d42bb12a759d4d32859d9294d62e 100644 (file)
@@ -1973,6 +1973,7 @@ MetaSession *Client::_open_mds_session(mds_rank_t mds)
   session->inst = mdsmap->get_inst(mds);
   session->con = messenger->get_connection(session->inst);
   session->state = MetaSession::STATE_OPENING;
+  session->mds_state = MDSMap::STATE_NULL;
   mds_sessions[mds] = session;
 
   // Maybe skip sending a request to open if this MDS daemon
@@ -2567,9 +2568,9 @@ void Client::handle_mds_map(MMDSMap* m)
     } else if (oldstate == newstate)
       continue;  // no change
     
-    if (newstate == MDSMap::STATE_RECONNECT &&
-       mds_sessions.count(p->first)) {
-      MetaSession *session = mds_sessions[p->first];
+    MetaSession *session = p->second;
+    session->mds_state = newstate;
+    if (newstate == MDSMap::STATE_RECONNECT) {
       session->inst = mdsmap->get_inst(p->first);
       session->con = messenger->get_connection(session->inst);
       send_reconnect(session);
@@ -2578,11 +2579,11 @@ void Client::handle_mds_map(MMDSMap* m)
     if (newstate >= MDSMap::STATE_ACTIVE) {
       if (oldstate < MDSMap::STATE_ACTIVE) {
        // kick new requests
-       kick_requests(p->second);
-       kick_flushing_caps(p->second);
-       signal_context_list(p->second->waiting_for_open);
-       kick_maxsize_requests(p->second);
-       wake_inode_waiters(p->second);
+       kick_requests(session);
+       kick_flushing_caps(session);
+       signal_context_list(session->waiting_for_open);
+       kick_maxsize_requests(session);
+       wake_inode_waiters(session);
       }
       connect_mds_targets(p->first);
     }
@@ -3365,6 +3366,19 @@ void Client::check_caps(Inode *in, bool is_delayed)
     }
 
   ack:
+    // re-send old cap/snapcap flushes first.
+    if (session->mds_state >= MDSMap::STATE_RECONNECT &&
+       session->mds_state < MDSMap::STATE_ACTIVE &&
+       session->early_flushing_caps.count(in) == 0) {
+      ldout(cct, 20) << " reflushing caps (check_caps) on " << *in
+                    << " to mds." << session->mds_num << dendl;
+      session->early_flushing_caps.insert(in);
+      if (in->cap_snaps.size())
+       flush_snaps(in, true);
+      if (in->flushing_caps)
+       flush_caps(in, session);
+    }
+
     int flushing;
     ceph_tid_t flush_tid;
     if (in->auth_cap == cap && in->dirty_caps) {
@@ -4151,7 +4165,7 @@ void Client::early_kick_flushing_caps(MetaSession *session)
     if ((in->flushing_caps & in->auth_cap->issued) == in->flushing_caps)
       continue;
 
-    ldout(cct, 20) << " reflushing caps (revoked) on " << *in
+    ldout(cct, 20) << " reflushing caps (early_kick) on " << *in
                   << " to mds." << session->mds_num << dendl;
 
     session->early_flushing_caps.insert(in);
index 9ada901ab5fdb4fd1eeed85907548965fa037306..0d8c15263557dcd20b4790b05f00e0ae2a823d91 100644 (file)
@@ -35,6 +35,7 @@ struct MetaSession {
     STATE_STALE,
   } state;
 
+  int mds_state;
   bool readonly;
 
   list<Context*> waiting_for_open;
@@ -53,8 +54,8 @@ struct MetaSession {
   MetaSession()
     : mds_num(-1), con(NULL),
       seq(0), cap_gen(0), cap_renew_seq(0), num_caps(0),
-      state(STATE_NEW), readonly(false), s_cap_iterator(NULL),
-      release(NULL)
+      state(STATE_NEW), mds_state(0), readonly(false),
+      s_cap_iterator(NULL), release(NULL)
   {}
   ~MetaSession();