early error on peer's failure to determine file size

This commit is contained in:
2025-11-12 22:29:00 +01:00
parent f2808192f7
commit d994e741b1
2 changed files with 61 additions and 3 deletions
+60 -3
View File
@@ -38,6 +38,45 @@ use crate::{
peer::{send_game_file_chunk, send_game_file_data}, peer::{send_game_file_chunk, send_game_file_data},
}; };
/// Custom error types for peer operations
#[derive(Debug)]
pub enum PeerError {
FileSizeDetermination {
path: String,
source: std::io::Error,
},
GameDirNotSet,
Other(eyre::Report),
}
impl std::fmt::Display for PeerError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PeerError::FileSizeDetermination { path, source } => {
write!(f, "Failed to determine file size for {path}: {source}")
}
PeerError::GameDirNotSet => write!(f, "Game directory not set"),
PeerError::Other(err) => write!(f, "General error: {err}"),
}
}
}
impl std::error::Error for PeerError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
PeerError::FileSizeDetermination { source, .. } => Some(source),
PeerError::Other(err) => Some(err.root_cause()),
PeerError::GameDirNotSet => None,
}
}
}
impl From<eyre::Report> for PeerError {
fn from(err: eyre::Report) -> Self {
PeerError::Other(err)
}
}
/// Initialize and start the peer system /// Initialize and start the peer system
/// This function replaces the main.rs entry point and allows the peer to be started from other crates /// This function replaces the main.rs entry point and allows the peer to be started from other crates
pub fn start_peer( pub fn start_peer(
@@ -1489,6 +1528,15 @@ async fn handle_peer_stream(
id, id,
file_descriptions, file_descriptions,
}, },
Err(PeerError::FileSizeDetermination { path, source }) => {
let error_msg = format!(
"Failed to determine file size for {path}: {source}"
);
log::error!(
"File size determination error for game {id}: {error_msg}"
);
Response::InternalPeerError(error_msg)
}
Err(e) => { Err(e) => {
log::error!( log::error!(
"Failed to get game file descriptions for {id}: {e}" "Failed to get game file descriptions for {id}: {e}"
@@ -1754,6 +1802,9 @@ async fn request_game_details_from_peer(
Response::GameNotFound(_) => { Response::GameNotFound(_) => {
eyre::bail!("peer {peer_addr} does not have game {game_id}") eyre::bail!("peer {peer_addr} does not have game {game_id}")
} }
Response::InternalPeerError(error_msg) => {
eyre::bail!("peer {peer_addr} reported internal error: {error_msg}")
}
_ => eyre::bail!("unexpected response from {peer_addr}: {response:?}"), _ => eyre::bail!("unexpected response from {peer_addr}: {response:?}"),
} }
} }
@@ -1855,12 +1906,15 @@ async fn ping_peer(peer_addr: SocketAddr) -> eyre::Result<bool> {
async fn get_game_file_descriptions( async fn get_game_file_descriptions(
game_id: &str, game_id: &str,
game_dir: &str, game_dir: &str,
) -> eyre::Result<Vec<GameFileDescription>> { ) -> Result<Vec<GameFileDescription>, PeerError> {
let base_dir = PathBuf::from(game_dir); let base_dir = PathBuf::from(game_dir);
let game_path = base_dir.join(game_id); let game_path = base_dir.join(game_id);
if !game_path.exists() { if !game_path.exists() {
eyre::bail!("Game directory does not exist: {}", game_path.display()); return Err(PeerError::Other(eyre::eyre!(
"Game directory does not exist: {}",
game_path.display()
)));
} }
let mut file_descriptions = Vec::new(); let mut file_descriptions = Vec::new();
@@ -1889,7 +1943,10 @@ async fn get_game_file_descriptions(
Ok(metadata) => metadata.len(), Ok(metadata) => metadata.len(),
Err(e) => { Err(e) => {
log::error!("Failed to read metadata for {relative_path}: {e}"); log::error!("Failed to read metadata for {relative_path}: {e}");
eyre::bail!("Failed to read metadata for {relative_path}: {e}"); return Err(PeerError::FileSizeDetermination {
path: relative_path.clone(),
source: e,
});
} }
} }
}; };
+1
View File
@@ -31,6 +31,7 @@ pub enum Response {
InvalidRequest(Bytes, String), InvalidRequest(Bytes, String),
EncodingError(String), EncodingError(String),
DecodingError(Bytes, String), DecodingError(Bytes, String),
InternalPeerError(String),
} }
// Add Message trait // Add Message trait