libceph: don't change socket state on sock event
Currently the socket state change event handler records an error message on a connection to distinguish a close while connecting from a close while a connection was already established. Changing connection information during handling of a socket event is not very clean, so instead move this assignment inside con_work(), where it can be done during normal connection-level processing (and under protection of the connection mutex as well). Move the handling of a socket closed event up to the top of the processing loop in con_work(); there's no point in handling backoff etc. if we have a newly-closed socket to take care of. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
This commit is contained in:
Родитель
a8d00e3cde
Коммит
188048bce3
|
@ -261,13 +261,8 @@ static void ceph_sock_state_change(struct sock *sk)
|
|||
case TCP_CLOSE_WAIT:
|
||||
dout("%s TCP_CLOSE_WAIT\n", __func__);
|
||||
con_sock_state_closing(con);
|
||||
if (test_and_set_bit(SOCK_CLOSED, &con->flags) == 0) {
|
||||
if (test_bit(CONNECTING, &con->state))
|
||||
con->error_msg = "connection failed";
|
||||
else
|
||||
con->error_msg = "socket closed";
|
||||
if (!test_and_set_bit(SOCK_CLOSED, &con->flags))
|
||||
queue_con(con);
|
||||
}
|
||||
break;
|
||||
case TCP_ESTABLISHED:
|
||||
dout("%s TCP_ESTABLISHED\n", __func__);
|
||||
|
@ -2187,6 +2182,14 @@ static void con_work(struct work_struct *work)
|
|||
|
||||
mutex_lock(&con->mutex);
|
||||
restart:
|
||||
if (test_and_clear_bit(SOCK_CLOSED, &con->flags)) {
|
||||
if (test_bit(CONNECTING, &con->state))
|
||||
con->error_msg = "connection failed";
|
||||
else
|
||||
con->error_msg = "socket closed";
|
||||
goto fault;
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(BACKOFF, &con->flags)) {
|
||||
dout("con_work %p backing off\n", con);
|
||||
if (queue_delayed_work(ceph_msgr_wq, &con->work,
|
||||
|
@ -2216,9 +2219,6 @@ restart:
|
|||
con_close_socket(con);
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(SOCK_CLOSED, &con->flags))
|
||||
goto fault;
|
||||
|
||||
ret = try_read(con);
|
||||
if (ret == -EAGAIN)
|
||||
goto restart;
|
||||
|
|
Загрузка…
Ссылка в новой задаче