mirror of
https://github.com/instructkr/claw-code.git
synced 2026-06-05 22:17:10 +08:00
fix: wrap concurrent ENOENT as domain-specific session error (#112)
Session save_to_path now wraps ENOENT errors from rotate and atomic write with a clear "possible concurrent modification" message instead of surfacing raw OS errno. Helps operators debugging race conditions when multiple claw invocations touch the same session file. Generated with https://github.com/Yeachan-Heo/gajae-code Co-authored-by: Gajae Code <dev@gajae-code.com>
This commit is contained in:
@@ -231,8 +231,31 @@ impl Session {
|
||||
pub fn save_to_path(&self, path: impl AsRef<Path>) -> Result<(), SessionError> {
|
||||
let path = path.as_ref();
|
||||
let snapshot = self.render_jsonl_snapshot()?;
|
||||
rotate_session_file_if_needed(path)?;
|
||||
write_atomic(path, &snapshot)?;
|
||||
// #112: wrap ENOENT during rotate as concurrent modification
|
||||
match rotate_session_file_if_needed(path) {
|
||||
Ok(()) => {}
|
||||
Err(SessionError::Io(ref io_err)) if io_err.kind() == std::io::ErrorKind::NotFound => {
|
||||
return Err(SessionError::Io(std::io::Error::new(
|
||||
std::io::ErrorKind::NotFound,
|
||||
format!(
|
||||
"session file was removed during save (possible concurrent modification): {io_err}"
|
||||
),
|
||||
)));
|
||||
}
|
||||
Err(e) => return Err(e),
|
||||
}
|
||||
write_atomic(path, &snapshot).map_err(|e| {
|
||||
// #112: wrap ENOENT during write as concurrent modification
|
||||
match &e {
|
||||
SessionError::Io(io_err) if io_err.kind() == std::io::ErrorKind::NotFound => {
|
||||
SessionError::Io(std::io::Error::new(
|
||||
std::io::ErrorKind::NotFound,
|
||||
format!("session file was removed during write (possible concurrent modification): {io_err}"),
|
||||
))
|
||||
}
|
||||
_ => e,
|
||||
}
|
||||
})?;
|
||||
cleanup_rotated_logs(path)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user