From: Yan, Zheng Date: Fri, 28 Nov 2014 13:11:05 +0000 (+0800) Subject: mds: notify clients when MDS goes to readonly X-Git-Tag: v0.91~52^2~14^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f716903858bee8d7dfbf9e8aba0f4873b12a711b;p=ceph.git mds: notify clients when MDS goes to readonly notice clients that MDS goes to readonly and MDS won't issue write caps any more. Signed-off-by: Yan, Zheng --- diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 70a3958c7e55..c4776ea6bbd3 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -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); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 6488870bf857..ca3656e9b960 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -11284,6 +11284,8 @@ void MDCache::force_readonly() set_readonly(); + mds->server->force_clients_readonly(); + // revoke write caps for (ceph::unordered_map::iterator p = inode_map.begin(); p != inode_map.end(); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 01e6cdc45882..3c36ff94575b 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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& 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 sessions; + mds->sessionmap.get_client_session_set(sessions); + for (set::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 diff --git a/src/mds/Server.h b/src/mds/Server.h index 0cc95f145307..5a90d1394c9f 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -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);