]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
clean up mds session open; request mdsmap when necessary
authorSage Weil <sage@newdream.net>
Thu, 17 Jan 2008 19:54:53 +0000 (11:54 -0800)
committerSage Weil <sage@newdream.net>
Thu, 17 Jan 2008 19:54:53 +0000 (11:54 -0800)
src/kernel/mds_client.c
src/kernel/mon_client.c
src/kernel/mon_client.h

index d281169cf92413a9abd0833bd47a37340a0c658f..c8036e266eea191e86d6babd3e35595740416da5 100644 (file)
@@ -167,12 +167,22 @@ static int open_session(struct ceph_mds_client *mdsc, struct ceph_mds_session *s
        struct ceph_msg *msg;
        int mstate;
 
-       /* connect */
+       /* mds active? */
        mstate = ceph_mdsmap_get_state(mdsc->mdsmap, mds);
        dout(10, "open_session to mds%d, state %d\n", mds, mstate);
        if (mstate < CEPH_MDS_STATE_ACTIVE) {
                ceph_monc_request_mdsmap(&mdsc->client->monc, mdsc->mdsmap->m_epoch);
-               return -EINPROGRESS;
+               spin_unlock(&mdsc->lock);
+               dout(30, "open_session waiting on map\n");
+               wait_for_completion(&mdsc->map_waiters);
+               dout(30, "open_session done waiting on map\n");
+               spin_lock(&mdsc->lock);
+
+               mstate = ceph_mdsmap_get_state(mdsc->mdsmap, mds);
+               if (mstate < CEPH_MDS_STATE_ACTIVE) {
+                       dout(30, "open_session still not active...\n");
+                       return -EAGAIN;  /* hrm, try again? */
+               }
        } 
        
        /* send connect message */
@@ -181,6 +191,14 @@ static int open_session(struct ceph_mds_client *mdsc, struct ceph_mds_session *s
                return PTR_ERR(msg);  /* fixme */
        session->s_state = CEPH_MDS_SESSION_OPENING;
        send_msg_mds(mdsc, msg, mds);
+
+       /* wait for session to open (or fail, or close) */
+       spin_unlock(&mdsc->lock);
+       dout(30, "open_session waiting on session %p\n", session);
+       wait_for_completion(&session->s_completion);
+       dout(30, "open_session done waiting on session %p, state %d\n", 
+            session, session->s_state);
+       spin_lock(&mdsc->lock);
        return 0;
 }
 
@@ -361,23 +379,7 @@ retry:
        if (session->s_state == CEPH_MDS_SESSION_NEW ||
            session->s_state == CEPH_MDS_SESSION_CLOSING) {
                err = open_session(mdsc, session, mds);
-               if (err == -EINPROGRESS) {
-                       /* waiting for new mdsmap.  bleh, this is a little messy. */
-                       spin_unlock(&mdsc->lock);
-                       wait_for_completion(&mdsc->map_waiters);
-                       spin_lock(&mdsc->lock);
-                       goto retry;
-               }
-               BUG_ON(err);  /* implement me */
-       }
-       if (session->s_state == CEPH_MDS_SESSION_OPENING) {
-               /* wait for session to open (or fail, or close) */
-               spin_unlock(&mdsc->lock);
-               dout(30, "do_request waiting on session %p\n", session);
-               wait_for_completion(&session->s_completion);
-               dout(30, "do_request done waiting on session %p, state %d\n", 
-                    session, session->s_state);
-               spin_lock(&mdsc->lock);
+               BUG_ON(err && err != -EAGAIN);
        }
        if (session->s_state != CEPH_MDS_SESSION_OPEN) {
                dout(30, "do_request session %p not open, %d\n", session, session->s_state);
index 38aa2cd5f7041a860276d5f3320aa53b171261e5..1ef19c7ea6eef1be8746fa9640565f5bf05c5576 100644 (file)
@@ -86,11 +86,32 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
 }
 
 
+static int request_mdsmap(struct ceph_mon_client *monc)
+{
+       struct ceph_msg *msg;
+       int mon = pick_mon(monc, -1);
+
+       dout(10, "request_mdsmap to mon%d have %u\n", mon, monc->want_mdsmap_epoch_gt);
+       msg = ceph_msg_new(CEPH_MSG_MDS_GETMAP, sizeof(ceph_epoch_t), 0, 0, 0);
+       if (IS_ERR(msg))
+               return PTR_ERR(msg);
+       *(__le32*)msg->front.iov_base = cpu_to_le32(monc->want_mdsmap_epoch_gt);
+       msg->hdr.dst = monc->monmap->mon_inst[mon];
+       ceph_msg_send(monc->client->msgr, msg, 0);
+       return 0;
+}
+
 
 void ceph_monc_request_mdsmap(struct ceph_mon_client *monc, __u64 have)
 {
        dout(5, "ceph_monc_request_mdsmap -- IMPLEMENT ME\n");
        
+       if (have <= monc->want_mdsmap_epoch_gt) {
+               dout(5, " already waiting for > %u\n", monc->want_mdsmap_epoch_gt);
+               return;
+       }
+       monc->want_mdsmap_epoch_gt = have;
+       request_mdsmap(monc);
 }
 
 
@@ -144,7 +165,7 @@ int send_statfs(struct ceph_mon_client *monc, u64 tid)
                return PTR_ERR(msg);
        *(__le64*)msg->front.iov_base = cpu_to_le64(tid);
        msg->hdr.dst = monc->monmap->mon_inst[mon];
-       ceph_msg_send(monc->client->msgr, msg, BASE_DELAY_INTERVAL);
+       ceph_msg_send(monc->client->msgr, msg, 0);
        return 0;
 }
 
index fc88b4d98e4c270446ca889fb3ea5ec839c1e5fd..9bb74feafa49f5f25473e937a67a33c0109d9c52 100644 (file)
@@ -30,6 +30,8 @@ struct ceph_mon_client {
        spinlock_t lock;
        struct radix_tree_root statfs_request_tree;  /* statfs requests */
        u64 last_tid;
+
+       u32 want_mdsmap_epoch_gt;
 };
 
 extern struct ceph_monmap *ceph_monmap_decode(void *p, void *end);