Skip to content

Commit fe0d7b0

Browse files
committed
p2p: improve pending_inbound_connections_limit test
1 parent 5b36fc3 commit fe0d7b0

2 files changed

Lines changed: 46 additions & 15 deletions

File tree

p2p/src/tests/helpers/test_node.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@ where
377377
}
378378

379379
pub async fn wait_for_next_pending_peer_creation_in_backend(&mut self) -> PeerId {
380+
log::debug!("Waiting for next pending peer creation in backend");
381+
380382
loop {
381383
if let BackendNotification::PendingPeerCreated { peer_id } =
382384
self.backend_notification_receiver.recv().await.unwrap()
@@ -390,6 +392,8 @@ where
390392
&mut self,
391393
expected_peer_id: PeerId,
392394
) {
395+
log::debug!("Waiting for next pending peer removal in backend");
396+
393397
loop {
394398
if let BackendNotification::PendingPeerRemoved { peer_id } =
395399
self.backend_notification_receiver.recv().await.unwrap()

p2p/src/tests/pending_inbound_connections_limit.rs

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,18 @@
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

1818
use rstest::rstest;
1919

2020
use chainstate::ChainstateConfig;
2121
use common::primitives::user_agent::mintlayer_core_user_agent;
22+
use logging::log;
2223
use 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
};
2829
use p2p_test_utils::{SHORT_TIMEOUT, run_with_timeout};
2930
use 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

Comments
 (0)