diff options
author | Lars Ellenberg <lars.ellenberg@linbit.com> | 2011-06-20 14:44:45 +0200 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2011-06-30 09:23:44 +0200 |
commit | cb6518cbef5e3e36b7ae90fcab610a52ea7e9fc0 (patch) | |
tree | 1eb6576ba34d7a731eeea5dab58c96905a142be2 | |
parent | 5a8b424276f7ba50c51e7caf485b2be23739e5b8 (diff) | |
download | linux-stable-cb6518cbef5e3e36b7ae90fcab610a52ea7e9fc0.tar.gz linux-stable-cb6518cbef5e3e36b7ae90fcab610a52ea7e9fc0.tar.bz2 linux-stable-cb6518cbef5e3e36b7ae90fcab610a52ea7e9fc0.zip |
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>
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 25d32c5aa50a..43beaca53179 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -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; |