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");
|
||||
goto reconnect;
|
||||
} 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) {
|
||||
dev_err(DEV, "PingAck did not arrive in time.\n");
|
||||
goto reconnect;
|
||||
|
@ -4637,6 +4642,7 @@ int drbd_asender(struct drbd_thread *thi)
|
|||
goto reconnect;
|
||||
}
|
||||
if (received == expect) {
|
||||
mdev->last_received = jiffies;
|
||||
D_ASSERT(cmd != NULL);
|
||||
if (!cmd->process(mdev, h))
|
||||
goto reconnect;
|
||||
|
|
Loading…
Reference in a new issue