forked from Minki/linux
drbd: More random to the connect logic
Since the listening socket is open all the time, it was possible to get into stable "initial packet S crossed" loops. * when both sides realize in the drbd_socket_okay() call at the end of the loop that the other side closed the main socket you had the chance to get into a stable loop with repeated "packet S crossed" messages. * when both sides do not realize with the drbd_socket_okay() call at the end of the loop that the other side closed the main socket you had the chance to get into a stable loop with alternating "packet S crossed" "packet M crossed" messages. In order to break out these stable loops randomize the behaviour if such a crossing of P_INITIAL_DATA or P_INITIAL_META packets is detected. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
92f14951c0
commit
80c6eed49d
@ -949,20 +949,25 @@ retry:
|
|||||||
if (sock.socket) {
|
if (sock.socket) {
|
||||||
conn_warn(tconn, "initial packet S crossed\n");
|
conn_warn(tconn, "initial packet S crossed\n");
|
||||||
sock_release(sock.socket);
|
sock_release(sock.socket);
|
||||||
|
sock.socket = s;
|
||||||
|
goto randomize;
|
||||||
}
|
}
|
||||||
sock.socket = s;
|
sock.socket = s;
|
||||||
break;
|
break;
|
||||||
case P_INITIAL_META:
|
case P_INITIAL_META:
|
||||||
|
set_bit(DISCARD_CONCURRENT, &tconn->flags);
|
||||||
if (msock.socket) {
|
if (msock.socket) {
|
||||||
conn_warn(tconn, "initial packet M crossed\n");
|
conn_warn(tconn, "initial packet M crossed\n");
|
||||||
sock_release(msock.socket);
|
sock_release(msock.socket);
|
||||||
|
msock.socket = s;
|
||||||
|
goto randomize;
|
||||||
}
|
}
|
||||||
msock.socket = s;
|
msock.socket = s;
|
||||||
set_bit(DISCARD_CONCURRENT, &tconn->flags);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
conn_warn(tconn, "Error receiving initial packet\n");
|
conn_warn(tconn, "Error receiving initial packet\n");
|
||||||
sock_release(s);
|
sock_release(s);
|
||||||
|
randomize:
|
||||||
if (random32() & 1)
|
if (random32() & 1)
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user