libceph: define and use an explicit CONNECTED state
There is no state explicitly defined when a ceph connection is fully operational. So define one. It's set when the connection sequence completes successfully, and is cleared when the connection gets closed. Be a little more careful when examining the old state when a socket disconnect event is reported. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
This commit is contained in:
Родитель
3ec50d1868
Коммит
e27947c767
|
@ -120,6 +120,7 @@ struct ceph_msg_pos {
|
|||
*/
|
||||
#define CONNECTING 1
|
||||
#define NEGOTIATING 2
|
||||
#define CONNECTED 5
|
||||
#define STANDBY 8 /* no outgoing messages, socket closed. we keep
|
||||
* the ceph_connection around to maintain shared
|
||||
* state with the peer. */
|
||||
|
|
|
@ -463,6 +463,7 @@ void ceph_con_close(struct ceph_connection *con)
|
|||
ceph_pr_addr(&con->peer_addr.in_addr));
|
||||
clear_bit(NEGOTIATING, &con->state);
|
||||
clear_bit(CONNECTING, &con->state);
|
||||
clear_bit(CONNECTED, &con->state);
|
||||
clear_bit(STANDBY, &con->state); /* avoid connect_seq bump */
|
||||
set_bit(CLOSED, &con->state);
|
||||
|
||||
|
@ -1564,6 +1565,7 @@ static int process_connect(struct ceph_connection *con)
|
|||
}
|
||||
clear_bit(NEGOTIATING, &con->state);
|
||||
clear_bit(CONNECTING, &con->state);
|
||||
set_bit(CONNECTED, &con->state);
|
||||
con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq);
|
||||
con->connect_seq++;
|
||||
con->peer_features = server_feat;
|
||||
|
@ -2114,6 +2116,7 @@ more:
|
|||
prepare_read_ack(con);
|
||||
break;
|
||||
case CEPH_MSGR_TAG_CLOSE:
|
||||
clear_bit(CONNECTED, &con->state);
|
||||
set_bit(CLOSED, &con->state); /* fixme */
|
||||
goto out;
|
||||
default:
|
||||
|
@ -2190,11 +2193,13 @@ static void con_work(struct work_struct *work)
|
|||
mutex_lock(&con->mutex);
|
||||
restart:
|
||||
if (test_and_clear_bit(SOCK_CLOSED, &con->flags)) {
|
||||
if (test_and_clear_bit(CONNECTING, &con->state)) {
|
||||
if (test_and_clear_bit(CONNECTED, &con->state))
|
||||
con->error_msg = "socket closed";
|
||||
else if (test_and_clear_bit(CONNECTING, &con->state)) {
|
||||
clear_bit(NEGOTIATING, &con->state);
|
||||
con->error_msg = "connection failed";
|
||||
} else {
|
||||
con->error_msg = "socket closed";
|
||||
con->error_msg = "unrecognized con state";
|
||||
}
|
||||
goto fault;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче