diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ceph/mds_client.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index d45787470fb5..972ec5ae2ac4 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -1660,10 +1660,9 @@ static void __wake_requests(struct ceph_mds_client *mdsc, | |||
1660 | 1660 | ||
1661 | /* | 1661 | /* |
1662 | * Wake up threads with requests pending for @mds, so that they can | 1662 | * Wake up threads with requests pending for @mds, so that they can |
1663 | * resubmit their requests to a possibly different mds. If @all is set, | 1663 | * resubmit their requests to a possibly different mds. |
1664 | * wake up if their requests has been forwarded to @mds, too. | ||
1665 | */ | 1664 | */ |
1666 | static void kick_requests(struct ceph_mds_client *mdsc, int mds, int all) | 1665 | static void kick_requests(struct ceph_mds_client *mdsc, int mds) |
1667 | { | 1666 | { |
1668 | struct ceph_mds_request *req; | 1667 | struct ceph_mds_request *req; |
1669 | struct rb_node *p; | 1668 | struct rb_node *p; |
@@ -2026,6 +2025,8 @@ static void handle_session(struct ceph_mds_session *session, | |||
2026 | 2025 | ||
2027 | switch (op) { | 2026 | switch (op) { |
2028 | case CEPH_SESSION_OPEN: | 2027 | case CEPH_SESSION_OPEN: |
2028 | if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) | ||
2029 | pr_info("mds%d reconnect success\n", session->s_mds); | ||
2029 | session->s_state = CEPH_MDS_SESSION_OPEN; | 2030 | session->s_state = CEPH_MDS_SESSION_OPEN; |
2030 | renewed_caps(mdsc, session, 0); | 2031 | renewed_caps(mdsc, session, 0); |
2031 | wake = 1; | 2032 | wake = 1; |
@@ -2039,10 +2040,12 @@ static void handle_session(struct ceph_mds_session *session, | |||
2039 | break; | 2040 | break; |
2040 | 2041 | ||
2041 | case CEPH_SESSION_CLOSE: | 2042 | case CEPH_SESSION_CLOSE: |
2043 | if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) | ||
2044 | pr_info("mds%d reconnect denied\n", session->s_mds); | ||
2042 | remove_session_caps(session); | 2045 | remove_session_caps(session); |
2043 | wake = 1; /* for good measure */ | 2046 | wake = 1; /* for good measure */ |
2044 | complete(&mdsc->session_close_waiters); | 2047 | complete(&mdsc->session_close_waiters); |
2045 | kick_requests(mdsc, mds, 0); /* cur only */ | 2048 | kick_requests(mdsc, mds); |
2046 | break; | 2049 | break; |
2047 | 2050 | ||
2048 | case CEPH_SESSION_STALE: | 2051 | case CEPH_SESSION_STALE: |
@@ -2258,7 +2261,6 @@ send: | |||
2258 | reply->nr_pages = calc_pages_for(0, pagelist->length); | 2261 | reply->nr_pages = calc_pages_for(0, pagelist->length); |
2259 | ceph_con_send(&session->s_con, reply); | 2262 | ceph_con_send(&session->s_con, reply); |
2260 | 2263 | ||
2261 | session->s_state = CEPH_MDS_SESSION_OPEN; | ||
2262 | mutex_unlock(&session->s_mutex); | 2264 | mutex_unlock(&session->s_mutex); |
2263 | 2265 | ||
2264 | mutex_lock(&mdsc->mutex); | 2266 | mutex_lock(&mdsc->mutex); |
@@ -2334,7 +2336,7 @@ static void check_new_map(struct ceph_mds_client *mdsc, | |||
2334 | } | 2336 | } |
2335 | 2337 | ||
2336 | /* kick any requests waiting on the recovering mds */ | 2338 | /* kick any requests waiting on the recovering mds */ |
2337 | kick_requests(mdsc, i, 1); | 2339 | kick_requests(mdsc, i); |
2338 | } else if (oldstate == newstate) { | 2340 | } else if (oldstate == newstate) { |
2339 | continue; /* nothing new with this mds */ | 2341 | continue; /* nothing new with this mds */ |
2340 | } | 2342 | } |
@@ -2347,18 +2349,14 @@ static void check_new_map(struct ceph_mds_client *mdsc, | |||
2347 | send_mds_reconnect(mdsc, i); | 2349 | send_mds_reconnect(mdsc, i); |
2348 | 2350 | ||
2349 | /* | 2351 | /* |
2350 | * kick requests on any mds that has gone active. | 2352 | * kick request on any mds that has gone active. |
2351 | * | ||
2352 | * kick requests on cur or forwarder: we may have sent | ||
2353 | * the request to mds1, mds1 told us it forwarded it | ||
2354 | * to mds2, but then we learn mds1 failed and can't be | ||
2355 | * sure it successfully forwarded our request before | ||
2356 | * it died. | ||
2357 | */ | 2353 | */ |
2358 | if (oldstate < CEPH_MDS_STATE_ACTIVE && | 2354 | if (oldstate < CEPH_MDS_STATE_ACTIVE && |
2359 | newstate >= CEPH_MDS_STATE_ACTIVE) { | 2355 | newstate >= CEPH_MDS_STATE_ACTIVE) { |
2360 | pr_info("mds%d reconnect completed\n", s->s_mds); | 2356 | if (oldstate != CEPH_MDS_STATE_CREATING && |
2361 | kick_requests(mdsc, i, 1); | 2357 | oldstate != CEPH_MDS_STATE_STARTING) |
2358 | pr_info("mds%d recovery completed\n", s->s_mds); | ||
2359 | kick_requests(mdsc, i); | ||
2362 | ceph_kick_flushing_caps(mdsc, s); | 2360 | ceph_kick_flushing_caps(mdsc, s); |
2363 | wake_up_session_caps(s, 1); | 2361 | wake_up_session_caps(s, 1); |
2364 | } | 2362 | } |