From 44db5f44e3287f936754f5e8e4f4147079b56c51 Mon Sep 17 00:00:00 2001
From: Pierre Krieger <pierre.krieger1708@gmail.com>
Date: Sun, 24 Mar 2019 11:49:38 +0100
Subject: [PATCH] Directly connect if notice that ban has expired (#2100)

---
 .../src/custom_proto/behaviour.rs             | 34 ++++++++++++-------
 1 file changed, 21 insertions(+), 13 deletions(-)

diff --git a/substrate/core/network-libp2p/src/custom_proto/behaviour.rs b/substrate/core/network-libp2p/src/custom_proto/behaviour.rs
index 979273939d4..796ff32af16 100644
--- a/substrate/core/network-libp2p/src/custom_proto/behaviour.rs
+++ b/substrate/core/network-libp2p/src/custom_proto/behaviour.rs
@@ -332,15 +332,33 @@ impl<TMessage, TSubstream> CustomProto<TMessage, TSubstream> {
 		};
 
 		match mem::replace(occ_entry.get_mut(), PeerState::Poisoned) {
-			PeerState::Banned { until } => {
+			PeerState::Banned { ref until } if *until > Instant::now() => {
 				debug!(target: "sub-libp2p", "PSM => Connect({:?}): Will start to connect at \
 					until {:?}", occ_entry.key(), until);
 				*occ_entry.into_mut() = PeerState::PendingRequest {
-					timer: tokio_timer::Delay::new(until),
+					timer: tokio_timer::Delay::new(until.clone()),
 				};
 			},
 
-			PeerState::Disabled { open, connected_point, banned_until: None } => {
+			PeerState::Banned { .. } => {
+				debug!(target: "sub-libp2p", "PSM => Connect({:?}): Starting to connect", occ_entry.key());
+				debug!(target: "sub-libp2p", "Libp2p <= Dial {:?}", occ_entry.key());
+				self.events.push(NetworkBehaviourAction::DialPeer { peer_id: occ_entry.key().clone() });
+				*occ_entry.into_mut() = PeerState::Requested;
+			},
+
+			PeerState::Disabled { open, ref connected_point, banned_until: Some(ref banned) }
+				if *banned > Instant::now() => {
+				debug!(target: "sub-libp2p", "PSM => Connect({:?}): Has idle connection through \
+					{:?} but node is banned until {:?}", occ_entry.key(), connected_point, banned);
+				*occ_entry.into_mut() = PeerState::DisabledPendingEnable {
+					connected_point: connected_point.clone(),
+					open,
+					timer: tokio_timer::Delay::new(banned.clone()),
+				};
+			},
+
+			PeerState::Disabled { open, connected_point, banned_until: _ } => {
 				debug!(target: "sub-libp2p", "PSM => Connect({:?}): Enabling previously-idle \
 					connection through {:?}", occ_entry.key(), connected_point);
 				debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", occ_entry.key());
@@ -351,16 +369,6 @@ impl<TMessage, TSubstream> CustomProto<TMessage, TSubstream> {
 				*occ_entry.into_mut() = PeerState::Enabled { connected_point, open };
 			},
 
-			PeerState::Disabled { open, connected_point, banned_until: Some(banned) } => {
-				debug!(target: "sub-libp2p", "PSM => Connect({:?}): Has idle connection through \
-					{:?} but node is banned until {:?}", occ_entry.key(), connected_point, banned);
-				*occ_entry.into_mut() = PeerState::DisabledPendingEnable {
-					connected_point,
-					open,
-					timer: tokio_timer::Delay::new(banned),
-				};
-			},
-
 			PeerState::Incoming { connected_point, .. } => {
 				debug!(target: "sub-libp2p", "PSM => Connect({:?}): Enabling incoming \
 					connection through {:?}", occ_entry.key(), connected_point);
-- 
GitLab