]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: notify clients when MDS goes to readonly
authorYan, Zheng <zyan@redhat.com>
Fri, 28 Nov 2014 13:11:05 +0000 (21:11 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 2 Dec 2014 02:47:23 +0000 (10:47 +0800)
notice clients that MDS goes to readonly and MDS won't issue write
caps any more.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/include/ceph_fs.h
src/mds/MDCache.cc
src/mds/Server.cc
src/mds/Server.h

index 70a3958c7e558b20a207791a64214e5d4a3ca6bb..c4776ea6bbd305c5a7e04031320b57c3b2f8acbb 100644 (file)
@@ -285,6 +285,7 @@ enum {
        CEPH_SESSION_RECALL_STATE,
        CEPH_SESSION_FLUSHMSG,
        CEPH_SESSION_FLUSHMSG_ACK,
+       CEPH_SESSION_FORCE_RO,
 };
 
 extern const char *ceph_session_op_name(int op);
index 6488870bf8577218725323e8d060cabd33898da2..ca3656e9b96023cfe43ab97f5e55a97eb0c4c1d6 100644 (file)
@@ -11284,6 +11284,8 @@ void MDCache::force_readonly()
 
   set_readonly();
 
+  mds->server->force_clients_readonly();
+
   // revoke write caps
   for (ceph::unordered_map<vinodeno_t,CInode*>::iterator p = inode_map.begin();
        p != inode_map.end();
index 01e6cdc45882e925864d99f9edc4a1e76faf0b88..3c36ff94575b0e93ef905bceb57838113faeb7a5 100644 (file)
@@ -344,6 +344,8 @@ void Server::_session_logged(Session *session, uint64_t state_seq, bool open, ve
     mds->sessionmap.touch_session(session);
     assert(session->connection != NULL);
     session->connection->send_message(new MClientSession(CEPH_SESSION_OPEN));
+    if (mdcache->is_readonly())
+      session->connection->send_message(new MClientSession(CEPH_SESSION_FORCE_RO));
   } else if (session->is_closing() ||
             session->is_killing()) {
     // kill any lingering capabilities, leases, requests
@@ -448,11 +450,9 @@ void Server::finish_force_open_sessions(map<client_t,entity_inst_t>& cm,
        dout(10) << "force_open_sessions opened " << session->info.inst << dendl;
        mds->sessionmap.set_state(session, Session::STATE_OPEN);
        mds->sessionmap.touch_session(session);
-       Message *m = new MClientSession(CEPH_SESSION_OPEN);
-       if (session->connection)
-         session->connection->send_message(m);
-       else
-         session->preopen_out_queue.push_back(m);
+       mds->send_message_client(new MClientSession(CEPH_SESSION_OPEN), session);
+       if (mdcache->is_readonly())
+         mds->send_message_client(new MClientSession(CEPH_SESSION_FORCE_RO), session);
       }
     } else {
       dout(10) << "force_open_sessions skipping already-open " << session->info.inst << dendl;
@@ -841,6 +841,21 @@ void Server::recall_client_state(float ratio)
   }
 }
 
+void Server::force_clients_readonly()
+{
+  dout(10) << "force_clients_readonly" << dendl;
+  set<Session*> sessions;
+  mds->sessionmap.get_client_session_set(sessions);
+  for (set<Session*>::const_iterator p = sessions.begin();
+      p != sessions.end();
+      ++p) {
+    Session *session = *p;
+    if (!session->info.inst.name.is_client() ||
+       !(session->is_open() || session->is_stale()))
+      continue;
+    mds->send_message_client(new MClientSession(CEPH_SESSION_FORCE_RO), session);
+  }
+}
 
 /*******
  * some generic stuff for finishing off requests
index 0cc95f1453077ca6843c1d6d4fbe90336c551c9b..5a90d1394c9f6ffe78b67a9106c2661506438b71 100644 (file)
@@ -102,6 +102,7 @@ public:
   void recover_filelocks(CInode *in, bufferlist locks, int64_t client);
 
   void recall_client_state(float ratio);
+  void force_clients_readonly();
 
   // -- requests --
   void handle_client_request(MClientRequest *m);