mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
ceph: don't blindly unregister session that is in opening state
handle_cap_export() may add placeholder caps to session that is in opening state. These caps' session pointer become wild after session get unregistered. The fix is not to unregister session in opening state during mds failovers, just let client to reconnect later when mds is recovered. Link: https://tracker.ceph.com/issues/40190 Signed-off-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
2ef5df1abe
commit
6f0f597b5d
@ -3737,42 +3737,35 @@ static void check_new_map(struct ceph_mds_client *mdsc,
|
||||
ceph_mdsmap_is_laggy(newmap, i) ? " (laggy)" : "",
|
||||
ceph_session_state_name(s->s_state));
|
||||
|
||||
if (i >= newmap->m_num_mds ||
|
||||
memcmp(ceph_mdsmap_get_addr(oldmap, i),
|
||||
if (i >= newmap->m_num_mds) {
|
||||
/* force close session for stopped mds */
|
||||
get_session(s);
|
||||
__unregister_session(mdsc, s);
|
||||
__wake_requests(mdsc, &s->s_waiting);
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
|
||||
mutex_lock(&s->s_mutex);
|
||||
cleanup_session_requests(mdsc, s);
|
||||
remove_session_caps(s);
|
||||
mutex_unlock(&s->s_mutex);
|
||||
|
||||
ceph_put_mds_session(s);
|
||||
|
||||
mutex_lock(&mdsc->mutex);
|
||||
kick_requests(mdsc, i);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (memcmp(ceph_mdsmap_get_addr(oldmap, i),
|
||||
ceph_mdsmap_get_addr(newmap, i),
|
||||
sizeof(struct ceph_entity_addr))) {
|
||||
if (s->s_state == CEPH_MDS_SESSION_OPENING) {
|
||||
/* the session never opened, just close it
|
||||
* out now */
|
||||
get_session(s);
|
||||
__unregister_session(mdsc, s);
|
||||
__wake_requests(mdsc, &s->s_waiting);
|
||||
ceph_put_mds_session(s);
|
||||
} else if (i >= newmap->m_num_mds) {
|
||||
/* force close session for stopped mds */
|
||||
get_session(s);
|
||||
__unregister_session(mdsc, s);
|
||||
__wake_requests(mdsc, &s->s_waiting);
|
||||
kick_requests(mdsc, i);
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
|
||||
mutex_lock(&s->s_mutex);
|
||||
cleanup_session_requests(mdsc, s);
|
||||
remove_session_caps(s);
|
||||
mutex_unlock(&s->s_mutex);
|
||||
|
||||
ceph_put_mds_session(s);
|
||||
|
||||
mutex_lock(&mdsc->mutex);
|
||||
} else {
|
||||
/* just close it */
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
mutex_lock(&s->s_mutex);
|
||||
mutex_lock(&mdsc->mutex);
|
||||
ceph_con_close(&s->s_con);
|
||||
mutex_unlock(&s->s_mutex);
|
||||
s->s_state = CEPH_MDS_SESSION_RESTARTING;
|
||||
}
|
||||
/* just close it */
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
mutex_lock(&s->s_mutex);
|
||||
mutex_lock(&mdsc->mutex);
|
||||
ceph_con_close(&s->s_con);
|
||||
mutex_unlock(&s->s_mutex);
|
||||
s->s_state = CEPH_MDS_SESSION_RESTARTING;
|
||||
} else if (oldstate == newstate) {
|
||||
continue; /* nothing new with this mds */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user