1313// See the License for the specific language governing permissions and
1414// limitations under the License.
1515
16- use std:: sync:: Arc ;
16+ use std:: { sync:: Arc , time :: Duration } ;
1717
1818use rstest:: rstest;
1919
2020use chainstate:: ChainstateConfig ;
2121use common:: primitives:: user_agent:: mintlayer_core_user_agent;
22+ use logging:: log;
2223use networking:: {
2324 test_helpers:: {
2425 TestTransportChannel , TestTransportMaker , TestTransportNoise , TestTransportTcp ,
2526 } ,
26- transport:: { TransportSocket , new_message_stream} ,
27+ transport:: { TransportListener as _ , TransportSocket , new_message_stream} ,
2728} ;
2829use p2p_test_utils:: { SHORT_TIMEOUT , run_with_timeout} ;
2930use randomness:: RngExt as _;
@@ -49,17 +50,18 @@ where
4950 let mut rng = make_seedable_rng ( seed) ;
5051
5152 let max_pending_inbound_connections = 5 ;
52- let good_peers_count = rng. random_range ( 1 ..=3 ) ;
53+ let good_inbound_peers_count = rng. random_range ( 1 ..=3 ) ;
5354
5455 let time_getter = BasicTestTimeGetter :: new ( ) ;
5556 let chain_config = Arc :: new ( common:: chain:: config:: create_unit_test_config ( ) ) ;
5657
5758 let p2p_config = Arc :: new ( P2pConfig {
5859 backend_config : BackendConfig {
5960 max_pending_inbound_connections : max_pending_inbound_connections. into ( ) ,
61+ // Make sure pending connections don't time out during the test.
62+ peer_handshake_timeout : Duration :: from_secs ( 3600 ) . into ( ) ,
6063
6164 outbound_connection_timeout : Default :: default ( ) ,
62- peer_handshake_timeout : Default :: default ( ) ,
6365 disconnection_timeout : Default :: default ( ) ,
6466 socket_write_timeout : Default :: default ( ) ,
6567 } ,
@@ -101,10 +103,11 @@ where
101103
102104 let peer_time = P2pTimestamp :: from_time ( time_getter. get_time_getter ( ) . get_time ( ) ) ;
103105
104- let mut pending_peers_readers_writers = Vec :: new ( ) ;
106+ let mut pending_inbound_peers_readers_writers = Vec :: new ( ) ;
105107
106108 // A `max_pending_inbound_connections` number of inbound peers connect, but don't initiate
107109 // the handshake. Each peer is registered as pending.
110+ log:: debug!( "Adding the first batch of inbound peers" ) ;
108111 for _ in 0 ..max_pending_inbound_connections {
109112 let stream = transport. connect ( test_node. local_address ( ) . socket_addr ( ) ) . await . unwrap ( ) ;
110113 let ( msg_reader, msg_writer) = new_message_stream :: < _ , Message > (
@@ -113,13 +116,14 @@ where
113116 ) ;
114117 let peer_id = test_node. wait_for_next_pending_peer_creation_in_backend ( ) . await ;
115118
116- pending_peers_readers_writers . push ( ( peer_id, msg_reader, msg_writer) ) ;
119+ pending_inbound_peers_readers_writers . push ( ( peer_id, msg_reader, msg_writer) ) ;
117120 }
118121
119122 test_node. assert_no_pending_peer_removal_in_backend ( ) . await ;
120123
121124 // A few more inbound peers attempt to connect. These are not registered as pending and are
122125 // dropped immediately because the limit for pending peers has been reached.
126+ log:: debug!( "Adding the second batch of inbound peers" ) ;
123127 for _ in 0 ..3 {
124128 let stream = transport. connect ( test_node. local_address ( ) . socket_addr ( ) ) . await . unwrap ( ) ;
125129 let ( mut msg_reader, _) = new_message_stream :: < _ , Message > (
@@ -134,14 +138,35 @@ where
134138 . unwrap_err ( ) ;
135139 }
136140
137- let mut good_peers_readers_writers = Vec :: new ( ) ;
141+ let mut outbound_peers_data = Vec :: new ( ) ;
142+
143+ // Sanity check: outbound connections still create pending peers. This will also ensure
144+ // that the presence of pending outbound peers has no effect on the pending inbound peer
145+ // limiting.
146+ log:: debug!( "Adding outbound peers" ) ;
147+ for _ in 0 ..rng. random_range ( 1 ..=3 ) {
148+ let mut listener = transport. bind ( vec ! [ TTM :: make_address( ) ] ) . await . unwrap ( ) ;
149+ let connect_result_receiver =
150+ test_node. start_connecting ( listener. local_addresses ( ) . unwrap ( ) [ 0 ] . into ( ) ) ;
151+ let ( stream, _) = listener. accept ( ) . await . unwrap ( ) ;
152+ let _peer_id = test_node. wait_for_next_pending_peer_creation_in_backend ( ) . await ;
153+
154+ // Avoid dropping the stream and the result receiver to ensure that the peer stays pending.
155+ outbound_peers_data. push ( ( stream, connect_result_receiver) ) ;
156+ }
157+
158+ test_node. assert_no_pending_peer_removal_in_backend ( ) . await ;
159+
160+ let mut good_inbound_peers_readers_writers = Vec :: new ( ) ;
138161
139- // A few of the pending peers decide to initiate the handshake, after which they're no longer pending.
140- for _ in 0 ..good_peers_count {
141- let peer_idx = rng. random_range ( 0 ..pending_peers_readers_writers. len ( ) ) ;
162+ // A few of the pending inbound peers decide to initiate the handshake, after which they're
163+ // no longer pending.
164+ log:: debug!( "Good inbound peers initiate handshake" ) ;
165+ for _ in 0 ..good_inbound_peers_count {
166+ let peer_idx = rng. random_range ( 0 ..pending_inbound_peers_readers_writers. len ( ) ) ;
142167
143168 let ( peer_id, mut msg_reader, mut msg_writer) =
144- pending_peers_readers_writers . remove ( peer_idx) ;
169+ pending_inbound_peers_readers_writers . remove ( peer_idx) ;
145170
146171 msg_writer
147172 . send ( Message :: Handshake ( HandshakeMessage :: Hello {
@@ -163,24 +188,26 @@ where
163188 test_node. wait_for_next_pending_peer_removal_in_backend ( peer_id) . await ;
164189
165190 // Don't drop the readers/writers to make sure the peer continues to exist.
166- good_peers_readers_writers . push ( ( peer_id, msg_reader, msg_writer) ) ;
191+ good_inbound_peers_readers_writers . push ( ( peer_id, msg_reader, msg_writer) ) ;
167192 }
168193
169- // Since `good_peers_count ` peers are no longer pending, the node will accept this number
194+ // Since `good_inbound_peers_count ` peers are no longer pending, the node will accept this number
170195 // of new peers and they will be registered as pending.
171- for _ in 0 ..good_peers_count {
196+ log:: debug!( "Adding the third batch of inbound peers" ) ;
197+ for _ in 0 ..good_inbound_peers_count {
172198 let stream = transport. connect ( test_node. local_address ( ) . socket_addr ( ) ) . await . unwrap ( ) ;
173199 let ( msg_reader, msg_writer) = new_message_stream :: < _ , Message > (
174200 stream,
175201 Some ( * p2p_config. protocol_config . max_message_size ) ,
176202 ) ;
177203 let peer_id = test_node. wait_for_next_pending_peer_creation_in_backend ( ) . await ;
178204
179- pending_peers_readers_writers . push ( ( peer_id, msg_reader, msg_writer) ) ;
205+ pending_inbound_peers_readers_writers . push ( ( peer_id, msg_reader, msg_writer) ) ;
180206 }
181207
182208 // A few more inbound peers attempt to connect. These are not registered as pending and are
183209 // dropped immediately because the limit for pending peers has been reached again.
210+ log:: debug!( "Adding the fourth batch of inbound peers" ) ;
184211 for _ in 0 ..3 {
185212 let stream = transport. connect ( test_node. local_address ( ) . socket_addr ( ) ) . await . unwrap ( ) ;
186213 let ( mut msg_reader, _) = new_message_stream :: < _ , Message > (
0 commit comments