libceph: clear NEGOTIATING when done
A connection state's NEGOTIATING bit gets set while in CONNECTING state after we have successfully exchanged a ceph banner and IP addresses with the connection's peer (the server). But that bit is not cleared again--at least not until another connection attempt is initiated. Instead, clear it as soon as the connection is fully established. Also, clear it when a socket connection gets prematurely closed in the midst of establishing a ceph connection (in case we had reached the point where it was set). Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
This commit is contained in:
parent
bb9e6bba5d
commit
3ec50d1868
|
@ -1562,6 +1562,7 @@ static int process_connect(struct ceph_connection *con)
|
|||
fail_protocol(con);
|
||||
return -1;
|
||||
}
|
||||
clear_bit(NEGOTIATING, &con->state);
|
||||
clear_bit(CONNECTING, &con->state);
|
||||
con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq);
|
||||
con->connect_seq++;
|
||||
|
@ -1951,7 +1952,6 @@ more:
|
|||
|
||||
/* open the socket first? */
|
||||
if (con->sock == NULL) {
|
||||
clear_bit(NEGOTIATING, &con->state);
|
||||
set_bit(CONNECTING, &con->state);
|
||||
|
||||
con_out_kvec_reset(con);
|
||||
|
@ -2190,10 +2190,12 @@ 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(CONNECTING, &con->state)) {
|
||||
clear_bit(NEGOTIATING, &con->state);
|
||||
con->error_msg = "connection failed";
|
||||
else
|
||||
} else {
|
||||
con->error_msg = "socket closed";
|
||||
}
|
||||
goto fault;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue