From 9296475397c72ace967bcdffed2a964a19664c24 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 17 Jan 2008 11:54:53 -0800 Subject: [PATCH] clean up mds session open; request mdsmap when necessary --- src/kernel/mds_client.c | 40 +++++++++++++++++++++------------------- src/kernel/mon_client.c | 23 ++++++++++++++++++++++- src/kernel/mon_client.h | 2 ++ 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index d281169cf9241..c8036e266eea1 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -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); diff --git a/src/kernel/mon_client.c b/src/kernel/mon_client.c index 38aa2cd5f7041..1ef19c7ea6eef 100644 --- a/src/kernel/mon_client.c +++ b/src/kernel/mon_client.c @@ -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; } diff --git a/src/kernel/mon_client.h b/src/kernel/mon_client.h index fc88b4d98e4c2..9bb74feafa49f 100644 --- a/src/kernel/mon_client.h +++ b/src/kernel/mon_client.h @@ -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); -- 2.39.5