use vyre_driver::backend::ErrorCode;
use vyre_driver::{BackendError, DeviceIdentity};
use vyre_foundation::diagnostics::RetryClass;
use crate::artifact_admission::{ArtifactSession, ArtifactSessionError};
#[must_use]
pub fn classify_backend_error(error: &BackendError) -> RetryClass {
match error.code() {
ErrorCode::DeviceLost => RetryClass::NewDevice,
ErrorCode::DeviceOutOfMemory | ErrorCode::PoisonedLock => RetryClass::SameDevice,
ErrorCode::UnsupportedFeature
| ErrorCode::KernelCompileFailed
| ErrorCode::InvalidProgram
| ErrorCode::CooperativeResidencyExceeded
| ErrorCode::DispatchFailed
| ErrorCode::Unknown => RetryClass::Never,
_ => RetryClass::Never,
}
}
pub fn recover_artifact_session(
session: &ArtifactSession,
failure: BackendError,
) -> Result<DeviceIdentity, ArtifactSessionError> {
if classify_backend_error(&failure) != RetryClass::NewDevice {
return Err(failure.into());
}
session.rematerialize()
}