mirror of
https://github.com/timvisee/lazymc.git
synced 2025-08-08 16:12:10 -07:00
Implement timeouts for various lobby client relaying stages
This commit is contained in:
55
src/lobby.rs
55
src/lobby.rs
@@ -45,6 +45,15 @@ const KEEP_ALIVE_ID: AtomicU64 = AtomicU64::new(0);
|
|||||||
/// Lobby clients may wait a maximum of 10 minutes for the server to come online.
|
/// Lobby clients may wait a maximum of 10 minutes for the server to come online.
|
||||||
const SERVER_WAIT_TIMEOUT: Duration = Duration::from_secs(10 * 60);
|
const SERVER_WAIT_TIMEOUT: Duration = Duration::from_secs(10 * 60);
|
||||||
|
|
||||||
|
/// Timeout for creating new server connection for lobby client.
|
||||||
|
const SERVER_CONNECT_TIMEOUT: Duration = Duration::from_secs(2 * 60);
|
||||||
|
|
||||||
|
/// Timeout for server sending join game packet.
|
||||||
|
///
|
||||||
|
/// When the play state is reached, the server should immeditely respond with a join game packet.
|
||||||
|
/// This defines the maximum timeout for waiting on it.
|
||||||
|
const SERVER_JOIN_GAME_TIMEOUT: Duration = Duration::from_secs(20);
|
||||||
|
|
||||||
/// Time to wait before responding to newly connected server.
|
/// Time to wait before responding to newly connected server.
|
||||||
///
|
///
|
||||||
/// Notchian servers are slow, we must wait a little before sending play packets, because the
|
/// Notchian servers are slow, we must wait a little before sending play packets, because the
|
||||||
@@ -524,12 +533,29 @@ async fn wait_for_server<'a>(server: Arc<Server>) -> Result<(), ()> {
|
|||||||
Err(())
|
Err(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create connection to the server.
|
/// Create connection to the server, with timeout.
|
||||||
|
///
|
||||||
|
/// This will initialize the connection to the play state. Client details are used.
|
||||||
|
async fn connect_to_server(
|
||||||
|
client_info: ClientInfo,
|
||||||
|
config: &Config,
|
||||||
|
) -> Result<(TcpStream, BytesMut), ()> {
|
||||||
|
time::timeout(
|
||||||
|
SERVER_CONNECT_TIMEOUT,
|
||||||
|
connect_to_server_no_timeout(client_info, config),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.map_err(|_| {
|
||||||
|
error!(target: "lazymc::lobby", "Creating new server connection for lobby client timed out after {}s", SERVER_CONNECT_TIMEOUT.as_secs());
|
||||||
|
()
|
||||||
|
})?
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create connection to the server, with no timeout.
|
||||||
///
|
///
|
||||||
/// This will initialize the connection to the play state. Client details are used.
|
/// This will initialize the connection to the play state. Client details are used.
|
||||||
// TODO: clean this up
|
// TODO: clean this up
|
||||||
// TODO: add timeout
|
async fn connect_to_server_no_timeout(
|
||||||
async fn connect_to_server(
|
|
||||||
client_info: ClientInfo,
|
client_info: ClientInfo,
|
||||||
config: &Config,
|
config: &Config,
|
||||||
) -> Result<(TcpStream, BytesMut), ()> {
|
) -> Result<(TcpStream, BytesMut), ()> {
|
||||||
@@ -621,13 +647,30 @@ async fn connect_to_server(
|
|||||||
Err(())
|
Err(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Wait for join game packet on server connection.
|
/// Wait for join game packet on server connection, with timeout.
|
||||||
|
///
|
||||||
|
/// This parses, consumes and returns the packet.
|
||||||
|
async fn wait_for_server_join_game(
|
||||||
|
outbound: &mut TcpStream,
|
||||||
|
buf: &mut BytesMut,
|
||||||
|
) -> Result<JoinGame, ()> {
|
||||||
|
time::timeout(
|
||||||
|
SERVER_JOIN_GAME_TIMEOUT,
|
||||||
|
wait_for_server_join_game_no_timeout(outbound, buf),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.map_err(|_| {
|
||||||
|
error!(target: "lazymc::lobby", "Waiting for for game data from server for lobby client timed out after {}s", SERVER_JOIN_GAME_TIMEOUT.as_secs());
|
||||||
|
()
|
||||||
|
})?
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Wait for join game packet on server connection, with no timeout.
|
||||||
///
|
///
|
||||||
/// This parses, consumes and returns the packet.
|
/// This parses, consumes and returns the packet.
|
||||||
// TODO: clean this up
|
// TODO: clean this up
|
||||||
// TODO: do not drop error here, return Box<dyn Error>
|
// TODO: do not drop error here, return Box<dyn Error>
|
||||||
// TODO: add timeout
|
async fn wait_for_server_join_game_no_timeout(
|
||||||
async fn wait_for_server_join_game(
|
|
||||||
outbound: &mut TcpStream,
|
outbound: &mut TcpStream,
|
||||||
buf: &mut BytesMut,
|
buf: &mut BytesMut,
|
||||||
) -> Result<JoinGame, ()> {
|
) -> Result<JoinGame, ()> {
|
||||||
|
Reference in New Issue
Block a user