drbd: when receive times out on meta socket, also check last receive time on data socket
If we have an asymetrically congested network, we may send P_PING, but due to congestion, the corresponding P_PING_ACK would time out, and we would drop a (congested, but otherwise) healthy connection ("PingAck did not arrive in time.") Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
5a8b424276
commit
cb6518cbef
1 changed files with 6 additions and 0 deletions
|
@ -4602,6 +4602,11 @@ int drbd_asender(struct drbd_thread *thi)
|
||||||
dev_err(DEV, "meta connection shut down by peer.\n");
|
dev_err(DEV, "meta connection shut down by peer.\n");
|
||||||
goto reconnect;
|
goto reconnect;
|
||||||
} else if (rv == -EAGAIN) {
|
} else if (rv == -EAGAIN) {
|
||||||
|
/* If the data socket received something meanwhile,
|
||||||
|
* that is good enough: peer is still alive. */
|
||||||
|
if (time_after(mdev->last_received,
|
||||||
|
jiffies - mdev->meta.socket->sk->sk_rcvtimeo))
|
||||||
|
continue;
|
||||||
if (ping_timeout_active) {
|
if (ping_timeout_active) {
|
||||||
dev_err(DEV, "PingAck did not arrive in time.\n");
|
dev_err(DEV, "PingAck did not arrive in time.\n");
|
||||||
goto reconnect;
|
goto reconnect;
|
||||||
|
@ -4637,6 +4642,7 @@ int drbd_asender(struct drbd_thread *thi)
|
||||||
goto reconnect;
|
goto reconnect;
|
||||||
}
|
}
|
||||||
if (received == expect) {
|
if (received == expect) {
|
||||||
|
mdev->last_received = jiffies;
|
||||||
D_ASSERT(cmd != NULL);
|
D_ASSERT(cmd != NULL);
|
||||||
if (!cmd->process(mdev, h))
|
if (!cmd->process(mdev, h))
|
||||||
goto reconnect;
|
goto reconnect;
|
||||||
|
|
Loading…
Reference in a new issue