mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-08-01 01:11:58 +00:00
* Fix connection & handler shutdown when using `KeepAlive::Now`. Delay::new(Instant::now()) is never immediately ready, resulting in `KeepAlive::Now` to have no effect, since the delay is re-created on every execution of `poll()` in the `NodeHandlerWrapper`. It can also send the node handler into a busy-loop, since every newly created Delay will trigger a task wakeup, which creates a new Delay with Instant::now(), and so forth. The use of `Delay::new(Instant::now())` for "immediate" connection shutdown is therefore removed here entirely. An important assumption is thereby that as long as the node handler non-empty `negotiating_in` and `negotiating_out`, the handler is not dependent on such a Delay for task wakeup. * Correction to the libp2p-ping connection timeout. The current connection timeout is always short of one `interval`, because the "countdown" begins with the last received or sent pong (depending on the policy). In effect, the current default config has a connection timeout of 5 seconds (20 - 15) from the point when a ping is sent. Instead, the "countdown" of the connection timeout should always begin with the next scheduled ping. That also makes all configurations valid, avoiding pitfalls. The important properties of the ping handler are now checked to hold for all configurations, in particular: * The next ping must be scheduled no earlier than the ping interval and no later than the connection timeout. * The "countdown" for the connection timeout starts on the next ping, i.e. the full connection timeout remains at the instant when the next ping is sent. * Do not keep connections alive. The ping protocol is not supposed to keep otherwise idle connections alive, only to add an additional condition for terminating them in the form of a configurable number of consecutive failed ping requests. In this context, the `PingPolicy` does not seem useful any longer.