Skip to content

Commit c4c211b

Browse files
Fix connection load (#60)
1 parent 18d02f0 commit c4c211b

2 files changed

Lines changed: 32 additions & 6 deletions

File tree

scripts/network/init.sh

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@ berserker -c /etc/berserker/network-server.toml &
1010

1111
SERVER_PID=$!
1212

13+
sleep 1
14+
1315
berserker -c /etc/berserker/network-client.toml &
1416

1517
CLIENT_PID=$!
1618

1719
cleanup() {
1820
echo "Killing client ($CLIENT_PID) and server ($SERVER_PID)"
1921

20-
kill -9 "$CLIENT_PID"
21-
kill -9 "$SERVER_PID"
22+
kill -9 "$CLIENT_PID" 2>/dev/null
23+
kill -9 "$SERVER_PID" 2>/dev/null
2224

2325
exit
2426
}
2527

26-
trap cleanup SIGINT SIGABRT
28+
trap cleanup SIGINT SIGABRT SIGTERM
2729

28-
wait -n "$SERVER_PID" "$CLIENT_PID"
30+
wait "$SERVER_PID" "$CLIENT_PID"

src/worker/network.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ use std::str;
88
use std::time::{SystemTime, UNIX_EPOCH};
99
use std::{
1010
fmt::Display,
11+
io,
1112
io::{BufReader, prelude::*},
1213
net::TcpListener,
1314
thread,
15+
time::Duration,
1416
};
1517

1618
use crate::{BaseConfig, Worker, WorkerError, Workload, WorkloadConfig};
@@ -37,6 +39,29 @@ impl NetworkWorker {
3739
}
3840
}
3941

42+
fn bind_port(
43+
&self,
44+
addr: Ipv4Address,
45+
target_port: u16,
46+
) -> Result<TcpListener, WorkerError> {
47+
const MAX_BIND_RETRIES: usize = 30;
48+
let addr = addr.to_string();
49+
for _ in 0..MAX_BIND_RETRIES {
50+
match TcpListener::bind((addr.as_str(), target_port)) {
51+
Ok(l) => return Ok(l),
52+
Err(e) if e.kind() == io::ErrorKind::AddrInUse => {
53+
thread::sleep(Duration::from_secs(1));
54+
}
55+
Err(e) => panic!("Failed to bind: {}", e),
56+
}
57+
}
58+
59+
Err(WorkerError::InternalWithMessage(format!(
60+
"Failed to bind {}:{} after {} retries: address in use",
61+
addr, target_port, MAX_BIND_RETRIES
62+
)))
63+
}
64+
4065
/// Start a simple server. The client side is going to be a networking
4166
/// worker as well, so for convenience of troubleshooting do not error
4267
/// out if something unexpected happened, log and proceed instead.
@@ -47,8 +72,7 @@ impl NetworkWorker {
4772
) -> Result<(), WorkerError> {
4873
debug!("Starting server at {:?}:{:?}", addr, target_port);
4974

50-
let listener =
51-
TcpListener::bind((addr.to_string(), target_port)).unwrap();
75+
let listener = self.bind_port(addr, target_port)?;
5276

5377
for stream in listener.incoming() {
5478
let mut stream = stream.unwrap();

0 commit comments

Comments
 (0)