diff --git a/programs/fileio.c b/programs/fileio.c index 55c87313d..cf4ae6dbd 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -1070,6 +1070,17 @@ enum { FIO_RUST_COMPRESS_ZSTD_UNSUPPORTED = 4 }; +enum { + FIO_RUST_COMPRESS_DIAGNOSTIC_OK = 0, + FIO_RUST_COMPRESS_DIAGNOSTIC_GZIP_UNSUPPORTED = 1, + FIO_RUST_COMPRESS_DIAGNOSTIC_LZMA_UNSUPPORTED = 2, + FIO_RUST_COMPRESS_DIAGNOSTIC_LZ4_UNSUPPORTED = 3, + FIO_RUST_COMPRESS_DIAGNOSTIC_ZSTD_UNSUPPORTED = 4, + FIO_RUST_COMPRESS_DIAGNOSTIC_UNKNOWN = 5 +}; + +int FIO_rust_compressFilenameDiagnostic(int status); + typedef unsigned long long (*FIO_rust_compress_zstd_fn)( void* fCtx, void* prefs, void* ress, const char* srcFileName, U64 srcFileSize, @@ -3005,6 +3016,7 @@ FIO_compressFilename_internal(FIO_ctx_t* const fCtx, U64 const fileSize = UTIL_getFileSize(srcFileName); FIO_rust_compress_callbacks_t callbacks; int status; + int diagnostic; memset(&callbacks, 0, sizeof(callbacks)); callbacks.opaque = &displayCtx; @@ -3025,19 +3037,20 @@ FIO_compressFilename_internal(FIO_ctx_t* const fCtx, fCtx, prefs, &ress, dstFileName, srcFileName, fileSize, compressionLevel, &callbacks); - switch (status) { - case FIO_RUST_COMPRESS_OK: + diagnostic = FIO_rust_compressFilenameDiagnostic(status); + switch (diagnostic) { + case FIO_RUST_COMPRESS_DIAGNOSTIC_OK: return 0; - case FIO_RUST_COMPRESS_GZIP_UNSUPPORTED: + case FIO_RUST_COMPRESS_DIAGNOSTIC_GZIP_UNSUPPORTED: EXM_THROW(20, "zstd: %s: file cannot be compressed as gzip (zstd compiled without ZSTD_GZCOMPRESS) -- ignored \n", srcFileName); - case FIO_RUST_COMPRESS_LZMA_UNSUPPORTED: + case FIO_RUST_COMPRESS_DIAGNOSTIC_LZMA_UNSUPPORTED: EXM_THROW(20, "zstd: %s: file cannot be compressed as xz/lzma (zstd compiled without ZSTD_LZMACOMPRESS) -- ignored \n", srcFileName); - case FIO_RUST_COMPRESS_LZ4_UNSUPPORTED: + case FIO_RUST_COMPRESS_DIAGNOSTIC_LZ4_UNSUPPORTED: EXM_THROW(20, "zstd: %s: file cannot be compressed as lz4 (zstd compiled without ZSTD_LZ4COMPRESS) -- ignored \n", srcFileName); - case FIO_RUST_COMPRESS_ZSTD_UNSUPPORTED: + case FIO_RUST_COMPRESS_DIAGNOSTIC_ZSTD_UNSUPPORTED: default: assert(status == FIO_RUST_COMPRESS_ZSTD_UNSUPPORTED); EXM_THROW(20, "zstd: %s: file cannot be compressed as zstd -- ignored \n", diff --git a/rust/src/fileio_asyncio.rs b/rust/src/fileio_asyncio.rs index 726a2becd..225c79e39 100644 --- a/rust/src/fileio_asyncio.rs +++ b/rust/src/fileio_asyncio.rs @@ -250,6 +250,27 @@ pub const FIO_RUST_COMPRESS_LZMA_UNSUPPORTED: c_int = 2; pub const FIO_RUST_COMPRESS_LZ4_UNSUPPORTED: c_int = 3; pub const FIO_RUST_COMPRESS_ZSTD_UNSUPPORTED: c_int = 4; +pub const FIO_RUST_COMPRESS_DIAGNOSTIC_OK: c_int = 0; +pub const FIO_RUST_COMPRESS_DIAGNOSTIC_GZIP_UNSUPPORTED: c_int = 1; +pub const FIO_RUST_COMPRESS_DIAGNOSTIC_LZMA_UNSUPPORTED: c_int = 2; +pub const FIO_RUST_COMPRESS_DIAGNOSTIC_LZ4_UNSUPPORTED: c_int = 3; +pub const FIO_RUST_COMPRESS_DIAGNOSTIC_ZSTD_UNSUPPORTED: c_int = 4; +pub const FIO_RUST_COMPRESS_DIAGNOSTIC_UNKNOWN: c_int = 5; + +/// Classifies the aggregate compression-selector result while leaving the +/// format-specific exception text and fallback assertion in C. +#[no_mangle] +pub extern "C" fn FIO_rust_compressFilenameDiagnostic(status: c_int) -> c_int { + match status { + FIO_RUST_COMPRESS_OK => FIO_RUST_COMPRESS_DIAGNOSTIC_OK, + FIO_RUST_COMPRESS_GZIP_UNSUPPORTED => FIO_RUST_COMPRESS_DIAGNOSTIC_GZIP_UNSUPPORTED, + FIO_RUST_COMPRESS_LZMA_UNSUPPORTED => FIO_RUST_COMPRESS_DIAGNOSTIC_LZMA_UNSUPPORTED, + FIO_RUST_COMPRESS_LZ4_UNSUPPORTED => FIO_RUST_COMPRESS_DIAGNOSTIC_LZ4_UNSUPPORTED, + FIO_RUST_COMPRESS_ZSTD_UNSUPPORTED => FIO_RUST_COMPRESS_DIAGNOSTIC_ZSTD_UNSUPPORTED, + _ => FIO_RUST_COMPRESS_DIAGNOSTIC_UNKNOWN, + } +} + const FIO_ZSTD_COMPRESSION: c_int = 0; const FIO_GZIP_COMPRESSION: c_int = 1; const FIO_XZ_COMPRESSION: c_int = 2; @@ -5438,6 +5459,38 @@ mod tests { } } + #[test] + fn aggregate_compression_status_diagnostic_preserves_format_mapping() { + for (status, diagnostic) in [ + (FIO_RUST_COMPRESS_OK, FIO_RUST_COMPRESS_DIAGNOSTIC_OK), + ( + FIO_RUST_COMPRESS_GZIP_UNSUPPORTED, + FIO_RUST_COMPRESS_DIAGNOSTIC_GZIP_UNSUPPORTED, + ), + ( + FIO_RUST_COMPRESS_LZMA_UNSUPPORTED, + FIO_RUST_COMPRESS_DIAGNOSTIC_LZMA_UNSUPPORTED, + ), + ( + FIO_RUST_COMPRESS_LZ4_UNSUPPORTED, + FIO_RUST_COMPRESS_DIAGNOSTIC_LZ4_UNSUPPORTED, + ), + ( + FIO_RUST_COMPRESS_ZSTD_UNSUPPORTED, + FIO_RUST_COMPRESS_DIAGNOSTIC_ZSTD_UNSUPPORTED, + ), + ] { + assert_eq!(FIO_rust_compressFilenameDiagnostic(status), diagnostic); + } + + for status in [-1, 99] { + assert_eq!( + FIO_rust_compressFilenameDiagnostic(status), + FIO_RUST_COMPRESS_DIAGNOSTIC_UNKNOWN + ); + } + } + const SOURCE_POLICY_STAT: u8 = 1; const SOURCE_POLICY_EXCLUDED: u8 = 2; const SOURCE_POLICY_OPEN: u8 = 3;